#neo4j #cypher
#neo4j #шифр
Вопрос:
Я хочу найти топ-5 (кратчайших) путей на моем графике (Neo4j 3.0.4) из точки A в точку Z. Граф состоит из нескольких узлов, которые связаны отношением «CONNECTED_BY». Это соединение имеет свойство стоимости, которое должно быть сведено к минимуму.
Я начал с этого:
MATCH p=(from:Stop{stopId:'A'}), (to:Stop{stopUri:'Z'}),
path = allShortestPaths((from)-[:CONNECTED_TO*]->(to))
WITH REDUCE (total = 0, r in relationships(p) | total r.cost) as tt, path
RETURN path, tt
Этот запрос всегда возвращает подграф с наименьшим количеством переходов, свойство стоимости не учитывается. Существует другой подграф с большим количеством переходов, который имеет меньшую общую стоимость. Что я делаю не так?
Кроме того, я действительно хочу получить 5 ЛУЧШИХ подграфов. Если я выполню этот запрос:
MATCH p=(from:Stop{stopUri:'A'})-[r:CONNECTED_TO*10]->(to:Stop{stopUri:'Z'}) RETURN p
Я вижу несколько путей, но первый возвращает только один путь.
Конечно, путь не должен содержать циклов и т. Д.
Я хочу выполнить этот запрос через REST API, поэтому это должен сделать вызов REST или запрос cyhper.
ПРАВКА1: я хочу выполнить это как вызов REST, поэтому я попробовал алгоритм Дейкстры. Это кажется хорошим способом, но я должен рассчитать вес, добавив 3 разных свойства стоимости в отношение. Как этого можно достичь?
Ответ №1:
allShortestPaths
найдет кратчайший путь между двумя точками, а затем сопоставит каждый путь с одинаковым количеством переходов. Если вы хотите минимизировать на основе стоимости, а не длины обхода, попробуйте что-то вроде этого:
MATCH p=(from:Stop{stopId:'A'}), (to:Stop{stopUri:'Z'}),
path = (from)-[:CONNECTED_TO*]->(to)
WITH REDUCE (total = 0, r in relationships(p) | total r.cost) as cost, path
ORDER BY cost
RETURN path LIMIT 5
Комментарии:
1. Спасибо. Да, я знаю этот способ, но это очень длинный запрос. И я не могу уменьшить / ограничить отношения между узлами, потому что я действительно не знаю, сколько их нужно. Я хочу выполнить это как вызов REST, поэтому я попробовал алгоритм Дейкстры. Это кажется хорошим способом, но я должен рассчитать вес, добавив 3 разных свойства стоимости в отношение. У вас есть идея, как я могу использовать более одного свойства стоимости?
2. Ах, и что еще более важно. Я попытался: СОПОСТАВИТЬ p=(from:Stop{stopId:’A’}), (to:Stop{stopId:’Z’}), path = (from) -[:CONNECTED_TO * 15]->(to) ВЕРНУТЬ ОГРАНИЧЕНИЕ пути 5 Таким образом, я получаю циклы. Например, вместо A -> B -> D -> Z я получаю пути с циклами типа A -> B -> D -> E -> D -> Z. Если бы я мог избежать циклов, это могло бы быть обходным путем…