10

我目前正在阅读 TinkerPop3文档

我感到困惑的是,我找不到任何关于next().

例如,w/next() 或 w/o next() 返回相同的顶点

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

但是,类名彼此不同。

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

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

我希望马尔科和他的朋友们能帮助我。

4

1 回答 1

17

简短的回答是 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。为什么?因为我的脚本返回null的不是x.

现在应该清楚您的示例clock正在做什么......调用的第一行next()是测量遍历的执行,第二行是测量Traversal构造的执行。为什么你需要next()在这种情况下打电话?因为在Traversal闭包内部 - 请记住,控制台只迭代函数的返回值,而不是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
于 2015-12-01T11:29:57.473 回答