Я пытаюсь вычислить кратчайший путь в моем графике neo4j между двумя узлами.Обычно я бы использовал для этого свойства ребер, но я записал свойство pagerank в каждый узел, и я хотел бы использовать свой pagerank (таким образом, свойство в моем узле, а не в моем ребре), чтобы вычислить кратчайший путь (поэтому я хочусвести к минимуму мои значения свойства 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, я проверил Github-репозиторий для плагина Graph Algorithms (https://github.com/neo4j-contrib/neo4j-graph-algorithms) и посмотрел его напосмотрим, смогу ли я изменить алгоритм на требование наличия свойства узла, а не свойства ребра.
Я изменил алгоритм в 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 как стоимость.
Мне было интересно, кто-нибудь может указать мне, где мои ошибки?
В то же время мне интересно, смогу ли я использовать CyphПо этому запросу я видел, что можно использовать ограничения узлов для вычислений кратчайшего пути ( neo4j: кратчайшие пути ограничены свойствами узла и rel ), и я попытался работать над запросом Cypher, который могвозможно, возьмите мой pagerank свойства узла (поэтому путь должен состоять из узлов с небольшими значениями pagerank), но я пока что не получил никаких полезных результатов.