Обход подмножества Graph для сложных запросов

Я новичок в Gremlin и пытаюсь сделать запрос более эффективным.

С графиком, который выглядит примерно так:

[vertex: label=a] -> [vertex: label=b] -> [vertex: label=c] -> [vertex: label=d]

Мне нужно пройти по графику и получить результаты для каждого шага обхода.

Например, из моего базового Vertex мне может понадобиться получить все, что с ним связано, с меткой b и все, что связано с b, с меткой c и так далее.

Я могу делать запросы по отдельности следующим образом:

results1 = g.V('someid').out().hasLabel('b').toList()
results2 = g.V('someid').out().hasLabel('b').out().hasLabel('c').toList()
results3 = g.V('someid').out().hasLabel('b').out().hasLabel('c').out().hasLabel('d').toList()

но это кажется нелогичным, и время отклика начинает накапливаться.

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

РЕДАКТИРОВАТЬ:

Я нашел шаг Union, но он, похоже, объединяет несколько небольших запросов в один большой запрос, и я считаю, что это приводит к той же неэффективности, что и выполнение всех запросов по отдельности.


person TKems    schedule 18.09.2020    source источник
comment
Пытаюсь убедиться, что я полностью понимаю ваш вопрос. Вы ищете способ начать будущий обход с мест, которые вы нашли раньше? Если это так, вы можете передать список идентификаторов на шаг V() в качестве одного из вариантов.   -  person Kelvin Lawrence    schedule 18.09.2020
comment
Извините, если я не очень ясно выразился. При запуске запроса у меня есть один идентификатор, который я передаю V(). Затем мне нужно рекурсивно получить отношения для этой вершины. Поэтому мне нужны V()->A и V()->A->B и V()->A->B->C и т. д.   -  person TKems    schedule 18.09.2020


Ответы (1)


Чтобы вернуть path того, куда был направлен ваш запрос, в Gremlin довольно просто. Вот простой пример использования набора данных, который моделирует маршруты авиакомпаний:

g.V('3').  
  repeat(out().hasLabel('airport').simplePath()).
  until(has('code','AGR')).
  limit(5).
  path().
    by('code')

==>[AUS,JFK,BOM,AGR]
==>[AUS,YYZ,BOM,AGR]
==>[AUS,LHR,BOM,AGR]
==>[AUS,FRA,BOM,AGR]
==>[AUS,EWR,BOM,AGR] 

Вы найдете несколько связанных примеров здесь: http://www.kelvinlawrence.net/book/PracticalGremlin.html http://www.kelvinlawrence.net/book/PracticalGremlin.pdf

person Kelvin Lawrence    schedule 18.09.2020
comment
Спасибо, Кельвин, path было именно то, что я искал. Мне просто нужно поработать над группировкой результатов. Между прочим, я использовал вашу книгу, чтобы забрать Гремлина еще до того, как вы ответили на мой вопрос! Это отличный ресурс, я думаю, я не очень хороший читатель, так как пропустил этот момент! - person TKems; 21.09.2020