找到每个节点与路径的最后一个节点之间的路径中的距离

时间:2015-01-09 17:18:06

标签: neo4j cypher

我是Cypher的新手,我需要帮助才能解决我面临的问题。 在我的图表中,我有一条代表数据流的路径,我需要知道路径中每个节点与路径最后一个节点的距离。 例如,如果我有以下路径:

(一) - >(B) - >(C) - >(d)

距离必须为3表示a,2表示b,1表示c,0表示d。 有没有一种有效的方法可以在Cypher中获得这个结果? 非常感谢!

莫罗

2 个答案:

答案 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。

此外,使用适当的节点标签和关系类型限定查询可以加快速度。