Gremlin Все кратчайшие пути из нескольких вершин в одну вершину
Следующий вопрос переполнения стека
Как повысить производительность по кратчайшему пути с помощью 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, где не допускаются циклы / сценарии. Все гремлиновые запросы должны начинаться с g.
и состоять из команд, соединенных вместе .
https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.html
1 ответ
Этот метод не может быть применен к нескольким начальным вершинам. Однако вы можете просто начать с другой стороны, так как это единственная известная вершина:
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()