繁体   English   中英

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

[英]How to add janus graph imports to gremlin groovy script engine?

我使用GremlinGroovyScriptEngine,它是gremlin服务器的一部分,用于评估字符串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))
...

...但它接收已弃用的org.apache.tinkerpop.gremlin.groovy.plugin.GremlinPlugin类的实例List (由org.apache.tinkerpop.gremlin.jsr223.GremlinPlugin代替)。 而且JanusGraphGremlinPlugin类是org.apache.tinkerpop.gremlin.jsr223.AbstractGremlinPlugin后代,因此无法在.loadPlugins()方法中使用。

您知道如何使用JanusGraphGremlinPlugin类将janus特定的导入添加到gremlin-groovy-engine吗?

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

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

只要在实例化引擎之前添加了插件,它就应该起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM