Cypher:通过一组严格交替的关系匹配任意深度的节点

Cypher: Matching nodes at arbitrary depth via a strictly alternating set of relations

我对 Cypher 很陌生,但正在努力寻找如何做到这一点。我想概括以下内容,以便它可以在任意深度进行匹配。

MATCH (:start)-[:a]-()-[:b]-(:end) //Depth1
MATCH (:start)-[:a]-()-[:b]-()-[:a]-()-[:b]-(:end) //Depth2
MATCH (:start)-[:a]-()-[:b]-()-[:a]-()-[:b]-()-[:a]-()-[:b]-(:end) //Depth3
MATCH (:start)-[:a]-()-[:b]-()-[:a]-()-[:b]-()-[:a]-()-[:b]-()-[:a]-()-[:b]-(:end) //Depth4

也就是说路径需要严格交替经过任意数量的a-node-ba-node-a 等将不起作用。所以我不能这样做,根据 Neo4J: find a sub-graph of arbitrary depth with nodes connected by a given set of relations?

MATCH (:start)-[:a|b*]-(:end)

因为那会匹配这样的东西:

MATCH (:start)-[:a]-()-[:a]-(:end)
MATCH (:start)-[:b]-()-[:b]-(:end)

有谁知道如何解决这个问题?如果重要的话,我将 Cypher 与 Neo4j 2.x 一起使用。

谢谢!

严格的回答是否定的,这在 Cypher 中是不可能的。延伸的答案是:可以确定这样的路径是否存在,并 return 路径两端的节点,但它很慢,你不会保留路径上的一些信息。

MATCH (first) - [:a] -> () - [:b] -> (third)
MERGE (first) - [temp:c] -> (third)
WITH COLLECT(temp) AS temps
MATCH p = (:start) - [:c*] -> (:end)
WITH temps, COLLECT(p) AS ps
FOREACH(temp IN temps)|DELETE temp)
UNWIND ps AS p
RETURN DISTINCT p

这确实需要您拥有 :c 或其他关系类型,您可以在此处用作临时关系。