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