5

现在我可以生成一个查询来创建我想要的任意数量的顶点和边。

例如

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')

^^^^^^^^^^^^^^这个不行

希望你能理解我想要做什么。谁能帮我?

谢谢

4

1 回答 1

10

您有一个fold()which 是ReducingBarrierStep在您的步骤标签之后跟随的,as('a')并且在该步骤之后“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]

如果您需要返回所有元素,只需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()最后使用 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]]
于 2018-08-07T16:21:29.287 回答