У меня огромный граф, около 1 миллиарда узлов и 1 миллиард ребер, граф направлен.
Пример узла: {weight: 0}
Мне нужно посетить каждый узел с самого начала и обновите значение веса.
Мой алгоритм принимает значение веса ввода для примера 1 и узла _key, затем выполняет следующие шаги:
- посещение узла, применение вес значение в атрибуте вес
- получить все исходящие узлы
- пересчитать новое вес значение для каждого исходящего узла
- a проверить новое вес значение для порог , если оно соответствует переполнению - пропустить (прекратить следовать за дочерними узлами)
- b выполнить шаг 1.
Основная сложность заключается в пересчете значения, основанного на предыдущем значении веса (родительский узел).
Пример путей графика :
- a - b - d
- a - b - e - h
- a - c - f - h
- a - c - g
Используя вышеописанный алгоритм, я должен применить
- a.weight, установленный в "1"
- b.weight и c .weight установлен в (a.weight / число исходящих из a)
- e.weight установлен в (b.weight / number outgoings from b)
- и так далее ...
Я проверяю несколько подходов:
- Временная переменная (Let): неизменяемая, поэтому накопление невозможно.
- Функция Pure User: основана на массиве p. вершины [*] в обходе сделают слишком много избыточных вычислений.
- Агрегация: не разрешать использовать временную переменную взамен.
Как мне добиться того, чтобы обновления выполнялись в одном aql-запросе?
Можно ли изменить вершину в массиве путей?
FOR v,e,p IN 0..4 OUTBOUND @start GRAPH 'graph'
let lvl = LENGTH(p.vertices)
p.vertices[lvl-1].weight = xxx
RETURN p.vertices[*]
PS Сервер имеет около 1 ТБ оперативной памяти.