Gremlin Все кратчайшие пути из нескольких вершин в одну вершину - PullRequest
0 голосов
/ 10 сентября 2018

Следующий вопрос переполнения стека

Как повысить производительность по кратчайшему пути с помощью Gremlin?

показывает, как найти кратчайший путь от начальной одиночной начальной вершины с идентификатором 687 до конечной вершины с идентификатором 1343 и делает это эффективно, гарантируя, что пути не повторяются с использованием store, without, и aggregate

g.V(687).store('x').repeat(out().where(without('x')).aggregate('x')).until(hasId(1343)).limit(1).path()

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

g.V().hasLabel('label').store('x').repeat(out().where(without('x')).aggregate('x')).until(hasId(1343)).limit(1).path()

Я пробовал несколько конструкций с двумя повторениями в утверждении, но не смог получить независимый store('x') для каждой начальной вершины. Я также использую платформу AWS Neptune, поэтому она ограничивает использование Gremlin, где не допускаются циклы / сценарии. Все запросы gremlin должны начинаться с g. и состоять из команд, связанных вместе с .

https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.html

1 Ответ

0 голосов
/ 11 сентября 2018

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

g.V(1343).store('x').
  repeat(__.in().where(without('x')).aggregate('x')).
    until(hasLabel('label')).
  path()

Если одна из начальных вершин может быть частью пути другой начальной вершины, то вы не можете разбить потенциальную начальную вершину и вместо этого сделать это:

g.V(1343).store('x').
  repeat(__.in().where(without('x')).aggregate('x')).
    emit(hasLabel('label')).
  path()
...