Neo4j Cypher найти все пути изучения отсортированных отношений
В течение нескольких дней я изо всех сил пытался найти способ найти все пути (до максимальной длины) между двумя узлами, в то же время управляя исследованием пути Neo4j путем сортировки отношений, которые будут изучаться (по одному из их свойств).
Итак, чтобы быть ясным, допустим, я хочу найти K лучших путей между двумя узлами до максимальной длины M. Запрос будет выглядеть так:
match (source{name:"source"}), (target{name:"target"}),
p = (source)-[*..M]->(target)
return p order by length(p) limit K;
Все идет нормально. Но допустим, что отношения пути имеют свойство, называемое "приоритет". Я хочу написать запрос, который сообщает Neo4j на каждом этапе исследования пути, какие отношения следует изучить в первую очередь.
Я знаю, что это возможно, когда я использую библиотеки Java и встроенную базу данных (реализовав интерфейс PathExpander и предоставив его в качестве входных данных для функции GraphAlgoFactory.allSimplePaths() в Java). Но сейчас я пытаюсь найти способ сделать это в режиме доступа к базе данных в режиме сервера, используя Bolt или REST API.
Есть ли способ сделать это в режиме сервера? Или, может быть, использовать функции библиотек Java при доступе к графику в режиме сервера?
1 ответ
- используйте метки и индекс, чтобы найти два начальных узла
- возможно, рассмотрим allShortestPaths, чтобы сделать это быстрее
попробуй это:
match (source{name:"source"}), (target{name:"target"}),
p = (source)-[rels:*..20]->(target)
return p, reduce(prio=0, r IN rels | prio + r.priority) as priority
order by priority ASC, length(p)
limit 100;
У меня была очень похожая проблема. Я пытался найти кратчайший путь от одного узла ко всем другим узлам. Я написал запрос, аналогичный тому, что был в ответе выше ( /questions/4988072/neo4j-cypher-najti-vse-puti-izucheniya-otsortirovannyih-otnoshenij/4988082#4988082), и не смог заставить его выполнить в разумные сроки.
Спрашиваем, могут ли Graph DB работать с неуказанными конечными узлами? указал мне на решение:
Single Shortest Path
алгоритм.
В Neo4j вам необходимо установить библиотеку Graph Data Science Library и использовать эту функцию:
gds.alpha.shortestPath.deltaStepping.stream