com.tinkerpop.pipes.Pipe 实现可以安全地缓存并稍后在其他图形实例上重用吗?

Is com.tinkerpop.pipes.Pipe implementation safe to cache and re-use later on other graph instances?

我目前正在创建一个管道,如下面第 2 行所示。

Pipe pipe = Gremlin.compile("_().out('knows').name");

创建后我将其缓存,以便它可以与下面的不同图表一起重复使用

Graph graph = TinkerGraphFactory.createTinkerGraph();
pipe.setStarts(new SingleIterator<Vertex>(graph.getVertex(1)));
for(Object name : pipe) 
{
  System.out.println((String) name);
}

我想知道这样可以吗?我问是因为 javadoc of AbstractPipe

public void reset()
Description copied from interface: Pipe
A pipe may maintain state. Reset is used to remove state. The general use case for reset() is to reuse a pipe in another computation without having to create a new Pipe object. An implementation of this method should be recursive whereby the starts (if a Pipe) should have this method called on it.
Specified by:
reset in interface Pipe<S,E>

我从不相信 reset 尽管 javadocs 在这件事上说了什么,但是这个测试似乎有效:

gremlin> pipe = _().out('knows').name;null              
==>null
gremlin> pipe.setStarts(new SingleIterator<Vertex>(g.getVertex(1)));    
==>null
gremlin> pipe
==>vadas
==>josh
gremlin> pipe
gremlin> pipe.setStarts(new SingleIterator<Vertex>(g.getVertex(1)));
==>null
gremlin> pipe                                                       
==>vadas
==>josh

调用 setStarts 似乎正确地重置了管道中的迭代器,但 reset 本身似乎没有太大效果:

gremlin> pipe.setStarts(new SingleIterator<Vertex>(g.getVertex(1)));
==>null
gremlin> pipe                                                       
==>vadas
==>josh
gremlin> pipe.reset()
==>null
gremlin> pipe
gremlin>

综上所述,我不确定缓存 Pipeline 是否为您节省了那么多。 Pipeline 创建非常便宜,并且 Gremlin.compile() 本身在编译后缓存脚本,因此将来调用 "recreate" 该管道应该比第一次调用 compile 快得多。