2016-09-30 160 views
2

我有一個圖表連接爲:排除節點是懸空

  -->(D)-->(E)-->(F) 
     /
(A)-->(B) 
     \   
     -->(C) 

圖是一棵樹,根= A從父到子通過定向關係:HAS_CHILD

我想要什麼這樣做是爲了排除節點用於例如一個給定的屬性:

MATCH (n:Node) 
WHERE n.name <> "D" 
return n 

這會給我一個子圖:

  (E)-->(F) 

(A)-->(B) 
     \   
     -->(C) 

其中E和F不能從根節點到達。我如何排除這些子樹?

首選的結果將是:

(A)-->(B) 
     \   
     -->(C) 

回答

2

我覺得我們沒有數據的全貌,你真的想要的這裏。

我的猜測是你的數據模型是一棵樹。在我看來,你試圖定義一個要排除的節點,這也排除了該節點下的所有分支(所以在你的例子中,你可能在D之下有一個豐富而複雜的子樹,而你想排除所有這些) 。這假設從父母到樹中的孩子之間存在定向關係。

如果是這樣,您可以嘗試以下查詢。我假設父母之間的關係爲:HAS_CHILD,因爲這不包含在你的描述中。

MATCH (excluded:Node {name: "D"}) 
WITH excluded 
MATCH (n:Node) 
WHERE n <> excluded 
AND NOT (excluded)-[:HAS_CHILD*]->(n) 
RETURN n 

或者,或者,如果你的樹很大,您排除節點下的子樹比整個樹相對較小,從而可以更好地運行:

MATCH (excludedRoot:Node {name: "D"})-[:HAS_CHILD*0..]->(excluded) 
WITH COLLECT(excluded) as excludedNodes 
MATCH (n:Node) 
WHERE NOT n IN excludedNodes 
RETURN n 
+0

你是正確的,我會更新我的問題。 – drowzy

1

所以,你希望所有既不d也不僅連接到d節點:

MATCH (excluded:Node {name: "D"}) 
MATCH (n:Node) 
WHERE n <> excluded 
OPTIONAL MATCH (n)--(n2:Node) 
WHERE n2 <> excluded 
WITH n, collect(n2) AS nodes 
WHERE size(nodes) > 0 
RETURN n 

這種假設認爲,只有一個不經節點,因爲它將排除每個excluded的連接節點。

如果有不止一個,這個修改後的查詢應該工作:

MATCH (excluded:Node {name: "D"}) 
WITH collect(excluded) AS excluded 
MATCH (n:Node) 
WHERE NOT n IN excluded 
OPTIONAL MATCH (n)--(n2:Node) 
WHERE NOT n2 IN excluded 
WITH n, collect(n2) AS nodes 
WHERE size(nodes) > 0 
RETURN n