Gremlin在存储GremlinGroovyPipeline并在其上调用.count()时

时间:2012-10-31 04:08:28

标签: groovy gremlin

这可以按预期工作:

gremlin> root.out.outE.has('size', 4).count()
==>3
gremlin> result = root.out.outE.has('size', 4).count()
==>3
gremlin> result
==>3
gremlin> root.out.outE.has('count', 4).getClass()         
==>class com.tinkerpop.gremlin.groovy.GremlinGroovyPipeline

当我将GremlinGroovyPipeline存储到变量中时,我再也不能count()

gremlin> result = root.out.outE.has('size', 4)        
==>e[359:200:36028797018964014][200-sizes->40]
==>e[669:404:36028797018964014][404-sizes->400]
==>e[855:516:36028797018964014][516-sizes->524]
gremlin> result.count()
==>0
gremlin> result.getClass()
==>class com.tinkerpop.gremlin.groovy.GremlinGroovyPipeline

这对我来说很奇怪。看来,一旦分配了变量,结果就会消失。

我在BDB上使用Titan。

2 个答案:

答案 0 :(得分:3)

管道是一个迭代器,所以一旦管道耗尽,它就会“空”。 Gremlin控制台会自动为您重复管道,因此即使您已将管道存储到变量中,它也会有效地耗尽列表。

为清晰起见,请考虑此示例

gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> pipeline=g.v(1).out
==>v[2]
==>v[4]
==>v[3]
gremlin> pipeline.next()
com.tinkerpop.pipes.util.FastNoSuchElementException
Display stack trace? [yN] n
gremlin> pipeline.count()
==>0

请注意,管道中没有任何内容,就像您的示例中一样。所以...如果你想将非迭代管道“存储”在一个变量中供以后评估,你需要阻止控制台自动迭代它:

gremlin> pipeline=g.v(1).out;null
==>null
gremlin> pipeline.count()        
==>3

当然,一旦你迭代它......它是空的:

gremlin> pipeline.count()
==>0

然后你必须再次初始化该管道:

gremlin> pipeline=g.v(1).out;null
==>null
gremlin> pipeline.next()         
==>v[2]
gremlin> pipeline.next()
==>v[4]
gremlin> pipeline.next()
==>v[3]
gremlin> pipeline.next()
com.tinkerpop.pipes.util.FastNoSuchElementException
Display stack trace? [yN] n
gremlin> pipeline.count()        
==>0

因此,如果您想继续使用结果,那么您可以做的最好的事情就是像对自己的回复一样迭代到列表。

gremlin> l=[];g.v(1).out.fill(l)    
==>v[2]
==>v[4]
==>v[3]
gremlin> l.size()
==>3

答案 1 :(得分:0)

我发现的一个解决方案是首先将其转换为列表,但似乎并不理想,并且并没有真正告诉我为什么这个变量的行为不同:

gremlin> result = root.out.outE.has('size', 4).toList()
==>e[359:200:36028797018964014][200-sizes->40]
==>e[669:404:36028797018964014][404-sizes->400]
==>e[855:516:36028797018964014][516-sizes->524]
gremlin> result.size()
==>3