【问题标题】:Neo4j read all subgraphs without duplications Cypher queryNeo4j 读取所有没有重复的子图 Cypher 查询
【发布时间】:2017-02-14 16:34:23
【问题描述】:

我一直在尝试根据节点查询获取子图。 只要子图中的所有节点都连接,查询就应该忽略关系方向: 前任: u1-朋友-> u2-朋友-> u3 u4 -FRIEND-> u5 -FRIEND-> u6

搜索 u1 或 u2 或 u3,应返回一组:[u1,u2,u3]

我使用了以下 Cypher 查询:

MATCH (a:User)-[:FRIEND_OF*0..]-(b)
WHERE a.userId = 'some_id'
WITH a, collect(DISTINCT b) AS sets
RETURN DISTINCT sets

问题是我得到了所有集合的排列,例如:

DATA: u1 -FRIEND-> u2 -FRIEND-> u3
RETURN: [u1,u2,u3],[u1,u3,u2],[u2,u1,u3]...

如何区分不同的集合以仅返回一个排列?

我也想支持一个用户可以在不同子图中的情况,因此响应应该是几个子图。

谢谢

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这个查询应该可以工作:

    MATCH p=(a:User)-[:FRIEND_OF*0..]-(b)
    WHERE a.userId = 'some_id'
    WITH DISTINCT a, b
    ORDER BY ID(b)
    WITH a, COLLECT(b) AS sets
    RETURN DISTINCT sets;
    

    它得到不同的 a/b 对,按原生 ID 对 b 节点进行排序,将排序后的节点放入集合中,最后返回不同的集合。

    您可能希望为:User(userId) 创建索引以获得更好的性能。

    【讨论】:

    • 这是正确的方法,但如果您的子图很大并且您看到性能下降,您可能会发现APOC's path expander 在扩展以匹配节点时比可变长度模式匹配更有效在子图中。
    • 感谢@cybersam - 就像一个魅力。另外,感谢您提供索引提示。
    • 不客气。请记住最能回答您问题的答案Accept
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多