2017-01-08 5 views
0

У меня есть GraphTraversals, которые выглядят так (attrGroup:Могу ли я как-то повторно использовать Gremlin GraphTraversals при назначении переменной?

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) 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) на org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.inV (GraphTraversal.java:384)

+0

Методы - это полезные инструменты, чтобы избежать «копирования и вставки» кода. – user2864740

+0

Вы подразумеваете, что я не думал о создании метода для нового обхода? : P Что, если я скажу вам, что эта переменная передается из другого кода, поэтому я не могу на самом деле сделать метод для нее, так как ее фактическая форма неизвестна заранее. Изменен код, чтобы отразить это. –

ответ

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(); 

Смотрите также: Traversal component reuse от TinkerPop документации рецептов.

+0

. Я пробовал это, и он говорит '' 'clone()' '' защищен .. только если я делаю '' 'asAdmin(). clone()' '' он позволяет мне скомпилировать, что я не уверен, что asAdmin означает –

+0

Как и TinkerPop v3.2.3, '.clone()' является каноническим способ повторного использования Traversal. Какую версию вы используете? Я предлагаю вам клонирование try из консоли Gremlin с простым графиком и итерацией оттуда. – jbmusso

+0

из внешних библиотек maven Я действительно использую 3.2.3 .., но пакеты извлекаются через DataStax DSE pom.xml. Тем не менее я не уверен, почему это было проблемой. –

0

Я предполагаю, что вы получают исключение во втором вызове «inV (...)». Исключением является то, что вы завершаете проход.

Если несколько gremlin invocations становятся дорогими (что я предполагаю - это то, чего вы пытаетесь избежать), вы можете обходить гремлин (если базовый граф позволяет вам делать такую ​​вещь) и работать непосредственно с java api.

Таким образом, вы можете выбрать, как много V и е, как вам нужно

+0

это не help - Меня не волнуют многочисленные вызовы на сервер и обратно в этот момент. Я бы использовал '' 'select()' ''/'' 'by()' '', чтобы получить все в одном режиме, как здесь: http://stackoverflow.com/q/41304450/986160. то, что я хочу, по существу, может повторно использовать тот же самый код гремлина, который я не знаю его формы, и создаю новые результаты обхода от ввода, который передается в –