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-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 一起使用。
谢谢!
严格的回答是否定的,这在 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
或其他关系类型,您可以在此处用作临时关系。
我对 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 一起使用。
谢谢!
严格的回答是否定的,这在 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
或其他关系类型,您可以在此处用作临时关系。