我正在尝试使用 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)
可以预见的是,我对PathFinderfindSinglePath()
实例的调用以不合时宜的方式结束:
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参数?查看 post 1.8 API 文档似乎也没有(明显的)答案。
或者,是否有更好的方法来确保一组“非法”多节点子路径永远不会出现在从findSinglePath()
Dijkstra 或 AStar PathFinder 调用返回的最佳路径中?