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 ответ

  1. используйте метки и индекс, чтобы найти два начальных узла
  2. возможно, рассмотрим 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

Другие вопросы по тегам