如何将 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")

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