使用repeat()和times()一次创建多个边缘

时间:2019-06-14 07:03:39

标签: gremlin

如何在我的repeat(..)上使用times()步骤一次创建多个相同的边?

g.V().has('Label1', 'id', '1234').repeat(addE('HAS').from(g.V().has('Label2', 'id', '5678'))).times(5)

我认为它会向该顶点添加5次边缘,实际上,当times()大于1时,它什么也不返回。为什么会这样?我将如何正确使用repeat()?

1 个答案:

答案 0 :(得分:0)

我不确定您使用的是哪个图形数据库,但令您感到惊讶的是,您没有遇到Gremlin的错误,并且该错误会提示您错误所在。

gremlin> g.V().has('person','name','marko').repeat(addE('knows').from(V().has('person','name','stephen'))).times(5)
org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerEdge cannot be cast to org.apache.tinkerpop.gremlin.structure.Vertex
Type ':help' or ':h' for help.
Display stack trace? [yN]

repeat()步骤并不意味着每次迭代都使用相同的输入简单地执行相同的子遍历。它旨在执行与上一次迭代的输出相同的子遍历作为新输入。这意味着在第一次迭代中,我们初始化了以下子遍历:

addE('knows').from(V().has('person','name','stephen'))

具有“ marko”顶点,但是遍历的输出是Edge(因为addE()的输出是Edge)。在第二次迭代中,该边缘成为addE()的输入,因此....错误。...因为您无法在边缘上调用addE()

虽然您想使用repeat()进行这种类型的流控制,但是可以,但是您需要安排子遍历,以使输入在每次迭代中都具有相同的初始顶点:

gremlin> g.addV('person').property('name','marko').addV('person').property('name','stephen').iterate()
gremlin> g.V().has('person','name','marko').as('m').
......1>   V().has('person','name','stephen').as('s').
......2>   repeat(select('m').addE('knows').to('s')).
......3>     times(3).iterate()
gremlin> g.E()
==>e[4][0-knows->2]
==>e[5][0-knows->2]
==>e[6][0-knows->2]