我正在尝试使用Java嵌入式API在Neo4J中实现有状态的AStar遍历。也就是说,我想传递一个对象,该对象保存从分支收集的一些上下文信息,用于在我到达图中的某个节点后选择/修剪向前关系。我们的想法是PathExpander.expand()
方法将检查状态对象中包含的遍历的上下文,并确定哪些路径有资格进行扩展,以及以哪种顺序进行扩展。我这样做是为了防止非法的多节点子路径(实际上是转向限制)被视为返回的最佳路径的一部分。这种技术适用于Dijkstra遍历,因为GraphAlgoFactory具有dijkstra生成工厂方法,支持通过InitialStateFactory参数设置初始状态:
dijkstra(PathExpander expander, InitialStateFactory stateFactory, String relationshipPropertyRepresentingCost)
dijkstra(PathExpander expander, InitialStateFactory stateFactory, CostEvaluator<Double> costEvaluator)
大。但是,我找不到相应的工厂方法来设置AStar遍历中的初始状态,唯一的选择是:
aStar(PathExpander expander, CostEvaluator<Double> lengthEvaluator, EstimateEvaluator<Double> estimateEvaluator)
aStar(RelationshipExpander expander, CostEvaluator<Double> lengthEvaluator, EstimateEvaluator<Double> estimateEvaluator)
可以预见,我PathFinder实例上的findSinglePath()
调用会遇到不合时宜的结束:
java.lang.UnsupportedOperationException: Branch state disabled, pass in an initial state to enable it
at org.neo4j.kernel.Traversal$1.getState(Traversal.java:100)[neo4j-kernel-1.8.jar:1.8]
那么“传递初始状态”如何在AStar算法工厂方法中没有InitialStateFactory参数?查看1.8后的API文档似乎也没有显示(明显的)答案。
或者,有没有更好的方法来确保一组“非法”多节点子路径永远不会出现在从Dijkstra或AStar PathFinders上调用的findSinglePath()
返回的最佳路径中?
答案 0 :(得分:1)
因此,Dijkstra算法使用遍历框架在Neo4j中实现,而A *是自定义实现。然而,有一个TraversalAStar类在遍历框架之上实现A *。该类没有一个构造函数,让你通过https://github.com/neo4j/neo4j/pull/604地址传递初始分支状态。
与GraphAlgoFactory提供的相比,人们很少关注比较和优化TraversalAStar,但它应该提供你所追求的功能......一旦合并就行了。