我有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)
答案 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