我是Cypher的新手,我需要帮助才能解决我面临的问题。 在我的图表中,我有一条代表数据流的路径,我需要知道路径中每个节点与路径最后一个节点的距离。 例如,如果我有以下路径:
(一) - >(B) - >(C) - >(d)
距离必须为3表示a,2表示b,1表示c,0表示d。 有没有一种有效的方法可以在Cypher中获得这个结果? 非常感谢!
莫罗
答案 0 :(得分:2)
如果它只是节点之间的跳跃,那么我认为这符合账单。
match p=(a:Test {name: 'A'})-[r*3]->(d:Test {name: 'D'})
with p, range(length(p),0,-1) as idx
unwind idx as elem
return (nodes(p)[elem]).name as Node
, length(p) - elem as Distance
order by Node
答案 1 :(得分:1)
在这个答案中,我定义了一个完成"完成的路径。如果其起始节点没有传入关系且其末端节点没有传出关系。
此查询返回每个"完成" path,包含每个节点的neo4j生成的ID的对象集合以及到该路径末尾的跳数:
MATCH p=(x)-[*]->(y)
WHERE (NOT ()-->(x)) AND (NOT (y)-->())
WITH NODES(p) AS np, LENGTH(p) AS lp
RETURN EXTRACT(i IN RANGE(0, lp, 1) | {id: ID(np[i]), hops: lp - i})
注意:对于大型图表,与[*]
匹配的代价很高,因此您可能需要限制最大跃点值。例如,使用[*..4]
代替将最大跃点值限制为4。
此外,使用适当的节点标签和关系类型限定查询可以加快速度。