Объединить результаты нескольких запросов в Gremlin - PullRequest
3 голосов
/ 28 января 2020

Допустим, я хочу получить несколько вершин из своей базы данных:

g.V(1, 2, 3)

А затем у меня есть другой набор вершин:

g.V(4, 5, 6)

Представьте, что это не просто g.V() , но некоторые более сложные обходы, чтобы получить мои вершины. Но обход должен начинаться с V(), потому что я хочу выбрать из всех своих узлов.

Давайте также предположим, что я хочу сделать это несколько раз. Поэтому я мог бы объединить 7 разных наборов результатов. Каждый из них может иметь совершенно разные способы получения своих результатов.


Теперь я хочу объединить эти два результата в один набор результатов. Моя первая мысль была такой:

g.V(1, 2, 3).fold().as('x').V(4, 5, 6).fold().as('x').select(all, 'x').unfold()

Но это не работает. Второй вызов fold очистит мои «локальные переменные», потому что это барьерный шаг.

Моя текущая попытка такая:

g.V(1, 2, 3).fold().union(identity(), V(4, 5, 6).fold()).unfold()

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

Есть ли лучший способ выполнить sh простое объединение результатов двух разных запросов?

Ответы [ 2 ]

4 голосов
/ 28 января 2020

Как насчет использования aggregate():

gremlin> g.V(1,2,3).aggregate('x').fold().V(4,5,6).aggregate('x').cap('x')
==>[v[1],v[2],v[3],v[4],v[5],v[6]]
gremlin> g.inject(1).union(V(1,2,3).aggregate('x'),V(4,5,6).aggregate('x')).cap('x')
==>[v[1],v[2],v[3],v[4],v[5],v[6]]

В вашем вопросе не было заданного c обхода, поэтому мне пришлось придумать несколько надуманных примеров, но суть в том, что Вы можете использовать aggregate() для побочного эффекта вывода указанных c шагов в List, которые вы можете cap() в конце вашего обхода.

2 голосов
/ 29 января 2020

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

g.V(1, 2, 3).fold().
  union(identity(),
        V(4, 5, 6).fold(),
        V(7, 8, 9).fold(),
        ...).unfold()
...