同一张图上的相同查询在Neptune与Gremlify上返回不同的结果

问题描述

我在Neptune上有一个很大的生产图,可以使用Gremlin Python查询。我编写了一个查询,该查询应该返回包含以任何方式连接到查询顶点(根顶点)的所有顶点和边的路径。

查询似乎并不总是返回我期望的所有顶点和边,因此我在海王星上制作了一个小样本图,在Gremlify上制作了相同的图:https://gremlify.com/d4xp81hwd1g

然后,我在Neptune上运行查询,并使用不同的根顶点对Gremlify进行两次。在这两种情况下,海王星返回的路径始终是Gremlify返回的路径的子集。

海王星图创建:

g.addV("c").property(id,"c139").iterate()
g.addV("c").property(id,"c121").iterate()
g.addV("c").property(id,"c146").iterate()
g.addV("c").property(id,"c128").iterate()

g.addV("d").property(id,"d5E0").iterate()
g.addV("d").property(id,"d546").iterate()
g.addV("d").property(id,"d434").iterate()
g.addV("d").property(id,"dDE5").iterate()
g.addV("d").property(id,"dFFE").iterate()

g.addE("has_d").from_(g.V("c139")).to(g.V("d5E0")).property(id,"c139_d5E0").iterate()
g.addE("has_d").from_(g.V("c139")).to(g.V("d546")).property(id,"c139_d546").iterate()
g.addE("has_d").from_(g.V("c121")).to(g.V("d5E0")).property(id,"c121_d5E0").iterate()
g.addE("has_d").from_(g.V("c121")).to(g.V("d546")).property(id,"c121_d546").iterate()
g.addE("has_d").from_(g.V("c121")).to(g.V("dDE5")).property(id,"c121_dDE5").iterate()
g.addE("has_d").from_(g.V("c121")).to(g.V("dFFE")).property(id,"c121_dFFE").iterate()
g.addE("has_d").from_(g.V("c121")).to(g.V("d434")).property(id,"c121_d434").iterate()
g.addE("has_d").from_(g.V("c146")).to(g.V("dDE5")).property(id,"c146_dDE5").iterate()
g.addE("has_d").from_(g.V("c128")).to(g.V("dFFE")).property(id,"c128_dFFE").iterate()
g.addE("has_d").from_(g.V("c128")).to(g.V("d434")).property(id,"c128_d434").iterate()

海王星查询

paths = (
    g.V('c121')
    .repeat(bothE().simplePath().otherV())
    .until(not_(bothE().simplePath()))
    .path()
    .by(valueMap(True))
    .toList()
)

for path in paths:
    for element in path:
        print(element[id],end = ' -> ')
    print('')

在上面的链接中可以看到Gremlify图和查询

结果:

ROOT VERTEX: c121

Neptune:  c121 -> c121_dDE5 -> dDE5 -> c146_dDE5 -> c146
Gremlify: c121 -> c121_dDE5 -> dDE5 -> c146_dDE5 -> c146

Neptune:  c121 -> c121_d5E0 -> d5E0 -> c139_d5E0 -> c139
Gremlify: c121 -> c121_d5E0 -> d5E0 -> c139_d5E0 -> c139 -> c139_d546 -> d546 -> c121_d546 -> c121

Neptune:  c121 -> c121_dFFE -> dFFE -> c128_dFFE -> c128
Gremlify: c121 -> c121_dFFE -> dFFE -> c128_dFFE -> c128 -> c128_d434 -> d434 -> c121_d434 -> c121

Neptune:  c121 -> c121_d434 -> d434 -> c128_d434 -> c128
Gremlify: c121 -> c121_d434 -> d434 -> c128_d434 -> c128 -> c128_dFFE -> dFFE -> c121_dFFE -> c121

Neptune:  c121 -> c121_d546 -> d546 -> c139_d546 -> c139 ->
Gremlify: c121 -> c121_d546 -> d546 -> c139_d546 -> c139 -> c139_d5E0 -> d5E0 -> c121_d5E0 -> c121

ROOT VERTEX: c139

Neptune:  c139 -> c139_d546 -> d546 -> c121_d546 -> c121
Gremlify: c139 -> c139_d546 -> d546 -> c121_d546 -> c121 -> c121_d5E0 -> d5E0 -> c139_d5E0 -> c139

Neptune:  c139 -> c139_d546 -> d546 -> c121_d546 -> c121
Gremlify: c139 -> c139_d546 -> d546 -> c121_d546 -> c121 -> c121_dDE5 -> dDE5 -> c146_dDE5 -> c146

Neptune:  c139 -> c139_d5E0 -> d5E0 -> c121_d5E0 -> c121
Gremlify: c139 -> c139_d5E0 -> d5E0 -> c121_d5E0 -> c121 -> c121_d546 -> d546 -> c139_d546 -> c139

Neptune:  c139 -> c139_d5E0 -> d5E0 -> c121_d5E0 -> c121
Gremlify: c139 -> c139_d5E0 -> d5E0 -> c121_d5E0 -> c121 -> c121_dDE5 -> dDE5 -> c146_dDE5 -> c146

Neptune:  c139 -> c139_d546 -> d546 -> c121_d546 -> c121 -> c121_dFFE -> dFFE
Gremlify: c139 -> c139_d546 -> d546 -> c121_d546 -> c121 -> c121_dFFE -> dFFE -> c128_dFFE -> c128 -> c128_d434 -> d434 -> c121_d434 -> c121

Neptune:  c139 -> c139_d546 -> d546 -> c121_d546 -> c121 -> c121_d434 -> d434
Gremlify: c139 -> c139_d546 -> d546 -> c121_d546 -> c121 -> c121_d434 -> d434 -> c128_d434 -> c128 -> c128_dFFE -> dFFE -> c121_dFFE -> c121

Neptune:  c139 -> c139_d5E0 -> d5E0 -> c121_d5E0 -> c121 -> c121_dFFE -> dFFE
Gremlify: c139 -> c139_d5E0 -> d5E0 -> c121_d5E0 -> c121 -> c121_dFFE -> dFFE -> c128_dFFE -> c128 -> c128_d434 -> d434 -> c121_d434 -> c121

Neptune:  c139 -> c139_d5E0 -> d5E0 -> c121_d5E0 -> c121 -> c121_d434 -> d434
Gremlify: c139 -> c139_d5E0 -> d5E0 -> c121_d5E0 -> c121 -> c121_d434 -> d434 -> c128_d434 -> c128 -> c128_dFFE -> dFFE -> c121_dFFE -> c121

为什么我看到这些不同的结果?我如何在Neptune上通过Python查询获得Gremlify中获得的预期结果?

解决方法

感谢此处的详细信息。 Neptune将进行离线调查,但作为一种解决方法,请尝试:

g.V("c121")
.repeat(
    union(
        outE().simplePath().inV(),inE().simplePath().outV()
    )
)
.until(not(bothE().simplePath()))
.path().by(valueMap(True))
.toList()