如何将janus图导入添加到gremlin groovy脚本引擎?

时间:2018-02-23 18:58:09

标签: groovy gremlin janusgraph gremlin-server

我使用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中吗?

1 个答案:

答案 0 :(得分:2)

您需要将插件添加到GremlinScriptEngineManager实例:

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

只要在实例化引擎之前添加插件,它就应该可以工作。