我使用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中吗?
答案 0 :(得分:2)
您需要将插件添加到GremlinScriptEngineManager
实例:
GremlinScriptEngineManager engineManager = new CachedGremlinScriptEngineManager();
engineManager.addPlugin(JanusGraphGremlinPlugin.instance())
engine = engineManager.getEngineByName("gremlin-groovy")
只要在实例化引擎之前添加插件,它就应该可以工作。