我有一個包含許多地方的原始項目可以被克隆項目導致實施「貪婪」的比賽找到了樹的程度Cypher支架
(clone:Item)-[:clones]->(original:Item)
和的「子樹」的圖表克隆項也可以被克隆:
(newclone:Item)-[:clones]->(clone:Item)
中的第一項是由用戶創建的:
(:User)-[:created]->(:item)
和克隆COL由用戶引用:
(:User)-[:collected]->(:item)
鑑於樹中的任何項目,我希望能夠匹配樹中的所有項目。我使用的是:
(1) match (known:Item)-[:clones*]-(others:Item)
我的理解是,這實現了「貪婪」的比賽,在各個方向遍歷樹,匹配的所有項目。
一般來說,這工作然而,在某些情況下,它似乎不匹配樹中的所有項目。例如,在下面的查詢中,這似乎不匹配整個子樹。
match p = (known:Item)-[r:clones*]-(others:Item) where not any(x in nodes(p) where (x)<-[:created]-(:User)) return p
在這裏,我試圖找到它們缺少一個「創造」項目(這是在源SQL數據庫中刪除子樹。
什麼我發現是,它給我誤報的原因,它只匹配特定樹的一部分,例如,如果有一棵樹有5個項目按照上述方式正確構建,似乎(在某些情況下)匹配樹的一個子集(可能是5個項目中的2個)和該子集不包含創建的卡,因此利用該查詢返回的時候我沒想到它。
問題 是我的邏輯正確,或我誤解的東西嗎?我懷疑我誤解了路徑,但我很困惑,因爲基本的「貪婪」匹配在大多數情況下都適用。
我認爲我的問題是,我一直困惑,因爲查詢是在樹中發現多個路徑,其中一些滿足查詢中的測試,有些則不。在neo4j可視化中查看時,多條路徑被整合到整個樹中,而表格結果顯示上面的匹配(1)實際上給出了多條路徑。
我現在在想,我應該使用的集合,而不是該路徑。
您的問題*顯示*有矛盾。您聲明:(1)「第一個項目是由用戶創建的」,(2)「整棵樹會通過測試」。但是,如果沒有節點由用戶創建,那麼您的測試只會傳遞給整個樹。所以,(1)和(2)不能同時成立。請更正您的問題陳述。 – cybersam