Проверьте, соответствует ли график двум неперекрывающимся образцам

Учитывая этот сверхпростой граф с неизвестным числом вершин между 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 ответа

Добавив еще один ответ, чтобы показать, что step не нужен в таких случаях:

      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 .

Другие вопросы по тегам