簡體   English   中英

Neo4j Cypher遍歷 - 通過多種關系類型查找路徑

[英]Neo4j Cypher traversal - find path by multiple relationship types

我有一個模式,其中節點通過兩種類型的關系連接 - r:A和r:B。 我正在嘗試編寫一個模式,它將找到從節點N到節點M的每條路徑。這可以通過以下cypher查詢來完成:

match path = (n)-[:A|:B*]->(m) return path;

不幸的是,這不是我所需要的。 我需要找到從(n)到(m)的每條路徑,其中深度通過關系r:A可以是無限的,但沿途只能使用有限數量的r:B關系。 在快樂的一天場景中,密碼查詢將如下所示:

match path = (n)-[:A*|:B*0..3]->(m) return path;

但是,cypher不允許這種語法。 即使在路上使用另一個“幫助”節點,我也無法解決這個問題:

match path = (n)-[:A*]->()-[:B*0..3]->(m) return path;

這也不符合我的需要,因為節點可以以任何可能的方式互連。 例如:

(n)-[r:A]-()-[r:A]-()-[r:A]-(m)
(n)-[r:A]-(m)
(n)-[r:A]-()-[r:B]-()-[r:A]-()-[r:B]-()-[r:A]-()-[r:A]-(m)

有沒有辦法如何實現這一目標? 如果不是在密碼中,可以在gremlin / neo4j遍歷api /嵌入式函數的spring數據neo4j項目中完成嗎?

謝謝你的答案。

嘗試這個:

MATCH路徑=(n) - [:A |:B *] - >(m)
WITH path,relationships(path)AS r,filter(rel in relationships(path)
WHERE type(rel)='B')AS Brels
WITH path,reduce(Bcount = 0,rel IN Brels | Bcount + 1)AS Bcount
在哪里Bcount <= 3
返回路徑

我不知道我是否完全理解這個問題。 請告訴我。

編輯:
我在評論后添加了第二個查詢。 這個解決方案很難看,但它是一個很好的解決方法。

MATCH路徑=(n) - [:A |:B *] - (m)
WITH path,filter(rel in relationships(path)WHERE type(rel)='B')AS Brels
WITH path,reduce(Bcount = 0,rel IN Brels | Bcount + 1)AS Bcount
在哪里Bcount <= 3
WITH路徑,關系(路徑)AS rels
WITH path,rels,reduce(count = 0,rel IN rels | count + 1)AS count
WITH path,rels,range(0,count-1)作為計數器
WITH path,reduce(x = 0,c IN counter |
CASE WHEN(類型(rels [c])='B'和類型(rels [c + 1])='B')那么x + 200000 ELSE x + 1 END)AS countX
其中countX <200000
返回路徑,countX

暫無
暫無

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

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