【问题标题】:Cypher query to exclude results based upon relationship type密码查询以根据关系类型排除结果
【发布时间】:2013-03-10 20:33:10
【问题描述】:

我是 Cypher 的新手,正在尝试弄清楚在某些情况下如何从查询中排除节点。

该图由朋友(me-[friend]-person)和朋友的朋友关系(me-[fof]-person)组成

我需要找到所有朋友的朋友关系(很容易),但排除那些也是“朋友”的朋友的朋友

我认为我可以做到:

START me=node(0)           
MATCH me-[r:fof]->fof, me-[f?:friend]->fof           
WHERE f is null and NOT(r is null)
and ... [other filters]

但这似乎是获取不是朋友的朋友的错误方法。

建议?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    你可以在WHERE子句中根据已有的关系进行过滤,当然你也可以使用NOT来否定任何条件:

    START me=node(0)           
    MATCH me-[r:fof]->fof
    WHERE NOT(me-[:friend]->fof)
    and ... [other filters]
    

    【讨论】:

    • 这是最简单的,处理时间最短。谢谢!
    【解决方案2】:

    为什么要使用两种关系类型:朋友和 fof?您可以使用一种关系(即朋友)对整个朋友图进行建模,然后按 MATCH (me)-[:friend*2..]->(friend) 之类的深度过滤,这是任何深度的朋友的朋友或 MATCH (me)- [:friend*2..2]->(friend) 仅用于朋友的朋友

    【讨论】:

    • 我有朋友的朋友关系的属性,我需要过滤/订购。我没有看到一种方法可以在两个节点之间进行任何程度的分离〜但我很想在这个问题上被证明是错误的:)
    • 嗯,你需要什么属性和过滤/排序?
    【解决方案3】:

    这只是一个信息答案,因为@ean5533 已经提供了答案。

    如果速度真的很重要,你可以尝试为所有情况创建一个新的关系类型fof2,在这种情况下你真的是朋友的朋友,但不是直接的朋友:

    start n=node(*) 
    match n-[:fof]-friend
    where not(n-[:friend]-friend)
    create unique n-[:fof2]-friend;
    

    使用以下方式查询真正陌生的朋友会更快:

    start n=node(0)
    match p=n-[:fof2]-friend
    return p;
    

    【讨论】:

    • 有趣。虽然我同意@ean5533 的回答解决了眼前的问题,并且不需要维护另一种关系类型。
    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2021-11-17
    相关资源
    最近更新 更多