Как рассчитать кратчайший путь в neo4j, используя свойства узла в качестве весов - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь вычислить кратчайший путь в моем графике 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), но я пока что не получил никаких полезных результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...