2017-03-01 65 views
2

假設我有一棵樹,其中某些節點具有給定類型的關係,除了那些給定關係及其後代以外,我將如何返回樹中的所有節點。如何在查詢中修剪分支?

我已經得到了一半像這樣的東西(樹是建立在has鏈接):

match (root: {Name: 'Root'})-[:has*]->(n) where not (n)-[:Exemption]-() return n 

但是,當然,這不包括有類型的關係Exemption但節點不是它的後代,所以後代顯示爲未連接的節點

如何構建查詢?

回答

0

經過一些實驗,這工作:

match (root: {Name: 'Root'})-[:has*]->(n) 
match (m)-[:has*]->(n) 
where not (m)-[:Exemption]-() 
return n 

這實際上是說:找到一個路徑,該路徑上的任何節點,回溯起來以確保沒有一個祖先顯示異常。所以我在這裏否定的是用第二個匹配創建的子路徑

3

這個查詢應該工作:

MATCH p=({Name: 'Root'})-[:has*]->(n) 
WHERE NONE(x IN NODES(p) WHERE (x)-[:Exemption]-()) 
RETURN n; 

它濾除與(也)具有:Exemption關係的節點的任何:has關係路徑。

+0

這個查詢返回空,我認爲原因是它查看整個路徑並說:如果該路徑中的任何節點應該是消除,整個路徑被淘汰......這不是我所需要的。我只需要消除** **我標記的節點的後代 – ekkis

+0

根據我對您的用例的理解,該查詢適用於我。請提供一個簡單的數據示例,其中此查詢不起作用。 – cybersam

1

我可能會分裂路徑分爲兩個部分:

MATCH p=(:Label {Name: 'Root'})-[:has*]->(n) WHERE NOT EXISTS ((n)-[:Exemption]->()) 
MATCH p2 = (n)-[:has*]->(m) WHERE NOT (m)-[:has]->() 
RETURN p,p2; 
+0

如果你使用exists()而不是我做到這一點,那麼在行爲方面是否有區別?我不確定遵循邏輯。第二次匹配將找到找到的任何節點(其中包括被淘汰的節點的後代,但不包括被淘汰的節點本身),並找到葉子節點(在鏈的末尾)沒有後代的後代。這對我來說毫無意義,所以我會猜測我的分析是不正確的。此外,你做兩個單獨的匹配*和*返回兩個結果。我完全不明白這是如何工作的? – ekkis

+0

有機會運行它,它不起作用。它使我回到了整個樹,本應消除的節點*和*後代 – ekkis

+0

思考更多關於兩步法的方法我嘗試過這種方法:MATCH(:Label {Name:'Root'}) - [:has *] - >(n)WHERE NOT(n) - [:Exemption] - >()AND NOT(n) - [:has] - >()返回n'但是這也不起作用。我在想,如果(n)沒有表現出豁免,那麼我們可以增加(n)也沒有後代的標準......爲什麼這不起作用? – ekkis