分配给变量时,我可以以某种方式重用 Gremlin GraphTraversals 代码吗?
Can I somehow reuse Gremlin GraphTraversals code when assigned to a variable?
我有看起来像那样的 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: The traversal strategies are complete
and the traversal can no longer be modulated
at org.apache.tinkerpop.gremlin.process.traversal.Traversal$Exceptions.traversalIsLocked(Traversal.java:245)
at
org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.addStep(DefaultTraversal.java:274)
at org.apache.tinkerpop.gremlin.process.traversal.Traversal$Admin.addStep(Traversal.java:301)
at
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal$Admin.addStep(GraphTraversal.java:170)
at
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.inV(GraphTraversal.java:384)
我假设您在 "inV(...)" 的第二次调用中遇到异常。异常是告诉你遍历完成。
如果多次 gremlin 调用变得昂贵(我假设这是您要避免的),您可以绕过 gremlin(如果底层图形允许您这样做)并直接使用 java api.
这样你就可以根据需要选择任意数量的 v 和 e
我建议你.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();
另请参阅:Traversal component reuse 来自 TinkerPop 文档食谱。
试试这个:
图遍历 t = graph.traversal().V().has("type", "COMPONENT");
GraphTraversal newT = t.asAdmin().clone();
这救了我的命。
来源:https://groups.google.com/forum/#!msg/gremlin-users/ltEYV-ShTYg/xf9s8k8SCQAJ
我有看起来像那样的 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: The traversal strategies are complete and the traversal can no longer be modulated
at org.apache.tinkerpop.gremlin.process.traversal.Traversal$Exceptions.traversalIsLocked(Traversal.java:245) at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.addStep(DefaultTraversal.java:274) at org.apache.tinkerpop.gremlin.process.traversal.Traversal$Admin.addStep(Traversal.java:301) at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal$Admin.addStep(GraphTraversal.java:170) at org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.inV(GraphTraversal.java:384)
我假设您在 "inV(...)" 的第二次调用中遇到异常。异常是告诉你遍历完成。
如果多次 gremlin 调用变得昂贵(我假设这是您要避免的),您可以绕过 gremlin(如果底层图形允许您这样做)并直接使用 java api.
这样你就可以根据需要选择任意数量的 v 和 e
我建议你.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();
另请参阅:Traversal component reuse 来自 TinkerPop 文档食谱。
试试这个:
图遍历 t = graph.traversal().V().has("type", "COMPONENT");
GraphTraversal newT = t.asAdmin().clone();
这救了我的命。
来源:https://groups.google.com/forum/#!msg/gremlin-users/ltEYV-ShTYg/xf9s8k8SCQAJ