【问题标题】:Neighbours, duplicates and aggregation with Cypher & Neo4j使用 Cypher 和 Neo4j 进行邻居、重复和聚合
【发布时间】:2015-09-15 15:44:54
【问题描述】:

也许我需要花更多时间阅读 Cypher 文档,但使用以下密码查询:

MATCH (a)-[:friends|colleagues]-(b)
WHERE 'Boston' IN a.lived_in and 'Boston' IN b.lived_in
WITH a, count(b) as c
RETURN a.name, c

为什么 b 包含重复项?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    [:friends|colleagues] 表示“查找所有friendcolleague 关系”。

    因为节点 a 既可以是朋友又可以是另一个节点 b 的同事(反之亦然,因为您的查询是非定向的),所以查询可以为任何给定的节点对找到多个结果行.

    当您在a 上聚合(使用COUNT())时,默认情况下,聚合中包含所有重复的b 节点。

    如果您只想计算b 的不同结果,可以使用DISTINCT 关键字,如下所示(我还通过删除不必要的WITH 子句来简化查询):

    MATCH (a)-[:friends|colleagues]-(b)
    WHERE 'Boston' IN a.lived_in AND 'Boston' IN b.lived_in
    RETURN a.name, COUNT(DISTINCT b) AS c;
    

    【讨论】:

    • 谢谢,现在更有意义了。我实际上使用 WITH 查询是为了过滤掉重复项(在原始查询中),使用 WITH collect(distinct b) as b。有更好的方法吗?
    • 如果你想返回不同b节点的collection,那么你可以在我的查询中使用COLLECT而不是COUNT。不是WITH 是必需的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多