【问题标题】:How to find nodes related to X and count how many of them are related to Y如何找到与 X 相关的节点并计算其中有多少与 Y 相关
【发布时间】:2013-11-07 17:26:45
【问题描述】:

我的数据库包含人员和事件作为节点。一个人可以 :KNOW 另一个人、:CREATE 或 :ATTEND 一个事件。

从查询人开始,我想收到我认识的人创建的所有事件的列表,参加活动的人数(如果有的话),以及我认识的参加此活动的人数(如果有的)。

所以我的结果应该是这样的:

活动     |计数(参加)|计数(参加的朋友)

事件 A             9                                  3
事件 B              3                                 0
事件 C              0                                 0

我得到事件和计数(参加)

START me=node(1)  
MATCH (me)-[:KNOWS]-(creator)-[:CREATED]-(event), (Attender)-[?:ATTEND]-(event)  
RETURN event, count(Attender)

[?:ATTEND] 是可选的,因为它会消除没有参加者的活动。

但是,我不知道如何查询我认识的有多少人参加了活动(也就是有多少朋友会参加)。

问题是,如果没有我认识的参加者,使用 Match 会消除找到的事件:

WITH n, event  
MATCH (n)-[:KNOWS]-(friend)-[:ATTEND]-(event)

将这些关系设为可选并没有帮助,因为它要么返回所有参与者,要么返回所有朋友。

拆分查询会给我几个相同事件的列表。

如何在一个结果集中与正在参加的朋友一起举办有参加者和没有参加者的活动?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    要不给“参加者”的收藏加个过滤器,让朋友参加者喜欢这样,

    START me=node(1)  
    MATCH (me)-[:KNOWS]-(creator)-[:CREATED]-(event), (Attender)-[?:ATTEND]-(event)
    With event as e, collect(Attender) as attenders, me
    Return e, length(attenders), length(filter(x in attenders where (me)-[:KNOWS]->x))
    

    【讨论】:

    • 工作得很好,在 (filter(x in Attenders where (me)-[:KNOWS]-(x))) 中缺少两个括号,并且 KNOWS 关系是无向的。谢谢!
    猜你喜欢
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多