Как добавить импорт графа janus в скриптовый движок gremlin groovy?

Я использую 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?


person palandlom    schedule 23.02.2018    source источник


Ответы (1)


Вам необходимо добавить плагин в экземпляр GremlinScriptEngineManager:

GremlinScriptEngineManager engineManager = new CachedGremlinScriptEngineManager();
engineManager.addPlugin(JanusGraphGremlinPlugin.instance())
engine = engineManager.getEngineByName("gremlin-groovy")

Если плагин добавлен до того, как вы создадите экземпляр движка, он должен работать.

person stephen mallette    schedule 23.02.2018
comment
Какую зависимость maven я должен определить, чтобы получить JanusGraphGremlinPlugin, который является потомком org.apache.tinkerpop.gremlin.jsr223.AbstractGremlinPlugin? javalibs.com/artifact/org.janusgraph/janusgraph-all дает старый org.janusgraph.graphdb.tinkerpop.plugin.JanusGraphGremlinPlugin класс - person palandlom; 24.02.2018
comment
хм - похоже, что JanusGraph не поддерживает новую систему плагинов в 0.2.0. вам нужно будет создать свою собственную версию JanusGraph на этом этапе - код, по крайней мере, изменился на главном сервере: github.com/JanusGraph/janusgraph/commit/, если вы застряли на 0.2.0, вам придется использовать старые устаревшие методы, которые вы уже нашли, чтобы все это работало. - person stephen mallette; 24.02.2018
comment
Ok. Спасибо за разъяснение) - person palandlom; 24.02.2018