Проверьте, соответствует ли график двум неперекрывающимся образцам
Учитывая этот сверхпростой граф с неизвестным числом вершин между A и Z, я могу легко проверить, удовлетворяется ли определенный шаблон, например
Есть ли вершина с именем "B", за которой в конечном итоге следует "D"?
ответил бы:
boolean matches = g.V().match(
as("b").has("name", "B"),
as("b").repeat(out()).until(has("name", "D")).as("d")
)
.hasNext();
Но как мне проверить, удовлетворены ли 2 (или более) неперекрывающихся шаблона? Например
Есть ли еще вершина с именем «G», за которой в конечном итоге следует «J»?
Я бы естественно сделал:
boolean matches = g.V().match(
as("b").has("name", "B"),
as("b").repeat(out()).until(has("name", "D")).as("d"),
as("g").has("name", "G"),
as("g").repeat(out()).until(has("name", "J")).as("j")
)
.hasNext();
Но это вызывает у меня ужас
Конечно, я могу начать обход заново с
2 ответа
Добавив еще один ответ, чтобы показать, что
gremlin> g.V().has('name','marko').as('a').
......1> union(
......2> repeat(out()).until(has("name", "vadas")).as('c').
......3> select('a', 'c'),
......4> repeat(out()).until(has("name", "ripple")).as('f').
......5> select('a', 'f')
......6> ).
......7> unfold().
......8> fold()
==>[a=v[1],c=v[2],a=v[1],f=v[5]]
Union step - это то, что вам нужно.
g.V().
union(
match(
__.as('a').has("name", "marko").as('b'),
__.as('b').repeat(out()).until(has("name", "vadas")).as('c')).
select('a', 'c'),
match(
__.as('d').has("name", "marko").as('e'),
__.as('e').repeat(out()).until(has("name", "ripple")).as('f')).
select('d', 'f')).
unfold().
fold()
Вы можете добавить в объединение любое количество совпадающих шаблонов. Union будет запускать дочерний обход на входящем выходе обхода V().
PS: Я этот запрос на современном графике в соответствии выполнилс документацией tinkerpop .