2015-11-05 64 views
1

如果我有一個neo4j數據庫,並且我想要查詢以獲取在一個特定的不連貫的子圖中的所有節點。 (在py2neo或cypher中)如何獲得不連貫的子圖中的所有節點 - neo4j/py2neo

如果我有一組節點,則每個組中的節點通過該組內的關係進行連接,但不在組之間進行連接。我可以查詢一個節點並獲取該節點組中的所有節點嗎?

+1

您是否在尋找連接的組件?你如何模型模型看起來像? –

回答

1

[增訂]

原來的答案

如果「節點組」你的意思是「不相交的子圖」,這裏是你如何能得到的不相交子圖的所有節點(與任何關係類型),其中包含一個特定節點(比如,在Neo節點):

MATCH (n { name: "Neo" }) 
OPTIONAL MATCH p=(n)-[*]-(m) 
RETURN REDUCE(s = [n], x IN COLLECT(NODES(p)) | 
    REDUCE(t = s, y IN x | CASE WHEN y IN t THEN t ELSE t + y END)) AS nodes; 

此查詢使用一個OPTIONAL MATCH找到「相關」的Neo節點的節點,因此,如果該節點沒有關係,查詢將 仍然能夠返回結果。

這兩個(嵌套的)REDUCE子句確保返回的集合只有不同的節點。

REDUCE條款初始化的結果集合與n節點,因爲它必須始終處於不相交的子圖,即使沒有其他節點。

更好的答案

MATCH p=(n { name: "Neo" })-[r*0..]-(m) 
WITH NODES(p) AS nodes 
UNWIND nodes AS node 
RETURN DISTINCT node 

此簡單的查詢(返回節點的行)使用[r*0..]以允許長度爲0的路徑(即,n不需要有任何關係 - m可以是相同的n)。它使用UNWINDnodes節點集合變爲行,然後使用DISTINCT消除重複。

替代的解決方案(尚不能工作,由於錯誤)

下面這個替代的解決方案(返回節點行)也應該有工作,但當前存在的bug(that I just reported),導致所有標識符在查詢展開NULL(例如,如果OPTIONAL MATCH未能找到匹配時可能發生),將被遺忘。由於此錯誤,如果Neo節點沒有關係,則下面的查詢當前不會返回任何結果。因此,您必須使用上面的查詢,直到bug修復。

MATCH (n { name: "Neo" }) 
OPTIONAL MATCH p=(n)-[*]-(m) 
WITH n, NODES(p) AS nodes 
UNWIND nodes AS node 
RETURN DISTINCT (
    CASE 
    WHEN node IS NULL THEN n 
    ELSE node END) AS res; 
1

如果您添加圖表或一些示例數據,它可能會有所幫助。但是,如果我正確理解您的數據模型,則將「節點組」定義爲通過某種關係連接的所有節點?因此,要獲得連接到組2,你可以使用這樣的查詢「組1」的節點(我們定義爲一個組1的關係連接的所有節點),而不是任何節點的所有成員:

MATCH (a:Person)-[:GROUP1]-(b:Person) 
WHERE NOT exists((a)-[:GROUP2]-()) 
RETURN a 

您還可以使用Node labels定義節點組。

相關問題