Gremlin Coalesce添加多个顶点和边

Aus*_*ede 2 gremlin tinkerpop3 amazon-neptune

现在,我能够生成查询以创建所需的任意数量的顶点和边。

例如

g.V().addV('vert1').as('a').addV('vert2').as('b').addE('has').from('a').to('b')
Run Code Online (Sandbox Code Playgroud)

^^^^^^^^^^^^^^^这行得通。很容易吧?现在让我们创建一个gremlin查询,该查询仅在标签唯一的情况下创建这些顶点。然后在两者之间创建一条边。

g.V().has(label,'vert1').fold().coalesce(unfold(),addV('vert1')).as('a').V().has(label,'vert2').fold().coalesce(unfold(),addV('vert2')).as('b').addE('has').from('a').to('b')
Run Code Online (Sandbox Code Playgroud)

^^^^^^^^^^^^^^^这不起作用

希望您能理解我正在尝试做的事情。谁能帮我?

谢谢

ste*_*tte 6

你有fold()这是一个ReducingBarrierStep在你的一步标签后跟随as('a')和路径历史“一”是步后丢失。您可以在此处阅读有关Gremlin的更多信息。

您只需要重新编写查询即可解决该问题-一种方法可能是仅aggregate()使用“ a”的值,而不是简单地命名步骤“ a”:

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.V().
......1>   has(label,'vert1').fold().
......2>   coalesce(unfold(),
......3>            addV('vert1')).aggregate('a').
......4>   V().has(label,'vert2').fold().
......5>   coalesce(unfold(),
......6>            addV('vert2')).as('b').
......7>   select('a').unfold().
......8>   addE('has').to('b')
==>e[2][0-has->1]
Run Code Online (Sandbox Code Playgroud)

如果需要返回所有元素,则仅project()返回边缘并根据需要转换结果:

gremlin> g.V().
......1>   has(label,'vert1').fold().
......2>   coalesce(unfold(),
......3>            addV('vert1')).aggregate('a').
......4>   V().has(label,'vert2').fold().
......5>   coalesce(unfold(),
......6>            addV('vert2')).as('b').
......7>   select('a').unfold().
......8>   addE('has').to('b').
......9>   project('e','in','out').
.....10>     by().
.....11>     by(inV()).
.....12>     by(outV())
==>[e:e[2][0-has->1],in:v[1],out:v[0]]
Run Code Online (Sandbox Code Playgroud)

当然,select()在结尾使用a 可能也不错:

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.V().
......1>   has(label,'vert1').fold().
......2>   coalesce(unfold(),
......3>            addV('vert1')).aggregate('a').
......4>   V().has(label,'vert2').fold().
......5>   coalesce(unfold(),
......6>            addV('vert2')).as('b').
......7>   select('a').unfold().
......8>   addE('has').to('b').as('x').
......9>   select('a','b','x')
==>[a:[v[0]],b:v[1],x:e[2][0-has->1]]
Run Code Online (Sandbox Code Playgroud)