遍历带有条件边类型的neo4j图

时间:2018-12-10 02:13:41

标签: neo4j

我有一个固定的数据库,该数据库具有用六种不同类型的关系连接人和边的节点。为简单起见,在本文中,我将关系的类型称为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)

2 个答案:

答案 0 :(得分:1)

此纯密码查询应返回所有匹配的路径:

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子句会过滤掉不需要的子路径。

答案 1 :(得分:0)

当遍历的跳数不同时,这不是可以用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>
...