[英]neo4j Cypher — traverse variable length path, but stop when a label is found
假設我的圖形數據庫有一個foo
節點的“流”。 在每個foo
節點之間可能是任意數量的bar
、 bar1
、 bar2
、 ... barN
節點,它們最終連接到下一個foo
節點。
所以,所有這些都是可能的
等等
我想返回每對不同的foo
節點,它們之間沒有任何其他foo
節點
對於上述示例,解決方案應返回:
解決方案不應包括以下內容,它們之間有 foo 節點:
我試過的。 這將返回所有連接的 foo 對,無論它們之間是什么。
MATCH x=(a:foo)-[:RELTYPE*1..]->(b:foo)
RETURN a,b
這應該有效:
MATCH x = (a:foo)-[:RELTYPE*..]->(b:foo)
WHERE NONE(n IN NODES(x)[1..-1] WHERE ANY(l IN LABELS(n) WHERE l = 'foo'))
RETURN a, b
[更新]
甚至更好:
MATCH x = (a:foo)-[:RELTYPE*..]->(b:foo)
WHERE NONE(n IN NODES(x)[1..-1] WHERE n:foo)
RETURN a, b
您還可以利用 APOC 程序來處理可以處理這種用例的路徑擴展程序。
使用此圖:
CREATE (a:foo {name:'a'}), (b:foo {name:'b'}), (c:foo {name:'c'}), (d:foo {name:'d'}),
(a)-[:RELTYPE]->(:bar)-[:RELTYPE]->(b),
(b)-[:RELTYPE]->(:bar)-[:RELTYPE]->(c)-[:RELTYPE]->(:bar1)-[:RELTYPE]->(d),
(a)-[:RELTYPE]->(:bar)-[:RELTYPE]->(:bar1)-[:RELTYPE]->(:bar2)-[:RELTYPE]->(:barN)-[:RELTYPE]->(c)
我們可以應用這個查詢:
MATCH (start:foo)
CALL apoc.path.subgraphNodes(start, {relationshipFilter:'RELTYPE>', labelFilter:'/foo'}) YIELD node as end
RETURN start, end
這從 every:foo 節點開始,僅遍歷傳出:RELTYPE 關系,並在到達 a:foo 標記節點時終止擴展(label 過濾器中的 'foo' 之前的/
表示這是標簽上的終止過濾器)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.