[英]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.