Получение одного гремлина с несколькими путями - PullRequest
0 голосов
/ 29 января 2019

Возникают проблемы с поиском хорошего одиночного запроса для получения нужных результатов.

В этом сценарии у меня есть отчеты, магазины и организации.

Отчеты могут быть только когда-либопринадлежат одному магазину или одному орг.Никогда оба.Магазины всегда принадлежат организации и могут принадлежать только одной организации.Органы могут быть когда-либо только подорганизацией одной организации, но могут быть в цепочке из нескольких подорг.

Я ищу один запрос, который получит идентификатор отчета и даст мне единственныйОрган верхнего уровня, независимо от того, сколько уровней подоргов.

Сценарии:

  1. report> store> org
  2. report> store> org> org> org
  3. report> org
  4. report> org> org> org

Текущие имена ребер - это просто имена меток входа и выхода reportStore & storeReport, reportOrg & orgReport, storeOrg & orgStore, suborgOrg & orgSuborg

Самое дальнее, что я получил, это g.V('<id>').until(has('label','org')).repeat(out()).limit(1)

, ноясно, что это не прямой выстрел, и он остановится, как только доберется до первой организации.

1 Ответ

0 голосов
/ 29 января 2019

При задании вопросов о 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
...