2015-06-14 2 views
1

Я разбираю запрос Гремлина в Java (ну, собственно, я пишу Scala, и используя компилированные JAR-файлы Groovy, подобные Java).Почему разбор запроса Гремлина на Java не является общим?

Запрос представляет собой переменную String, заданную пользователем с помощью ввода. Другими словами - я не могу сказать, каков будет запрос, я предполагаю, что это действительный запрос Гремлина (синтаксически и логически).

Я начал с простого Gremlin.compile(query), который возвращает Pipe, на котором я выполняю итерацию. Однако, согласно the example, перед итерацией трубы необходимо вызывать .setStarts. И я должен знать, что такое тип времени выполнения S в моем Pipe<S,E>.

Он чувствует, как этот API не является универсальным достаточно, следующая строка из примера

pipe.setStarts(new SingleIterator<Vertex>(graph.getVertex(1))); 

будет работать в некоторых случаях, но для Vertex Итерации для одного примера (g.V()) он будет бросать CastException.

Есть ли способ обходить его?

Возможно, использование базового скриптового движка (как и следующие примеры в ссылке выше) поможет мне получить более общий код?

ответ

1

Я нашел обходное решение. Он чувствует себя немного уродливо, но он выполняет эту работу.

  1. Я использую ScriptEngine с bindings из «г» для Graph, так что пользователь может начать его/ее запросы с g.. (не помогает для дженериков, но делает его более удобным для пользователя, не заставляя пользователя использовать Identity Pipe (_()) в начале его/ее запросов).

  2. (вид некрасиво, я знаю) Я извлекая из строки запроса (с использованием регулярных выражений) начальной вершины (если есть), найти его и программно (если найдено) призывающие setStarts с ним. Если он не найден, я предоставляю сам Graph как параметр для setStarts, предполагая его запрос вертекс-итерации.