我需要获取基于条件路径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)
答案 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]
模式匹配类型为B
,C
和/或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>
...