При задании вопросов о Gremlin, всегда лучше включить скрипт Gremlin, который создает некоторые примеры данных, например, такие:
g.addV('report').property('name','report-a').as('a').
addV('report').property('name','report-b').as('b').
addV('store').property('name','store').as('s').
addV('org').property('name','org-z').as('z').
addV('org').property('name','org-y').as('y').
addV('org').property('name','org-x').as('x').
addV('org').property('name','org-w').as('w').
addE('link').from('a').to('s').
addE('link').from('s').to('z').
addE('link').from('z').to('y').
addE('link').from('y').to('x').
addE('link').from('b').to('w').iterate()
В этих данных выше я собираю их для "report-a"вы хотите вернуть «org-x», а для «report-b» вы хотите вернуть «org-w» (то есть от листа в дереве, проходящего до самой верхней вершины).Ваши метки ребер, похоже, не имели никакого отношения к запросу, поэтому я для простоты опустил их в образец.
Вы правильно использовали repeat()
, но, как вы упомянули, использование until()
может прервать ваш цикл слишком рано.В этом случае, учитывая имеющуюся у вас структуру данных, вы можете разрешить самому завершению цикла - он просто прекратит итерацию, когда достигнет последней «org».Важной частью является emit()
последняя вершина, которую вы можете обнаружить, ища вершину без исходящих ребер, которая в Gremlin равна: __.not(outE())
.Ваш рабочий запрос, таким образом:
gremlin> g.V().has('report','name','report-a').
......1> repeat(out()).
......2> emit(__.not(outE())).
......3> values('name')
==>org-x
gremlin> g.V().has('report','name','report-b').
......1> repeat(out()).
......2> emit(__.not(outE())).
......3> values('name')
==>org-w