Neo4j读取所有子图而不重复Cypher查询

时间:2017-02-14 16:34:24

标签: neo4j cypher

我一直试图根据节点查询获取子图。 只要子图中的所有节点都连接,查询就应该忽略关系方向: 例如: u1 -FRIEND-> u2 -FRIEND-> 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]...

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

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

感谢

1 个答案:

答案 0 :(得分: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)创建索引以获得更好的效果。