在neo4j中为图遍历算法指定起点

时间:2019-02-06 00:37:01

标签: algorithm graph neo4j cypher

我正在尝试编写一种算法,该算法会将值从起始节点传播到整个连接的组件。基本上,如果A收到5个请求,并且A为A收到的每个请求向B发送5个请求,则B将收到25个请求。

因此,基本上,我正在尝试从

enter image description here

对此

enter image description here

我在neo4j中编写了以下代码段:

MATCH (a:Loc)-[r:ROAD]->(b:Loc)
 SET b.volume = b.volume + a.volume * r.cost
 RETURN a,r,b

但是,我不知道该如何为该算法指定一个开始的起点?在这种情况下,似乎neo4j正在正确更新值,但我认为这不适用于较大的图形。我想明确地使算法从START节点开始传播值。

谢谢。

2 个答案:

答案 0 :(得分:1)

我肯定会有更好的答案,并且由于对图形进行了一些假设,因此这种方法存在一些局限性,但这对您的示例有用。

请注意,我在id节点上添加了:Loc属性,但仅使用它来选择开始位置(并在末端打印了节点id)。

MATCH p=(n:Loc)<-[:ROAD*]-(:Loc {id: 0})
WITH DISTINCT n, max(length(p)) as maxLp
ORDER BY maxLp  // order the nodes by their maximum distance from start
MATCH (n)<-[r:ROAD]-(p:Loc)
SET n.volume = n.volume + r.cost * p.volume
RETURN DISTINCT n.id, n.volume

结果如下:

n.id    n.volume
1           4000
2         200000
3         200000
4       16400000
5      508000000
6    21632000000

这里的想法是从起始节点获得到每个节点的最长路径。这些文件按“紧密度”排序,然后按“紧密度”顺序更新卷。

答案 1 :(得分:0)

在这种情况下,计划人员将使用标签查找查询的起始位置(您可以运行查询的EXPLAIN来查看查询计划),因此它将与所有:Loc节点匹配,并扩展模式和相应地修改属性。

这将适用于所有:Loc节点,是您想要的,还是只希望将其应用于从某个起始节点可到达的图形的较小部分?