为什么不能将Gremlin GraphTraversal捕获为Groovy变量?

时间:2014-12-02 19:46:20

标签: groovy gremlin tinkerpop tinkerpop3

我正在尝试使用TinkerPop3文档中的traversal examples。在Gremlin shell中加载了classic graph g = TinkerFactory.createClassic()

gremlin> marko = g.v(1)
==>v[1]
gremlin> marko
==>v[1]

然而:

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

为什么第二种形式不能捕获v[1]


鉴于第二种形式,尝试使用该变量会导致错误:

gremlin> marko.out('knows')
The traversal strategies are complete and the traversal can no longer have steps added to it
Display stack trace? [yN] 

1 个答案:

答案 0 :(得分:3)

您正在处理每个结果中的不同类类型。考虑下面的控制台会话:

gremlin> g = TinkerFactory.createClassic()
==>tinkergraph[vertices:6 edges:6]
gremlin> marko = g.v(1)
==>v[1]
gremlin> marko.class
==>class com.tinkerpop.gremlin.tinkergraph.structure.TinkerVertex

以上结果为Vertex,但正如您所见:

gremlin> marko = g.V().has('name','marko')
==>v[1]
gremlin> marko.class
==>class com.tinkerpop.gremlin.tinkergraph.process.graph.TinkerGraphTraversal

你得到一个Traversal个实例。您可以看到v[1]控制台的输出,因为控制台已自动为您迭代结果。由于您已经迭代了它,marko变为空:

gremlin> marko.hasNext()
==>false

如果您想手动迭代,请执行以下操作:

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