我一直在尝试获得一个基于节点查询的子图。只要子图中的所有节点都连接,查询就应该忽略关系方向:例如:u1-朋友->u2-朋友->u3u4-朋友->u5-朋友->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]...
如何区分不同的集合以只返回一个排列?
我还想支持一个用户可以在不同的子图中的情况,所以响应应该是几个子图。
感谢
此查询应该有效:
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)
创建一个索引。