2017-02-14 71 views
0

我一直试图根据节点查询来获取子图。 查询只要应该忽略的关系方向,因为所有在子图中的节点的连接: 例如: U1 -FRIEND-> U2 -FRIEND-> U3 U4 -FRIEND-> U5 -FRIEND-> U6Neo4j读取没有重复的所有子图Cypher查询

搜索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

这个查询应该工作:

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)创建索引以获得更好的性能。

+0

这是正确的方法,但如果您的子图很大并且您看到性能命中,您可能会发现[APOC的路径扩展器](http://stackoverflow.com/a/42227632/92359)效率更高当扩展以匹配子图中的节点时,可变长度模式匹配。 – InverseFalcon

+0

感谢@cybersam - 像魅力一样工作。 也,谢谢你的指数提示。 – user2405864

+0

不客气。请记住[接受](http://meta.stackexchange.com/q/5234/255960)最能回答您问题的答案。 – cybersam