我正在使用 Neo4j。targets我想在單向有向圖中(可能帶有回圈)找到所有連接(通過一個方向)到某些節點的節點。例如:
targets: [4]
1->2->3->[4]->2->...
1->5->6->7->5->...
現在4是目標節點,但可以有多個目標節點。我想找到1,2,3,4結果,因為它們可以與目標節點連接t,而5,6,7不能。
我想知道如何通過 Cypher 在 Neo4j 中制作它。
我的第一個想法是:
MATCH (target) WHERE id(target) IN [4]
MATCH p=(a)-[:Rel*]->(target)
MATCH (a)-[r:Rel]->(c) WHERE a IN nodes(p) AND c IN nodes(p)
RETURN a,c
當沒有回圈時它運行良好,但是當有回圈時,[:Rel*]它將無限運行,例如找到4in 的路徑5,6,7。
我有一個想法(受標簽傳播的啟發)來解決它:
- 將目標節點標記為“紅色”。
- 也將與“紅色”節點有傳出關系的所有節點標記為“紅色”。
- 重復步驟 2,直到不再有新的“紅色”節點。
- 現在所有“紅色”節點(包括目標節點)都在同一個結果子圖中。
但是我不知道如何用 Cypher 撰寫它,因為它包含遞回,而且我在為 Neo4j 撰寫那些 Java 用戶定義的程序時遇到了困難。
它可以用 Cypher 撰寫,還是已經有類似任務的解決方案?我沒有在 Apoc 或 Graph Data Science 庫中找到有用的工具。
任何幫助將不勝感激,謝謝!
uj5u.com熱心網友回復:
一種方法是使用apoc.path.expandConfig。這是 apoc 插件的一部分,您可以在 neo4j 資料庫上輕松啟用它。使用它,您可以運行類似:
MATCH (target) WHERE id(target) IN [4]
CALL apoc.path.expandConfig(target, {
relationshipFilter: "<Rel",
maxLevel: 10 //This is optional
})
YIELD path
RETURN path
在第一行,您可以找到目標節點,就像您所做的那樣。關系過濾器“<REL”將只允許在指向目標方向的節點上進行遍歷。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/463139.html
