【问题标题】:Specifying starting point for graph traversal algorithm in neo4j在 neo4j 中指定图遍历算法的起点
【发布时间】:2019-02-06 00:37:01
【问题描述】:

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

所以基本上,我正在尝试摆脱这个

到这里

我在neo4j中写了如下sn-p:

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

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

谢谢。

【问题讨论】:

    标签: algorithm graph neo4j cypher


    【解决方案1】:

    我相信会有更好的答案,并且这种方法有一些局限性,因为对图表做了一些假设,但这适用于您的示例。

    请注意,我向:Loc 节点添加了一个id 属性,但我只使用它来选择开始(并在末尾打印节点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
    

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

    【讨论】:

    • 谢谢!这解决了我最大的问题之一——对我的所有用例进行通用查询。 :)
    • @bitnahian 小心你的图表。这只会更新(通过某种方式)连接到您的起始节点的节点。因此,例如,如果您有一个带有不连贯子图的大图,并且您想要“时钟/步进”该图,您将需要使用此技术的多个步骤。另外,如果你有一个循环图,我怀疑这会做你想要的。
    • 我的图表是非循环的。整个图是一个连接的组件,所以至少现在应该可以正常工作。
    • 如果不是太麻烦,你能解释一下 maxLp 的 ORDER 是做什么的吗?
    • @bitnahian 即使这是解决问题的正确方法,我很确定可以改进密码以提高效率和/或非常大的图形处理。
    【解决方案2】:

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

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

    【讨论】:

    • 这很可能适用于整个图表(但针对不同的用例使用不同的关系标签)。但是,我希望它更像是一种扫描线算法方法,它总是首先到达我的起始节点(这会因不同的用例而异)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多