Как получить все имена графов с сервера gremlin - PullRequest
1 голос
/ 28 мая 2020

Мой файл gremlin-server.yaml выглядит следующим образом:

host: localhost
port: 8182
scriptEvaluationTimeout: 30000
channelizer: org.apache.tinkerpop.gremlin.server.channel.WebSocketChannelizer
graphManager : com.orientechnologies.tinkerpop.server.OrientGremlinGraphManager
graphs: {
  graph : ../config/db1.properties,
  graph2 : ../config/db2.properties
}
scriptEngines: {
  gremlin-groovy: {
    plugins: { org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {},
               org.apache.tinkerpop.gremlin.orientdb.jsr223.OrientDBGremlinPlugin: {},
               org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]},
               org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {files: [../config/db.groovy]}}}}
serializers:
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.orientdb.io.OrientIoRegistry] }}             # application/vnd.gremlin-v3.0+gryo
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true }}                                                                       # application/vnd.gremlin-v3.0+gryo-stringd
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: { ioRegistries: [org.apache.tinkerpop.gremlin.orientdb.io.OrientIoRegistry] }}         # application/json
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 }}

Я использую java для подключения к серверу gremlin. Есть ли способ получить имена графиков: graph и graph2 из кода?

В качестве альтернативы, если я привяжу обходы graph и graph2 к g и g2 в файле db. groovy и добавлю их как глобальные привязки, это есть способ получить имена: g и g2?

1 Ответ

1 голос
/ 04 июня 2020

Нет прямого API для получения этого списка, но есть обходной путь для его получения, если вы используете запрос на основе сценария и реализация вашего поставщика не запрещает это по соображениям безопасности (или просто не поддерживает его, учитывая способ он реализовал протокол). Короче говоря, я бы ожидал, что этот подход будет работать только с реализацией сервера Gremlin от TinkerPop, и если песочница безопасности отключена или настроена для разрешения доступа к задействованным классам.

Сервер Gremlin содержит ScriptEngine экземпляр, обрабатывающий сценарии. У него есть «контекст», который доступен как переменная с тем же именем. Вы можете получить доступ к этой переменной с помощью:

gremlin> :remote connect tinkerpop.server conf/remote.yaml
==>Configured localhost/127.0.0.1:8182
gremlin> :remote console
==>All scripts will now be sent to Gremlin Server - [localhost/127.0.0.1:8182] - type ':remote console' to return to local mode
gremlin> context
==>org.apache.tinkerpop.gremlin.jsr223.GremlinScriptContext@c7ef4c5

Как только вы это получите, вы можете отфильтровать Graph (или, что более вероятно, вы бы подобрали GraphTraversalSource экземпляры) и получить имя, по которому оно известно на server:

gremlin> context.getBindings(javax.script.ScriptContext.GLOBAL_SCOPE).entrySet().findAll{it.value instanceof Graph}.key
==>graph
gremlin> context.getBindings(javax.script.ScriptContext.GLOBAL_SCOPE).entrySet().findAll{it.value instanceof GraphTraversalSource}.key
==>g

Как видите, он также хорошо работает с совместимым драйвером:

gremlin> cluster = Cluster.open()
==>localhost/127.0.0.1:8182
gremlin> client = cluster.connect()
==>org.apache.tinkerpop.gremlin.driver.Client$ClusteredClient@5408d4b3
gremlin> client.submit("context.getBindings(javax.script.ScriptContext.GLOBAL_SCOPE).entrySet().findAll{it.value instanceof GraphTraversalSource}.key").all().get()
==>result{object=g class=java.lang.String}
...