Оптимизация запроса Neo4j для поиска пути - PullRequest
0 голосов
/ 26 марта 2020
  • Версия Neo4j: 3.5.16

  • Какой тип API / драйвера вы используете: Python API с py2neo для запуска запроса с графиком. run ()

  • Py2neo версия: 4.3.0.

Привет всем,

Я пытаюсь оптимизировать запрос шифрования для получения пути переменной длины.

График создается каждый раз, когда поступают данные, а startNode и endNode фиксируются в свойстве name. После создания графа у меня есть startNode и endNode, и следствие / цель:

"Из всех возможных путей с минимальной длиной X и максимальной длиной Y я хочу найти самый короткий путь, который дает наибольшее значение агрегированных отношений ".

То, что мне действительно удалось сделать, это: «получить путь длины между X и Y, который дает наибольшее значение агрегированного отношения» с помощью следующего cyper-запроса:

MATCH path = (startN:Batch { name: $startNode })-[:CHANGES_TO*4..7]->(endN:Batch { name: $endNode })
RETURN path,
REDUCE (s = 1, r IN RELATIONSHIPS(path) | s * r.rateValue) AS finalBatchValue
ORDER BY finalBatchValue DESC 
LIMIT 1

Howerver, требуется время, чтобы бежать. ¿Может ли кто-нибудь предоставить идеи о том, как это оптимизировать, чтобы как sh выполнить задачу shorttestPath, так и оптимизировать запрос для более быстрого выполнения, если это возможно?

Я пытался заставить его работать с APO C методы типа allShortestPaths или Dijkstra безуспешны; в итоге он вернулся по кратчайшему пути, и я не смог определить минимальное количество узлов для рассмотрения.

Любая помощь очень ценится.

1 Ответ

1 голос
/ 27 марта 2020

Так как вы в основном ищете сильнейшего в самой короткой длине. Вы можете обойти проблему производительности с помощью хитрости. Вы можете запросить график с фиксированной длиной, чем переменной длины. Но вы должны запросить n2-n1 + 1 раз, в вашем случае 4 раза, сначала длиной 4, а затем 5 и так далее. Вы можете прекратить запрашивать, если вы найдете путь в любой точке. Этот подход значительно уменьшит объем данных, загружаемых каждый раз. Но вы должны попасть в график несколько раз. Скорее всего, среднее время, затрачиваемое на четыре подхода, будет меньше, чем одно попадание с переменной длиной. Причина в том, что вы не рассчитываете все пути большей длины, если найдете решение меньшей длины. Так как, чем дольше длится путь, затраченное время будет расти в геометрической прогрессии.

Это невозможно только при использовании шифра. Один из способов - написать процедуру neo4j в java и использовать ее в запросе шифра. Второй способ: нажать neo4j, используя другой запрос. я пишу python код для вашего случая здесь,

query = 'MATCH path = (startN:Batch { name: $startNode })-[:CHANGES_TO*LENGTH_PARAM]->(endN:Batch { name: $endNode })
RETURN path,
REDUCE (s = 1, r IN RELATIONSHIPS(path) | s * r.rateValue) AS finalBatchValue
ORDER BY finalBatchValue DESC 
LIMIT 1'
for length in range(4,8):
      query  = query.replace('LENGTH_PARAM',str(x))
      result = graph.run(query)
      #if result size > 0 
      #your implementation 
      #final_result= result['path'] 
      #return final_result

Вот как это работает, здесь, в худшем случае, вам нужно нажать четыре раза на график для каждой пары начальных и конечных узлов. Сетевые вызовы увеличиваются, но среднее время ожидания должно быть уменьшено.

С помощью плагинов java оно может быть уменьшено до одного нажатия, как в предыдущем запросе, так как вы можете выполнить часть l oop внутри java код

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