Plugins 如何使用BindingsGremlinPlugin类向嵌入式gremlin服务器添加绑定?

Plugins 如何使用BindingsGremlinPlugin类向嵌入式gremlin服务器添加绑定?,plugins,gremlin,tinkerpop,janusgraph,gremlin-server,Plugins,Gremlin,Tinkerpop,Janusgraph,Gremlin Server,我已在我的应用程序中初始化janus graph实例。我使用FERMA OGM与之交互。我还想提供对它的网络访问,所以我考虑在嵌入式模式下使用GrimLin服务器。 我是这样做的: InputStream inputStream = getClass().getClassLoader().getResourceAsStream("gremlin-server-simple.yaml"); Settings settings = Settings.read(inputStream

我已在我的应用程序中初始化janus graph实例。我使用FERMA OGM与之交互。我还想提供对它的网络访问,所以我考虑在嵌入式模式下使用GrimLin服务器。 我是这样做的:

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();
gremlin-server-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,graph)-jg。 在这个主题上,有一个答案是它需要使用BindingsGremlinPlugin来添加绑定

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


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

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);
InputStream InputStream=getClass().getClassLoader().getResourceAsStream(gremlinConfigFile);
设置=设置。读取(inputStream);
//创建arg-bindingsMap
Map arg=new HashMap();
参数put(“图形”,jg);
arg.put(“g”,jg.traversal());
//创建method2argMap
Map method2arg=newhashmap();
方法2 arg.put(“绑定”,arg);
//将method2argMap添加到BindingsRemlinPlugin字符串
settings.scriptEngines.get(“gremlingroovy”).plugins.put(“org.apache.tinkerpop.gremlin.jsr223.BindingsGremlinPlugin”,method2arg);
我应该在我的gremlin conf中添加带有插件类和绑定的字符串,还是必须从代码中添加绑定

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

因此,对于
BindingsGremlinPlugin
您可以看到
build()
方法,该方法返回
Builder
,而该类上只有一个名为
bindings()
的配置方法,该方法采用
映射。因此,yaml中此类类的配置必须为:

org.apache.tinkerpop.gremlin.jsr223.BindingsGremlinPlugin: {bindings: {x: 123}}
这将把值为“123”的变量“x”放在全局绑定上。显然,这里的限制是您只能使用yaml允许的类型。请注意,您不必在嵌入yaml文件时将上述内容添加到yaml文件中,并且可以通过编程方式更新
设置
对象,以便在将其移交给Gremlin服务器启动之前将其包含在内

如果您正在初始化自己的
GremlinExecutor
GremlinScriptEngine
实例,则可以通过编程方式使用
BindingsGremlinPlugin
插件

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