Указание начальной точки для алгоритма обхода графа в neo4j - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь написать алгоритм, который будет распространять значения от начального узла до всего подключенного компонента.В основном, если A получает 5 запросов, и A отправляет 5 запросов B для каждого запроса, который получает A, B получит 25 запросов.

Итак, в основном я пытаюсь перейти от этого

enter image description here

к этому

enter image description here

Я написал следующий фрагмент в neo4j:

MATCH (a:Loc)-[r:ROAD]->(b:Loc)
 SET b.volume = b.volume + a.volume * r.cost
 RETURN a,r,b

Но чего я не знаю, так это как я должен указать начальную точку для этого алгоритма для start ?Похоже, что в этом случае neo4j корректно обновляет значения, но я не думаю, что это сработает для большого графика.Я хочу явно заставить алгоритм начать распространение значений из узла START.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

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

Обратите внимание, что я добавил idсвойство для узлов :Loc, но я использовал его только для выбора начала (и для печати узла id в конце).

MATCH p=(n:Loc)<-[:ROAD*]-(:Loc {id: 0})
WITH DISTINCT n, max(length(p)) as maxLp
ORDER BY maxLp  // order the nodes by their maximum distance from start
MATCH (n)<-[r:ROAD]-(p:Loc)
SET n.volume = n.volume + r.cost * p.volume
RETURN DISTINCT n.id, n.volume

И вот результат:

n.id    n.volume
1           4000
2         200000
3         200000
4       16400000
5      508000000
6    21632000000

Идея состояла в том, чтобы получить самые длинные пути к каждому узлу от начального узла.Они упорядочены по «близости», а затем тома обновляются в порядке «близости».

0 голосов
/ 06 февраля 2019

В этом случае планировщик будет использовать метки, чтобы найти начальные места для запроса (вы можете выполнить EXPLAIN запроса, чтобы увидеть план запроса), поэтому он будет соответствовать всем: найдите узлы и разверните шаблон иизмените свойства соответственно.

Это будет для всех: узлы Loc - это то, что вы хотите, или вы хотите, чтобы это применялось только к некоторой меньшей части вашего графика, достижимой с какого-то начального узла?

...