Как сделать пересечение обходов в гремлине - PullRequest
0 голосов
/ 31 марта 2020

Допустим, у меня есть 2 анонимных обхода A и B. Результатом обхода A является V [1], V [2], V [3], а результатом обхода B является V [3], V [4] и V [5].

И A, и B ищут свойства, которых не будет ни в одной отдельной вершине.

Обход "A" ищет свойство (x == y) который находится в V [1] и V [1] связан с V [2] и V [3], которые являются частью результата обхода.

Обход "B" ищет свойство (u == w ), который находится в V [5] и V [5] связан с V [3] и V [4], которые являются частью результата обхода.

Как мне найти пересечение этих результатов?

Я пытался сделать:

__.and(A, B)

Но результатом этого не является пересечение.

Например:

A = __. Has ('name ',' marko '). out ()

B = __. has (' name ',' jo sh '). out ()

__. и (A, B ) не является правильным.

Примечание. Для простоты взял приведенный выше пример. В реальном запросе A & B довольно большой, с несколькими объединениями в каждом из них.

Я прошел по следующим ссылкам:

https://groups.google.com/forum/#! Msg / gremlin-users / 6_MRJxBnivo / wT_71IAzCwAJ

операция пересечения гремлинов

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

1 Ответ

3 голосов
/ 31 марта 2020

Таким образом, вы можете попытаться сделать пересечение с шагом groupCount:

g.V().union(
    __.has('name', 'marko').out(),
    __.has('name', 'josh').out()
).groupCount().by().unfold()
.where(select(values).is(gt(1))).select(keys)

Другой способ - использовать упрощенный запрос, предложенный Стивеном в сообщении, которое вы упомянули:

g.V().has('name', 'marko').out().as('a').
V().has('name', 'josh').out().as('b').
select('a').
where('a',eq('b'))

Я попробовал их здесь: https://gremlify.com/31

...