问题描述
我在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('')
结果:
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()