我有一群节点和关系。类似于以下内容:
N1-sends-> N2-sends-> N3-sends-> N4
N5-sends-> N6-sends-> N7-sends-> N8
N9-sends-> N10-sends-> N11-sends-> N12-sends-> N13
我想写一个Cypher查询返回3条路径,没有第一个或最后一个项目。不在路径开头或结尾的节点已经具有属性("中间"," true"),这样可以更容易。
我遇到的一个问题是Cypher还返回路径和路径的每个SUBSET。例如,它返回n10-> n11->和n11-> n2,和n10-> n11-> n12,....这不是我想要的。
相反,我只希望结果为3的数组,其中每个我都有:
N 2 - > N3
N6-> N7
N10-> n11-> N12
就是这样。
我提出的查询是:(第一个有语法错误):
START n=node(*) MATCH p=()-[*]->i-[*]->() WHERE has(i.middle)
WITH COLLECT(p) AS pa, MAX(length(p)) AS maxLength, NODES(p) AS pn
FILTER(path IN pa WHERE length(path)=maxLength) AS longestPaths
RETURN DISTINCT FILTER(x IN longestPaths WHERE exists(x.middle))
和
START n=node(*) MATCH p=()-[*]->i-[*]->()
WHERE has(i.middle)
RETURN DISTINCT filter(x IN NODES(p) WHERE exists(x.middle)) as O
第二个返回没有第一个和最后一个节点的路径,但它返回重复的节点,因为它也返回路径的子集。
谢谢。
答案 0 :(得分:4)
这可能会做你想要的:
MATCH (n)-[:sends*]->(m)
WHERE NOT ( ()-[:sends]->(n) OR (m)-[:sends]->() )
RETURN NODES(p)[1..-1] AS middleNodes;
WHERE
子句消除了子路径(即,作为较长路径一部分的路径)。 NODES(p)[1..-1]
语法返回每个路径中的第二个到倒数第二个节点。