【问题标题】:Finding only nodes that have more than one incoming relationship in neo4j using cypherquery使用 cypherquery 在 neo4j 中仅查找具有多个传入关系的节点
【发布时间】:2015-06-30 12:48:35
【问题描述】:

我有一个 neo4j 数据库来学习这种新奇的图形技术,并且我按照这种结构制作了节点

(n:NewsArticle) -[r:about_place]-> (l:Location)

现在我想要的有点复杂/令人费解(或者我似乎认为是这样),并且对 cypher 不熟悉,我无法用这种新语法完全表达自己。请多多包涵。

基本上我的文章标记有很多位置。现在,在某一天,我找到了所有标记有某个位置的文章。一旦我有了它们,现在对于那些文章,我想找出它们被标记的其他位置。

这段代码似乎做了我想要的。 (耶)

MATCH (n:NewsArticle{date:"Jun-30-2015"})-[]->(l:Location{name:"India"})
MATCH (n:NewsArticle)-[r:about_place]->(m:Location)
return n,m

在这一点上,我最终得到了 8 个位置和 132 篇新闻文章。

现在是棘手的部分。在我拥有的 132 篇文章中,大多数文章的 about_place 关系仅指向 8 个位置中的 1 个, 我不想要这个。我想在这个集合中找到与我找到的至少 2 个位置有关系的文章。

我想出了这个查询,

MATCH (n:NewsArticle{date:"Jun-30-2015"})-[]->(l:Location{name:"India"})
MATCH (n:NewsArticle)-[r:about_place]->(m:Location)
WITH m, count(r) as rel_cnt
WHERE rel_cnt > 2
MATCH (a:NewsArticle{date:"Jun-30-2015"})-[r:about_place]->(m:Location)
return a,m

它确实给了我一些结果,但它并没有达到我想要的效果。但是如果我将 a 更改为 n (参考前 2 个匹配语句),它会变成一个语法错误,尽管我觉得它应该给我想要的结果.

tl;dr 我不想看到只有一篇新闻文章指向它们的位置节点

【问题讨论】:

    标签: graph neo4j cypher


    【解决方案1】:

    此查询应返回具有“Jun-30-2015”的date 属性的所有NewsArticle 节点,这些节点与Location India 和至少一个其他位置具有:about_place 关系:

    MATCH (n:NewsArticle {date:"Jun-30-2015"})-[:about_place]->(:Location {name: "India"})
    MATCH (n)-[r:about_place]->(l:Location)
    WITH collect(n) AS articles, l, count(r) AS num WHERE num > 2
    RETURN l, articles, num
    

    【讨论】:

    • 如果 i RETURN n,l 最后给我一个错误(l 未定义?)。我想查看所有满足条件的位置节点以及文章节点。
    • WITH 命令会清除WITH 语句中未指明的任何变量,因此如果您还想返回位置,您可以再次匹配它们,如@ErnestoE 显示的答案,或添加类似于COLLECT(l) as locations 到上面的WITH 语句。
    • 如果您可以编辑您的答案以显示收藏,我会接受它是正确的 - 您可以从下面的答案中复制查询 - 不过是您的答案向我展示了方式。所以我宁愿接受你的回答也不愿接受我的回答
    • 编辑:添加 collect 语句以包含 acticles 的集合
    【解决方案2】:

    试试:

    MATCH (n:NewsArticle {date:"Jun-30-2015"})-[:about_place]->(:Location {name: "India"})
    MATCH (n)-[r:about_place]->(l:Location)
    WITH n, count(r) as num 
    WHERE num > 2
    MATCH (n)-[:about_place]->(l:Location)
    RETURN n, l
    

    您可能希望从结果中排除原始位置,因为您需要在最终返回之前添加一个额外的过滤器。

    【讨论】:

      【解决方案3】:

      发现答案是 collect() 语句,它允许您通过 WITH 管道携带变量。

      MATCH (n:NewsArticle{date:"Jun-30-2015"})-[:about_place]->(l:Location{name:"India"})
      MATCH (n:NewsArticle)-[r:about_place]->(loc:Location)
      WITH loc,collect(n) as article, count(r) as num WHERE num > 2
      RETURN loc,article
      

      【讨论】:

        猜你喜欢
        • 2014-05-24
        • 2016-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多