如何将 janus 图形导入添加到 gremlin groovy 脚本引擎?
How to add janus graph imports to gremlin groovy script engine?
我使用 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
作为解决方法,我在查询中定义了整个 class 名称 org.janusgraph.core.Cardinality.SINGLE
。
据我了解,可以在脚本引擎创建期间设置所有特定的脚本引擎导入。
Janus 特定的导入在 JanusGraphGremlinPlugin class 中定义,我在 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
class 实例的 List
已弃用(由 org.apache.tinkerpop.gremlin.jsr223.GremlinPlugin
取代)。
此外 JanusGraphGremlinPlugin class 是 org.apache.tinkerpop.gremlin.jsr223.AbstractGremlinPlugin
的后代,因此不能在 .loadPlugins()
方法中使用。
您知道如何使用 JanusGraphGremlinPlugin class 将特定于 janus 的导入添加到 gremlin-groovy-engine 吗?
您需要将插件添加到 GremlinScriptEngineManager
实例:
GremlinScriptEngineManager engineManager = new CachedGremlinScriptEngineManager();
engineManager.addPlugin(JanusGraphGremlinPlugin.instance())
engine = engineManager.getEngineByName("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
作为解决方法,我在查询中定义了整个 class 名称 org.janusgraph.core.Cardinality.SINGLE
。
据我了解,可以在脚本引擎创建期间设置所有特定的脚本引擎导入。 Janus 特定的导入在 JanusGraphGremlinPlugin class 中定义,我在 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
class 实例的 List
已弃用(由 org.apache.tinkerpop.gremlin.jsr223.GremlinPlugin
取代)。
此外 JanusGraphGremlinPlugin class 是 org.apache.tinkerpop.gremlin.jsr223.AbstractGremlinPlugin
的后代,因此不能在 .loadPlugins()
方法中使用。
您知道如何使用 JanusGraphGremlinPlugin class 将特定于 janus 的导入添加到 gremlin-groovy-engine 吗?
您需要将插件添加到 GremlinScriptEngineManager
实例:
GremlinScriptEngineManager engineManager = new CachedGremlinScriptEngineManager();
engineManager.addPlugin(JanusGraphGremlinPlugin.instance())
engine = engineManager.getEngineByName("gremlin-groovy")
只要在实例化引擎之前添加插件,它就应该可以工作。