Я использую GremlinGroovyScriptEngine, который является частью gremlin-server, для оценки строковых запросов gremlin - например:
final ScriptEngine engine = new GremlinGroovyScriptEngine();
engine.eval("g.V().count().next();");
... все было хорошо, пока я не начал использовать элементы, специфичные для janus-graph, в запросах - вот так (последняя строка):
final ScriptEngine engine = new GremlinGroovyScriptEngine();
//== Set binding with traversal/graph/transaction to script engine ===
JanusGraphManagement mgmt = jg.openManagement();
SimpleBindings trBinding = new SimpleBindings();
trBinding.putAll(this.bindings);
trBinding.put("mgmt", mgmt);
engine.setBindings(trBinding, ScriptContext.ENGINE_SCOPE);
result = engine.eval("mgmt.makePropertyKey('zzzzzz').dataType(String.class).cardinality(Cardinality.SINGLE).make();");
... в таком случае я получил:
MissingPropertyException: No such property: SINGLE for class: org.apache.tinkerpop.gremlin.structure.VertexProperty$Cardinality
В качестве обходного пути я определяю в запросе полное имя класса org.janusgraph.core.Cardinality.SINGLE
.
Насколько я понимаю, можно настроить весь конкретный импорт в скриптовый движок во время его создания. Конкретный импорт Janus определен в JanusGraphGremlinPlugin, который я использую во время инициализации gremlin-script-engine следующим образом:
JanusGraphGremlinPlugin graphGremlinPlugin = JanusGraphGremlinPlugin.instance();
GremlinScriptEngineManager engineManager = new CachedGremlinScriptEngineManager();
/* Create gremlin script engine */
GremlinGroovyScriptEngine engine = GremlinGroovyScriptEngine.class
.cast(engineManager.getEngineByName("gremlin-groovy"));
... Но это не работает. Кажется, что engineManager
не установил никаких плагинов, потому что после создания движка engine.getPlugins().size()
выдает 0.
Также есть прямой метод движка для загрузки плагина:
...
engine.loadPlugins(Collections.singletonList(graphGremlinPlugin))
...
... но он получает List
экземпляров класса org.apache.tinkerpop.gremlin.groovy.plugin.GremlinPlugin
, который устарел (заменен на org.apache.tinkerpop.gremlin.jsr223.GremlinPlugin
). Кроме того, Класс JanusGraphGremlinPlugin является потомком org.apache.tinkerpop.gremlin.jsr223.AbstractGremlinPlugin
, поэтому его нельзя использовать в .loadPlugins()
методе.
Знаете ли вы, как можно использовать класс JanusGraphGremlinPlugin для добавления специфичного для janus импорта в gremlin-groovy-engine?