在分配给变量时,我可以以某种方式重用Gremlin GraphTraversals代码吗?

时间:2017-01-08 00:37:20

标签: java gremlin

我有GraphTraversals看起来像那样(attrGroup:

GraphTraversal<Vertex,Edge> attrGroupTraversal = some code generates it; 
List<Vertex> attributeVs = attrGroupTraversal.inV().out(EdgeLabels.ContainsAttribute).toList();
List<Vertex> sourceVs = attrGroupTraversal.inV().out(EdgeLabels.ContainsSource).toList();
List<Vertex> targetVs = attrGroupTraversal.out(EdgeLabels.ContainsTarget).toList();

有没有办法重用attrGroupTraversal所以我不需要重新运行首先创建它的代码?

我得到了:

  

java.lang.IllegalStateException:遍历策略已完成   并且遍历不再被调制

     

at org.apache.tinkerpop.gremlin.process.traversal.Traversal $ Exceptions.traversalIsLocked(Traversal.java:245)     在   org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.addStep(DefaultTraversal.java:274)     在org.apache.tinkerpop.gremlin.process.traversal.Traversal $ Admin.addStep(Traversal.java:301)     在   org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal $ Admin.addStep(GraphTraversal.java:170)     在   org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.inV(GraphTraversal.java:384)

3 个答案:

答案 0 :(得分:4)

我建议您.clone()进行原始遍历。 以下应该有效:

GraphTraversal<Vertex,Edge> attrGroupTraversal = some code generates it; 
List<Vertex> attributeVs = attrGroupTraversal.clone().inV().out(EdgeLabels.ContainsAttribute).toList();
List<Vertex> sourceVs = attrGroupTraversal.clone().inV().out(EdgeLabels.ContainsSource).toList();
List<Vertex> targetVs = attrGroupTraversal.clone().out(EdgeLabels.ContainsTarget).toList();

另请参阅:TinkerPop文档配方中的Traversal component reuse

答案 1 :(得分:0)

我假设您在第二次调用“inV(...)”时遇到异常。例外情况是告诉您完成遍历。

如果几个gremlin调用变得昂贵(我假设你正在试图避免)你可以绕过gremlin(如果底层图允许你做这样的事情)并直接使用java api。

通过这种方式,您可以根据需要选择尽可能多的v和e

答案 2 :(得分:0)

尝试一下:

GraphTraversal t = graph.traversal()。V()。has(“ type”,“ COMPONENT”);

GraphTraversal newT = t.asAdmin()。clone();

这挽救了我的一天。

信用:https://groups.google.com/forum/#!msg/gremlin-users/ltEYV-ShTYg/xf9s8k8SCQAJ