我正在尝试计算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值的节点),但到目前为止,我还没有真正得到任何有用的结果。