我正在尝试为Dijkstra的搜索添加一个maxDepth。我查看了apoc过程存储库源代码,发现它们在WeightedPathResult.streamWeightedPathResult中将PathFinder与startNode和enNode一起传递,该Result调用PathFinder接口的findAllPaths方法来查找所有路径。我需要更改 findAllPath 方法中的代码,以便在 path.length((>maxDepth 时中断搜索,但问题是我找不到此方法在任何文件中覆盖。以下是 APOC Dijkstra 过程的片段
@Procedure
@Description("apoc.algo.dijkstra(startNode, endNode, 'KNOWS|<WORKS_WITH|IS_MANAGER_OF>', 'distance', defaultValue, numberOfWantedResults) YIELD path," +
" weight - run dijkstra with relationship property name as cost function")
public Stream<WeightedPathResult> dijkstra(
@Name("startNode") Node startNode,
@Name("endNode") Node endNode,
@Name("relationshipTypesAndDirections") String relTypesAndDirs,
@Name("weightPropertyName") String weightPropertyName,
@Name(value = "defaultWeight", defaultValue = "NaN") double defaultWeight,
@Name(value = "numberOfWantedPaths", defaultValue = "1") long numberOfWantedPaths) {PathFinder<WeightedPath> algo = GraphAlgoFactory.dijkstra(
buildPathExpander(relTypesAndDirs),
(relationship, direction) -> Util.toDouble(relationship.getProperty(weightPropertyName, defaultWeight)),
(int)numberOfWantedPaths
);
return WeightedPathResult.streamWeightedPathResult(startNode, endNode, algo);
}
这是 streamWeightedPathResult 方法
public static Stream<WeightedPathResult> streamWeightedPathResult(Node startNode, Node endNode, PathFinder<WeightedPath> algo) {
Iterable<WeightedPath> allPaths = algo.findAllPaths(startNode, endNode);
return StreamSupport.stream(allPaths.spliterator(), false)
.map(WeightedPathResult::new);
}}
他们从 PathFinder 接口调用 findAllPath 方法,但它没有被覆盖,所以我在哪里可以对此方法进行更改?
findAllPaths()
方法是在 neo4j 库中实现的,而不是在 APOC 代码中实现的。
如您的代码片段所示,该特定algo
实例由这个重载版本的 org.neo4j.graphalgo.GraphAlgoFactory.dijkstra()
返回,它返回 org.neo4j.graphalgo.impl.path.Dijkstra 的实例,该实例实现了 findAllPaths(( 方法。
(以上链接均为 neo4j 库 3.4 版本。