是否可以找到节点A和B之间的最低成本路径,同时检查节点上的某些属性?
例如,我想找到从A到B的最短公交路线,链路的重量是距离。因此,路径不仅应该是最低成本,而且路径上的节点应该有一个总线站/停止。
因此返回的路径是最低成本路径,所有节点都作为总线站点(比如属性bus_stop = yes)。
TraversalDescription提供了可以检查节点属性的评估程序。与Dijkstra类似吗?
答案 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