我正在尝试编写一种算法,该算法会将值从起始节点传播到整个连接的组件。基本上,如果A收到5个请求,并且A为A收到的每个请求向B发送5个请求,则B将收到25个请求。
因此,基本上,我正在尝试从
对此
我在neo4j中编写了以下代码段:
MATCH (a:Loc)-[r:ROAD]->(b:Loc)
SET b.volume = b.volume + a.volume * r.cost
RETURN a,r,b
但是,我不知道该如何为该算法指定一个开始的起点?在这种情况下,似乎neo4j正在正确更新值,但我认为这不适用于较大的图形。我想明确地使算法从START节点开始传播值。
谢谢。
答案 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节点,是您想要的,还是只希望将其应用于从某个起始节点可到达的图形的较小部分?