现在,我能够生成一个查询,以创建任意数量的顶点和边。
例如
g.V().addV('vert1').as('a').addV('vert2').as('b').addE('has').from('a').to('b')
^^^^^^^^^^^^^^这可行。很容易吧?现在让我们创建一个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')
^^^^^^^^^^^^^^^
希望您能理解我正在尝试做的事情。谁能帮我吗?
谢谢
答案 0 :(得分:4)
您有一个fold()
,它是ReducingBarrierStep
,紧跟在步骤标签as('a')
之后,并且到该位置的“ a”路径历史记录丢失了。您可以详细了解Gremlin here的这一方面。
您只需要重新编写查询即可解决该问题-一种方法可能是只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]
如果需要返回所有元素,只需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]]