Gremlin 合并以添加多个顶点和边
Gremlin Coalesce To Add Multiple Vertices and Edges
现在我可以生成一个查询来创建任意数量的顶点和边。
例如
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')
^^^^^^^^^^^^^^这个不行
希望你能理解我想做什么。谁能帮帮我?
谢谢
您有一个 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]
如果您需要 return 所有元素,只需 project()
returned 边并根据需要转换结果:
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]]
现在我可以生成一个查询来创建任意数量的顶点和边。
例如
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')
^^^^^^^^^^^^^^这个不行
希望你能理解我想做什么。谁能帮帮我?
谢谢
您有一个 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]
如果您需要 return 所有元素,只需 project()
returned 边并根据需要转换结果:
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]]