2015-12-01 77 views
4

意味着我」現在讀TinkerPop3 Documentation下一步做什麼()在TinkerPop有關

我感到困惑的是,我無法找到有關next()任何解釋。

例如,瓦特/下一個()或W/O的next()返回相同vertext

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 
手冊中

,還有很多其他的例子這使我困惑。

我希望marko和他的朋友會幫助我。

在先進的感謝。

回答

7

簡而言之,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 

你現在知道markoIterator,所以當你再次評估它,控制檯嘗試重複它。當然,控制檯已經在前一行重複了它,所以當它再次嘗試時,沒有什麼額外的迭代。下面是進行關於正在發生的事情更明顯的例子:

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] 

注意事項,防止控制檯從迭代x第一線使用;null。爲什麼?因爲我的腳本不會返回。

現在應該清楚您的示例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 
+0

謝謝你的偉大的圖形框架。 ;) –

+0

每個gremlin片段都摘錄自[TinkerPop3 Documentation](http://tinkerpop.incubator.apache.org/docs/3.0.1-incubating/#barrier-step) 所以,「爲什麼你需要打電話給next()在這種情況下?「 =>手動調用'next()';) –

+0

請您回答[此問題](http://stackoverflow.com/questions/34285006/index-does-not-work-when-using-order-by-在-泰坦)?如果可以的話,我真的很感激。 –