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

时间:2016-10-30 15:41:26

标签: neo4j cypher graph-databases

我对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-b ; a-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.

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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或其他关系类型,您可以在此处将其用作临时。