如何使用节点属性作为权重来计算neo4j中的最短路径

时间:2019-07-06 17:15:19

标签: java neo4j cypher dijkstra

我正在尝试计算neo4j图中两个节点之间的最短路径。通常,我会为此使用edge属性,但是我已经将pagerank属性写入了每个节点,并且我想使用我的pagerank(因此是节点中的属性,而不是我的edge中的属性)来计算最短路径(所以我想如果可以,请为最短路径最小化我的pagerank属性值)。由于这不适用于通常的

MATCH (start:Loc{name:'A'}), (end:Loc{name:'F'})
CALL algo.shortestPath.stream(start, end, 'cost')  
YIELD nodeId, cost
RETURN algo.asNode(nodeId).name AS name, cost

从Graph Algorithms插件中,我已经签出了Graph Algorithms插件(https://github.com/neo4j-contrib/neo4j-graph-algorithms)的Github存储库,并查看了它是否可以将算法更改为需要node属性而不是边缘属性。

我已经在algo> src> main> java> org.neo4j.graphalgo> ShortestPathProc下更改了算法,使其现在显示为:

@Procedure("algo.shortestPath.stream")
@Description("CALL algo.shortestPath.stream(startNode:Node, endNode:Node, 
weightProperty:String" +
        "{nodeQuery:'labelName', relationshipQuery:'relationshipName', 
direction:'BOTH', defaultValue:1.0}) " +
        "YIELD nodeId, cost - yields a stream of {nodeId, cost} from start 
to end (inclusive)")
public Stream<ShortestPathDijkstra.Result> dijkstraStream(
        @Name("startNode") Node startNode,
        @Name("endNode") Node endNode,
        @Name(value = "propertyName", defaultValue = "null") String 
propertyName,
        @Name(value = "config", defaultValue = "{}")
                Map<String, Object> config) {

    ProcedureConfiguration configuration = 
ProcedureConfiguration.create(config);

    Direction direction = configuration.getDirection(Direction.BOTH);

    GraphLoader graphLoader = new GraphLoader(api, Pools.DEFAULT)
            .init(log, configuration.getNodeLabelOrQuery(), 
configuration.getRelationshipOrQuery(), configuration)
            .withOptionalNodeWeightsFromProperty(
                    propertyName,
                    configuration.getWeightPropertyDefaultValue(2.0));

    if(direction == Direction.BOTH) {
        direction = Direction.OUTGOING;
        graphLoader.asUndirected(true).withDirection(direction);
    } else {
        graphLoader.withDirection(direction);
    }


    final Graph graph = graphLoader.load(configuration.getGraphImpl());

    if (graph.nodeCount() == 0 || startNode == null || endNode == null) {
        graph.release();
        return Stream.empty();
    }

    return new ShortestPathDijkstra(graph)
            .withProgressLogger(ProgressLogger.wrap(log, 
"ShortestPath(Dijkstra)"))
            .withTerminationFlag(TerminationFlag.wrap(transaction))
            .compute(startNode.getId(), endNode.getId(), direction)
            .resultStream();
}

所以基本上我改变了:

withOptionalRelationshipWeightsFromProperty

收件人:

withOptionalNodeWeightsFromProperty

我将默认值从1.0更改为2.0:

configuration.getWeightPropertyDefaultValue(2.0)

只是看看它是否无法在我的节点中检测到该属性是否会发生变化。

当我现在在Neo4j中运行它时,它仍然在节点中找不到我的pagerank属性,并且它不仅使用默认值2.0,而且还使用0.0作为代价。

我想知道是否有人可以指出我的错误所在?

与此同时,我想知道是否可以使用Cypher查询,我已经看到可以将节点约束用于最短路径计算(neo4j: shortest paths constrained by node and rel properties),并且我尝试了一个Cypher查询,该查询可能会占用我的节点属性pagerank(因此路径应包含具有较小pagerank值的节点),但到目前为止,我还没有真正得到任何有用的结果。

0 个答案:

没有答案