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