Кратчайшие пути между двумя наборами узлов - PullRequest
0 голосов
/ 01 января 2019

Я создал граф в Neo4j с 10 миллионами узлов и 30 миллионами отношений.Каждый узел помечен как A (4 миллиона узлов), B (6 миллионов узлов) или C (20 узлов).
Узлы в A ведут к узлам в B. Узлы в B ведут к другим узлам в B и к узламв C.
Для каждого узла в A мне нужно найти ближайший узел (или узлы, если они находятся на одинаковом расстоянии) в C, и добавить идентификатор узла C в качестве значения свойства в Aузел.
Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 02 января 2019

Итак, мы смотрим на такую ​​модель (используя: LEAD, поскольку вы не указали тип отношения):

(:A)-[:LEAD]->(:B)
(:B)-[:LEAD]->(:B)
(:B)-[:LEAD]->(:C)

Процедуры APOC предлагает лучшее решение дляэтот, но он состоит из двух частей, так как сначала мы находим ближайший узел: C, используя процедуры расширителя пути , а затем повторно сопоставляем, используя это расстояние, чтобы получить полный набор: узлов C, достижимых на этом расстоянии.

Вы также можете использовать apoc.periodic.iterate () , чтобы вы могли пакетировать это, хотя вы можете поэкспериментировать с batchSize.

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

CALL apoc.periodic.iterate("MATCH (a:A) RETURN a",
 "CALL apoc.path.spanningTree(a, {relationshipFilter:'LEAD>', labelFilter:'/C', limit:1}) YIELD path
  WITH a, length(path) as length
  CALL apoc.path.subgraphNodes(a, {relationshipFilter:'LEAD>', labelFilter:'/C', maxLevel:length}) YIELD node
  WITH a, collect(node.id) as ids
  SET a.cIDs = ids",
  {batchSize:1000}) YIELD batches, total, errorMessages
  RETURN batches, total, errorMessages
...