next() 在 TinkerPop 中意味着什么

What next() means in TinkerPop

我目前正在阅读 TinkerPop3 Documentation

我很困惑的是我找不到关于next()的任何解释。

例如,w/ next() 或 w/o next() returns 相同顶点

gremlin> g.V().has('name', 'marko')
==>v[1]
gremlin> g.V().has('name', 'marko').next()
==>v[1]

但是,class 名称彼此不同。

gremlin> g.V().has('name', 'marko').getClass()
==>class org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal
gremlin> g.V().has('name', 'marko').next().getClass()
==>class org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerVertex

没有 'next()' 分配的变量没有值。

gremlin> marko = g.V().has('name', 'marko')
==>v[1]
gremlin> marko

甚至 clockWithResult() 输出完全不同。

gremlin> clockWithResult(1){g.V().both().barrier().both().barrier().both().barrier().count().next()}
==>1.079524
==>72
gremlin> clockWithResult(1){g.V().both().barrier().both().barrier().both().barrier().count()}
==>0.11863599999999999
==>[GraphStep([],vertex), VertexStep(BOTH,vertex), NoOpBarrierStep(2147483647), VertexStep(BOTH,vertex), NoOpBarrierStep(2147483647), VertexStep(BOTH,vertex), NoOpBarrierStep(2147483647), CountGlobalStep]

或者这个例子:

gremlin> g.V(1).out('knows').values('name').fold()
==>[vadas, josh]
gremlin> g.V(1).out('knows').values('name').fold().next()
==>vadas
==>josh

手册中还有许多其他例子让我感到困惑。

希望marko和他的朋友们能帮帮我。

简短的回答是 Gremlin 控制台会自动为您迭代结果。

x = g.V().has('name', 'marko')

在上面的示例中,x 将是一个 Traversal 实例,它是 Iterator 的一种类型。当控制台遇到 Iterator 时,它会自动展开它以便您可以看到结果。在这种情况下:

x = g.V().has('name', 'marko').next()

next() 的添加只是表示您想要调用 Iterator.next() - 换句话说,您想要从 Iterator 中获取第一项。因此,在上述情况下,x 将是 Vertex.

对于这种情况:

gremlin> marko = g.V().has('name', 'marko')
==>v[1]
gremlin> marko

你现在知道 marko 是一个 Iterator,所以当你再次计算它时,控制台会尝试迭代它。当然,控制台已经在上一行对其进行了迭代,因此当它再次尝试这样做时,没有任何额外的迭代。这是一个示例,可以更清楚地了解正在发生的事情:

gremlin> x = g.V();null
==>null
gremlin> x.next()
==>v[1]
gremlin> x.next()
==>v[2]
gremlin> x
==>v[3]
==>v[4]
==>v[5]
==>v[6]

请注意在第一行使用 ;null 以防止控制台重复 x。为什么?因为我的脚本 returns null 而不是 x

现在应该清楚您的 clock 示例在做什么...调用 next() 的第一行正在测量遍历的执行,第二行正在测量执行Traversal 结构。为什么在这种情况下需要调用 next()?因为 Traversal 在闭包内部 - 请记住,控制台仅迭代函数的 return 值,而不是脚本中的每个 Iterator

最后:

gremlin> g.V(1).out('knows').values('name').fold()
==>[vadas, josh]
gremlin> g.V(1).out('knows').values('name').fold().next()
==>vadas
==>josh

希望我上面讨论的所有其他内容能让您明白为什么 next() 会产生这种行为,但为了以防万一,这里是控制台本质上正在做的事情:

gremlin> x = g.V(1).out('knows').values('name').fold();null
==>null
gremlin> y = x.next();null
==>null
gremlin> y
==>vadas
==>josh