Neo4j读取所有子图而不重复Cypher查询
我一直在尝试基于节点查询获取子图。 只要子图中的所有节点都已连接,查询就应忽略关系方向: 前任: u1-朋友->u2-朋友->u3 u4-朋友->u5-朋友->u6 搜索u1、u2或u3时,应返回一组:[u1、u2、u3] 我使用了以下密码查询:Neo4j读取所有子图而不重复Cypher查询,neo4j,cypher,Neo4j,Cypher,我一直在尝试基于节点查询获取子图。 只要子图中的所有节点都已连接,查询就应忽略关系方向: 前任: u1-朋友->u2-朋友->u3 u4-朋友->u5-朋友->u6 搜索u1、u2或u3时,应返回一组:[u1、u2、u3] 我使用了以下密码查询: MATCH (a:User)-[:FRIEND_OF*0..]-(b) WHERE a.userId = 'some_id' WITH a, collect(DISTINCT b) AS sets RETURN DISTINCT sets 问题是我得
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]...
如何区分不同的集合以仅返回一个排列
我还想支持一种情况,用户可以在不同的子图中,因此响应应该是两个子图
谢谢此查询应该可以:
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)
创建一个索引,以获得更好的性能。这是正确的方法,但是如果您的子图很大,并且您看到的是性能影响,当扩展以匹配子图中的节点时,您可能会发现比可变长度模式匹配更有效。Thank@cybersam-工作起来很有魅力。另外,谢谢你的索引提示。不客气。请记住最好回答你问题的答案。