2017-02-14 77 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