如何在给定的两个节点之间找到路径?

时间:2015-08-04 07:29:40

标签: java neo4j

如何在neo4j Java API中的给定两个节点之间找到路径,路径的所有权重的乘积在两个节点之间的所有路径中最大,我该怎么办? 在我的图形数据库中,有两个元素:一个是节点,另一个是关系,并且都具有name属性,但关系有一个额外的属性:weight(double类型和(0,1)中的值)。我的代码如下:我如何修改?

public static ArrayList<Path> getAllOptPaths(Long startNodeId, Long endNodeId, GraphDatabaseService db){
    ArrayList<Path> optPathsBetweenTwoNodes = new ArrayList<Path>();
    try (Transaction tx = db.beginTx()){
        Node node1 = db.getNodeById(startNodeId);
        Node node2 = db.getNodeById(endNodeId);

        PathExpander<Object> pathExpander = PathExpanders.allTypesAndDirections();
        CostEvaluator<Double> costEvaluator = CommonEvaluators.doubleCostEvaluator("Cost");

        // find all paths between given two nodes
        PathFinder<WeightedPath> dijkstraPathsFinder = GraphAlgoFactory.dijkstra(pathExpander, costEvaluator);
        WeightedPath path = dijkstraPathsFinder.findSinglePath(node1, node2);

        optPathsBetweenTwoNodes.add(path);

        tx.success();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return optPathsBetweenTwoNodes;       
}

3 个答案:

答案 0 :(得分:0)

在密码查询中也可以探索路径。这样可以为您提供加权路径计算的结果(因此也可以为其提供最小权重的路径)。

This webpage包含加权路径查询的示例。此外,Neo4j reduce功能将帮助您指定如何计算(和称重)路径。

答案 1 :(得分:0)

这个问题已经由我自己解决了,方法是修改neo4j核心JAVA API的来源。在修改源代码的过程中涉及一些具体的文件如下:Dijkstra.java,BestFirstSelectoryFactory.java,GraphAlgoFactory.java,Path .java,WeightedPathImpl.java,WeightedPathIterator.java。如果有人对修改的细节感兴趣,你可以发邮件给我。

答案 2 :(得分:0)

我认为改变代码库并不是一个好主意。使用函数setProperty()设置关系的属性(例如边的权重)时,可以使用键“Cost”设置边的权重。