如何使用BindingsGremlinPlugin类为嵌入式gremlin-server添加绑定?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用BindingsGremlinPlugin类为嵌入式gremlin-server添加绑定?相关的知识,希望对你有一定的参考价值。

我在我的应用程序中初始化了janus-graph实例。我使用FERMA OGM与它进行交互。我也想提供网络访问权限,所以我考虑在嵌入模式下使用gremlin-server。

我这样做:

InputStream inputStream = getClass().getClassLoader().getResourceAsStream("gremlin-server-simple.yaml");        

Settings settings = Settings.read(inputStream);
settings.graphs.clear();

GremlinServer gremlinServer = new GremlinServer(settings);
GraphManager graphManager = gremlinServer.getServerGremlinExecutor().getGraphManager();
graphManager.putGraph("graph", jg);
// jg - graph instance
...
gremlinServer.start();

小鬼 - 服务器simple.yaml:

host: localhost
port: 8182
scriptEvaluationTimeout: 30000
channelizer: org.apache.tinkerpop.gremlin.server.channel.WebSocketChannelizer
graphManager: org.janusgraph.graphdb.management.JanusGraphManager

graphs: {}

scriptEngines: {
  gremlin-groovy: {
    plugins: { com.mallcloud.shortesttrack.metadata.commons.gremlin.ModJanusGraphJsrGremlinPlugin: {},
               org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {},
               org.apache.tinkerpop.gremlin.tinkergraph.jsr223.TinkerGraphGremlinPlugin: {},
               org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]}
               },
    imports: [java.lang.Math],
    staticImports: [java.lang.Math.PI],
    scripts: []}}

serializers:
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
processors:
  - { className: org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { sessionTimeout: 28800000 }}
  - { className: org.apache.tinkerpop.gremlin.server.op.traversal.TraversalOpProcessor, config: { cacheExpirationTime: 600000, cacheMaxSize: 1000 }}
metrics: {
  consoleReporter: {enabled: true, interval: 180000},
  csvReporter: {enabled: true, interval: 180000, fileName: /tmp/gremlin-server-metrics.csv},
  jmxReporter: {enabled: true},
  slf4jReporter: {enabled: true, interval: 180000},
  gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
  graphiteReporter: {enabled: false, interval: 180000}}
maxInitialLineLength: 4096
maxHeaderSize: 8192
maxChunkSize: 8192
maxContentLength: 65536
maxAccumulationBufferComponents: 1024
resultIterationBatchSize: 64
writeBufferLowWaterMark: 32768
writeBufferHighWaterMark: 65536

但我无法为我的图形实例定义绑定(g,图形) - jg。在这个programmatically-add-global-variables-to-gremlin-server主题上有答案,它需要使用BindingsGremlinPlugin来添加绑定。

但我不知道该怎么做 - 我应该在我的gremlin-conf中添加带有插件类和绑定的字符串,还是必须从代码中添加绑定(以某种方式)?


更新 - 根据答案,我通过修改Settings实例添加了绑定:

InputStream inputStream = getClass().getClassLoader().getResourceAsStream(gremlinConfigFile);
Settings settings = Settings.read(inputStream);

// Create arg - bindingsMap
Map<String, Object> arg = new HashMap<>();
arg.put("graph", jg);
arg.put("g", jg.traversal());

// Create method2argMap
Map<String, Object> method2arg = new HashMap<>();
method2arg.put("bindings", arg);

// Add method2argMap to BindingsGremlinPlugin string
settings.scriptEngines.get("gremlin-groovy").plugins.put("org.apache.tinkerpop.gremlin.jsr223.BindingsGremlinPlugin", method2arg);
答案

我应该在我的gremlin-conf中添加该插件类和绑定的字符串,还是必须从代码中添加绑定?

我认为你必须使用Gremlin Server yaml文件。 Gremlin Server总是希望使用静态instance()方法实例化插件,或者禁止使用返回build()对象的静态Builder方法。如果它使用build(),那么它将使用反射来获取您在该插件的yaml文件中的Map中提供的任何键/值,并使用这些键来反映Builder对象上的方法名称,并使用值作为参数调用它们。您必须注意匹配Builder方法的预期数据类型。

因此,对于BindingsGremlinPlugin,你可以看到build()方法here返回Builder,这是here然后该类只有一个配置方法称为bindings(),它采取Map。因此,您在yaml中对此类的配置必须是:

org.apache.tinkerpop.gremlin.jsr223.BindingsGremlinPlugin: {bindings: {x: 123}}

这将把变量“x”与值“123”放在全局绑定上。显然,这里的限制是你只能使用yaml允许的类型。请注意,您不必在嵌入时将上述内容添加到yaml文件中,并且可以在将其交给Gremlin Server以启动它之前以编程方式更新Settings对象以包含它。

编程使用BindingsGremlinPlugin的唯一方法是,如果你正在初始化自己的GremlinExecutorGremlinScriptEngine实例,这不是这里的情况。

如果你需要在绑定上有更复杂的对象,你可以编写自己的BindingsGremlinPlugin扩展,它可以动态地实例化那些复杂的值。然后在yaml文件中引用您自己的实现。

以上是关于如何使用BindingsGremlinPlugin类为嵌入式gremlin-server添加绑定?的主要内容,如果未能解决你的问题,请参考以下文章

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?