基于路径权重和节点属性dijkstra遍历

时间:2014-08-25 06:39:17

标签: neo4j traversal dijkstra

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

例如,我想找到从A到B的最短公交路线,链路的重量是距离。因此,路径不仅应该是最低成本,而且路径上的节点应该有一个总线站/停止。

因此返回的路径是最低成本路径,所有节点都作为总线站点(比如属性bus_stop = yes)。

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

2 个答案:

答案 0 :(得分: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)
     }

 }

答案 1 :(得分:0)

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

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