簡體   English   中英

neo4j Cypher — 遍歷可變長度路徑,但在找到 label 時停止

[英]neo4j Cypher — traverse variable length path, but stop when a label is found

假設我的圖形數據庫有一個foo節點的“流”。 在每個foo節點之間可能是任意數量的barbar1bar2 、 ... barN節點,它們最終連接到下一個foo節點。

所以,所有這些都是可能的

  • (a:foo)-->(:bar)-->(b:foo)
  • (b:foo)-->(:bar)-->(c:foo)-->(:bar1)-->(d:foo)
  • (a:foo)-->(:bar)-->(:bar1)-->(:bar2)-->(:barN)-->(c:foo)

等等

我想返回每對不同的foo節點,它們之間沒有任何其他foo節點

對於上述示例,解決方案應返回:

  • 一,乙
  • b、c
  • c, d
  • 一、c

解決方案不應包括以下內容,它們之間有 foo 節點:

  • b, d
  • 廣告

我試過的。 這將返回所有連接的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM