我在我的应用程序中初始化了janus图形实例。我用FERMA和它互动。我也想提供对它的网络访问,所以我考虑在嵌入式模式下使用gremlin服务器。
我就是这样做的:
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-服务器-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中添加带有插件类的字符串并进行绑定,还是必须从代码中添加绑定(以某种方式)?
Update -根据答案,我通过修改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);发布于 2018-03-06 13:09:45
我应该在gremlin中添加带有插件类的字符串并进行绑定,还是必须从代码中添加绑定?
我认为你必须使用文件。Gremlin总是使用静态instance()方法实例化插件,或者禁止使用返回Builder对象的静态build()方法。如果它使用build(),那么它将使用反射来获取yaml文件中为该插件提供的任何键/值,并使用这些键来反映Builder对象上的方法名称,并以值作为参数调用它们。您必须注意匹配Builder方法的预期数据类型。
对于BindingsGremlinPlugin,您可以看到build()方法这里,它返回Builder,即这里,然后该类上只有一个名为bindings()的配置方法,它接受一个Map。因此,yaml中此类的配置必须是:
org.apache.tinkerpop.gremlin.jsr223.BindingsGremlinPlugin: {bindings: {x: 123}}它将变量"x“的值"123”放在全局绑定上。显然,这里的限制是您只能使用yaml允许的类型。请注意,在嵌入yaml文件时,不必将上述内容添加到yaml文件中,并且可以通过编程方式更新Settings对象,以便在将其交给Gremlin启动之前包含它。
以编程方式使用BindingsGremlinPlugin的唯一方法是初始化您自己的GremlinExecutor或GremlinScriptEngine实例,这里不是这种情况。
如果绑定上需要更复杂的对象,可以编写自己的BindingsGremlinPlugin扩展,它可以动态实例化这些复杂的值。然后在yaml文件中引用您自己的实现。
https://stackoverflow.com/questions/49128536
复制相似问题