检查图形是否匹配两个非重叠模式

Check if the graph matches two non-overlapping patterns

鉴于这个超简单的图,A 和 Z 之间的顶点数量未知,我可以轻松检查是否满足特定模式,例如

Is there a vertex named "B" eventually followed by "D"?

将由以下人员回答:

boolean matches = g.V().match(
            as("b").has("name", "B"),
            as("b").repeat(out()).until(has("name", "D")).as("d")
        )
        .hasNext();

但是我如何检查是否满足 2 个(或更多)非重叠模式?例如

Is there also a vertex named "G" eventually followed by "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(); 

但这让我感到害怕The provided match pattern is unsolvable。不知道为什么这会有问题...

我当然可以从 g.V() 重新开始遍历并单独尝试每个匹配项,但我试图了解这是否真的有必要,如果需要,为什么。

联合步骤就是你所需要的。

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 documentation.

在现代图形上查询

添加另一个答案只是为了表明在这种情况下并不需要 match 步骤:

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]]