Gremlin 小精灵合并以添加多个顶点和边

Gremlin 小精灵合并以添加多个顶点和边,gremlin,tinkerpop3,amazon-neptune,Gremlin,Tinkerpop3,Amazon Neptune,现在,我能够生成一个查询来创建任意多个顶点和边 e、 g ^^^^^^^^^^^^^这很有效。很简单,对吧?现在,让我们创建一个gremlin查询,该查询仅在这些顶点的标签唯一时创建这些顶点。然后在两者之间创建一条边 g.V().has(label,'vert1').fold().coalesce(unfold(),addV('vert1')).as('a').V().has(label,'vert2').fold().coalesce(unfold(),addV('vert2')).as('b

现在,我能够生成一个查询来创建任意多个顶点和边

e、 g

^^^^^^^^^^^^^这很有效。很简单,对吧?现在,让我们创建一个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')
^^^^^^^^^^^^^这行不通

希望你能理解我想做什么。有人能帮我吗

谢谢

您有一个
fold()
,它是一个
还原障碍步骤
,位于
的步骤标签后面,作为('a')
,在该步骤之后,“a”的路径历史记录丢失。你可以阅读更多关于小精灵这方面的内容

您只需要重新编写查询来解释这一点-一种方法可能是只
aggregate()
a的值,而不是简单地将步骤命名为“a”:

如果需要返回所有元素,只需
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]]
当然,在结尾使用
select()
可能也没那么糟糕:

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

是否有可能将“a”存储为展开状态,以便边缘可以像addE('has')一样构造。from('a')。to('b')?回答我上面的评论,它看起来像addE('has')。from(选择('a')。展开())。to(选择('b')。展开)是我要找的。谢谢你的帮助,斯蒂芬。您是您提出的解决方案的核心。有没有办法让创建的所有内容都返回?您可以看到e[2][0-has->1]是您的返回值。如果我想要两个顶点都返回呢?希望除了在末尾添加select('a','b')之外还有其他选择。更新了我的答案-我只需要
project()
结果边。我认为你的
select()
想法也不错。实际上,这可能是最有效的方法,因为这些元素已经在内存中了。嗨@stephenmallette,你能帮我回答我的问题吗。第一行
g.V().addV('vert1')。as('a')。addV('vert2')。as('b')。addE('has')。from('a')。to('b')
在AWS Neptune中对我不起作用。知道为什么吗?似乎
.as()
是无效语法您看到的错误是什么?
g.V().addV('vert1')。as('a')。addV('vert2')。as('b')。addE('has')。from('a')。to('b')
^syntaxror:无效语法。您在这里看不到它,但箭头指向as()子句。查看此处的源代码,我无法看到定义的as步骤。这很奇怪,不知道为什么会这样。这可能是@stephenmalette的一个问题。你有没有其他语言可以使用?我知道gremlin.net开发得很好。@cryanbhu在进一步研究python遍历类之后,看起来这个步骤被定义为。请尝试
g.addV('vert1')。as_u('a')。addV('vert2')。as_u('b')。addE('has')。from('a')。to('b')
。快乐编码!
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]]
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]]