Применить накопительную стоимость в обход - PullRequest
0 голосов
/ 09 января 2020

У меня огромный граф, около 1 миллиарда узлов и 1 миллиард ребер, граф направлен.

Пример узла: {weight: 0}

Мне нужно посетить каждый узел с самого начала и обновите значение веса.

Мой алгоритм принимает значение веса ввода для примера 1 и узла _key, затем выполняет следующие шаги:

  1. посещение узла, применение вес значение в атрибуте вес
  2. получить все исходящие узлы
  3. пересчитать новое вес значение для каждого исходящего узла
  4. a проверить новое вес значение для порог , если оно соответствует переполнению - пропустить (прекратить следовать за дочерними узлами)
  5. 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 ТБ оперативной памяти.

...