假設我有一棵樹,其中某些節點具有給定類型的關係,除了那些給定關係及其後代以外,我將如何返回樹中的所有節點。如何在查詢中修剪分支?
我已經得到了一半像這樣的東西(樹是建立在has
鏈接):
match (root: {Name: 'Root'})-[:has*]->(n) where not (n)-[:Exemption]-() return n
但是,當然,這不包括有類型的關係Exemption
但節點不是它的後代,所以後代顯示爲未連接的節點
如何構建查詢?
假設我有一棵樹,其中某些節點具有給定類型的關係,除了那些給定關係及其後代以外,我將如何返回樹中的所有節點。如何在查詢中修剪分支?
我已經得到了一半像這樣的東西(樹是建立在has
鏈接):
match (root: {Name: 'Root'})-[:has*]->(n) where not (n)-[:Exemption]-() return n
但是,當然,這不包括有類型的關係Exemption
但節點不是它的後代,所以後代顯示爲未連接的節點
如何構建查詢?
經過一些實驗,這工作:
match (root: {Name: 'Root'})-[:has*]->(n)
match (m)-[:has*]->(n)
where not (m)-[:Exemption]-()
return n
這實際上是說:找到一個路徑,該路徑上的任何節點,回溯起來以確保沒有一個祖先顯示異常。所以我在這裏否定的是用第二個匹配創建的子路徑
這個查詢應該工作:
MATCH p=({Name: 'Root'})-[:has*]->(n)
WHERE NONE(x IN NODES(p) WHERE (x)-[:Exemption]-())
RETURN n;
它濾除與(也)具有:Exemption
關係的節點的任何:has
關係路徑。
我可能會分裂路徑分爲兩個部分:
MATCH p=(:Label {Name: 'Root'})-[:has*]->(n) WHERE NOT EXISTS ((n)-[:Exemption]->())
MATCH p2 = (n)-[:has*]->(m) WHERE NOT (m)-[:has]->()
RETURN p,p2;
如果你使用exists()而不是我做到這一點,那麼在行爲方面是否有區別?我不確定遵循邏輯。第二次匹配將找到找到的任何節點(其中包括被淘汰的節點的後代,但不包括被淘汰的節點本身),並找到葉子節點(在鏈的末尾)沒有後代的後代。這對我來說毫無意義,所以我會猜測我的分析是不正確的。此外,你做兩個單獨的匹配*和*返回兩個結果。我完全不明白這是如何工作的? – ekkis
有機會運行它,它不起作用。它使我回到了整個樹,本應消除的節點*和*後代 – ekkis
思考更多關於兩步法的方法我嘗試過這種方法:MATCH(:Label {Name:'Root'}) - [:has *] - >(n)WHERE NOT(n) - [:Exemption] - >()AND NOT(n) - [:has] - >()返回n'但是這也不起作用。我在想,如果(n)沒有表現出豁免,那麼我們可以增加(n)也沒有後代的標準......爲什麼這不起作用? – ekkis
這個查詢返回空,我認爲原因是它查看整個路徑並說:如果該路徑中的任何節點應該是消除,整個路徑被淘汰......這不是我所需要的。我只需要消除** **我標記的節點的後代 – ekkis
根據我對您的用例的理解,該查詢適用於我。請提供一個簡單的數據示例,其中此查詢不起作用。 – cybersam