检查图形是否匹配两个非重叠模式
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]]
鉴于这个超简单的图,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]]