簡體   English   中英

遍歷帶有條件邊類型的neo4j圖

[英]traversing neo4j graph with conditional edge types

我有一個固定的數據庫,該數據庫具有用六種不同類型的關系連接人和邊的節點。 為簡單起見,在本文中,我將關系的類型稱為A,B,C,D,E和F。這些關系都不是定向的。 語法上的新功能,因此感謝您的幫助。

我需要獲取基於條件路徑A到(B或CD)到E到F遍歷圖的關系集。所以這意味着我首先需要鏈接兩個節點()-[:A]-( ),但隨后我對如何表達條件關系感到困惑。 要到達下一個節點,我需要B或C然后是D,以便它是()-[:B]-()或()-[:: C]-()-[:D]-()。 如何用MATCH語法表達這種條件遍歷?

嘗試了所有這些並得到語法錯誤:

(node2:Node)-[rel2:B|rel3:C]-(node3:Node)
(node2:Node)-[rel2:B]OR[rel3:C]-(node3:Node)

此純密碼查詢應返回所有匹配的路徑:

MATCH p=()-[:A]-()-[r:B|C|D*1..2]-()-[:E]-()-[:F]-()
WHERE (SIZE(r) = 1 AND TYPE(r[0]) = 'B') OR
      (SIZE(r) = 2 AND TYPE(r[0]) = 'C' AND TYPE(r[1]) = 'D')
RETURN p

[r:B|C|D*1..2]模式匹配類型為BC和/或D 1或2個關系(可以包含不需要的子路徑); WHERE子句會過濾掉不需要的子路徑。

當遍歷的跳數不同時,這並不是用Cypher可以真正表達的。

最簡單的方法可能是使用APOC過程中的apoc.cypher.run()來執行UNION查詢以覆蓋這兩個路徑,然后使用調用結果:

//assume `node2` is in scope
CALL apoc.cypher.run("MATCH (node2)-[:B]-(node3:Node) RETURN node3
 UNION
 MATCH (node2)-[:C]-()-[:D]-(node3:Node) RETURN node3",
 {node2:node2}) YIELD value
WITH value.node3 as node3 // , <whatever else you want in scope>
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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