【问题标题】:traversing based on path weights and node properties dijkstra基于路径权重和节点属性的遍历 dijkstra
【发布时间】:2014-08-25 06:39:17
【问题描述】:

是否可以通过检查节点上的某些属性来找到节点 A 和 B 之间的最低成本路径?

例如,我想找到从 A 到 B 的最短巴士路线,其中链接的权重是距离。所以路径不仅应该是成本最低的,而且路径上的节点应该有一个公共汽车站/站。

所以返回的路径是所有节点作为公交车站的最低成本路径(比如属性 bus_stop=yes)。

TraversalDescription 提供了可以检查节点属性的评估器。与 Dijkstra 类似吗?

【问题讨论】:

    标签: neo4j traversal dijkstra


    【解决方案1】:

    使用 Neo4j 的 graphalgo 包时,您需要为 Dijkstra 算法提供自定义的 CostEvaluator。而不是仅仅使用旅行时间(也就是关系属性),您应该返回旅行时间(关系属性)加上在公交车站的等待时间(节点属性)的总和:

     class BusCostEvaluator implements CostEvaluator<Float> {
    
         public Float getCost(Relationship r, Direction d) {
             return (Float)r.getStartNode().getProperty("waitTime", 0f) +
                 (Float)r.getProperty("travelTime", 0f)
         }
    
     }
    

    【讨论】:

    • 我需要能够根据此路径中的节点是否具有属性来做出排除和修剪等决定。像开始节点应该有属性 waitTime 少于 20 分钟包含在路径中。我可以在检索后迭代路径以检查该路径中的每个节点的属性并接受或拒绝该路径。但是是否可以让算法知道在使用 Dijkstra 时要包含哪些节点
    • dijekstra 还要求您提供PathExpander,请参阅docs.neo4j.org/chunked/2.1.3/javadocs/org/neo4j/graphdb/…。 pathExpander 允许您通过不在 expand 方法中返回关系来排除关系。
    【解决方案2】:

    试试下面的查询。它假定所有链接都具有属性权重,并将路径权重和长度组合相加以对结果进行排序。它首先只过滤所有节点都将 bus_stop 设为 yes 的路径

    MATCH p=a-[r*]->b
    WHERE all(x1 in nodes(p) where x1.bus_stop = 'yes')
    WITH extract(link IN r| link.weight) AS wts, length(p) AS len
    RETURN wts, reduce(sum=0, x IN wts| sum+x) AS totalwt, len
    order by totalwt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多