Измените сериализацию по умолчанию на сервере gremlin, чтобы использовать GraphSON V1 - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь изменить формат вывода сервера Gremlin http на типизированный объект JSON, как показано ниже.

{
  "requestId": "320599c8-7d49-4cc6-87a6-42115009f90c",
  "status": {
    "message": "",
    "code": 200,
    "attributes": {}
  },
  "result": {
    "data": [
      {
        "info": [
          {
            "total_seen": [
              2845
            ],
            "first_seen": [
              1501568446000
            ],
            "last_seen": [
              1580157081000
            ],
            "value": [
              "http://test.com"
            ]
          }
        ]
      }
    ],
    "meta": {}
  }
}

Но ответ, который я получаю от сервера, является типизированным one

{
  "requestId": "e8621470-7ee7-4f6b-a8ea-1d49c85093c8",
  "status": {
    "message": "",
    "code": 200,
    "attributes": {
      "@type": "g:Map",
      "@value": []
    }
  },
  "result": {
    "data": {
      "@type": "g:List",
      "@value": [
        {
          "@type": "g:Map",
          "@value": [
            "info",
            {
              "@type": "g:List",
              "@value": [
                {
                  "@type": "g:Map",
                  "@value": [
                    "total_seen",
                    {
                      "@type": "g:List",
                      "@value": [
                        {
                          "@type": "g:Int32",
                          "@value": 2797
                        }
                      ]
                    },
                    "first_seen",
                    {
                      "@type": "g:List",
                      "@value": [
                        {
                          "@type": "g:Int64",
                          "@value": 1501568446000
                        }
                      ]
                    },
                    "last_seen",
                    {
                      "@type": "g:List",
                      "@value": [
                        {
                          "@type": "g:Int64",
                          "@value": 1578774368000
                        }
                      ]
                    },
                    "vertex_type",
                    {
                      "@type": "g:List",
                      "@value": [
                        "url"
                      ]
                    },
                    "url_value",
                    {
                      "@type": "g:List",
                      "@value": [
                        "http://test.com"
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    },
    "meta": {
      "@type": "g:Map",
      "@value": []
    }
  }
}

Я попытался изменить настройки в gremlin-server.yaml, прокомментировав GraphSON V2 и V3

# Copyright 2019 JanusGraph Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

host: 127.0.0.1
port: 8182
scriptEvaluationTimeout: 30000
channelizer: org.apache.tinkerpop.gremlin.server.channel.WebSocketChannelizer
graphs: {
  graph: conf/gremlin-server/janusgraph-cassandra-es-server.properties
}
scriptEngines: {
  gremlin-groovy: {
    plugins: { org.janusgraph.graphdb.tinkerpop.plugin.JanusGraphGremlinPlugin: {},
               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#*]},
               org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {files: [scripts/empty-sample.groovy]}}}}
serializers:
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true }}
#  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  # Older serialization versions for backwards compatibility:
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, 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.GraphSONMessageSerializerGremlinV2d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}
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

Я был бы очень рад, если бы кто-то мог сказать мне, что я делаю здесь не так. Благодаря.

1 Ответ

3 голосов
/ 10 февраля 2020

В выводе журнала сервера может отображаться ошибка, указывающая на проблему, но я предполагаю, что вы пытаетесь подключиться к конфигурации сериализатора драйвера, которая не распознается сервером, и поэтому по умолчанию использует GraphSON 3.0 сериализации. Это изменение происходило долгое время go, на TINKERPOP-1565 для версии 3.3.0.

Когда мы начали пускать GraphSON 3.0, мы хотели, чтобы он был форматом сетевой сериализации на основе JSON по умолчанию, поэтому мы присвоили ему тип mime «application / json», который ранее переходил на нетипизированный GraphSON 1.0. Итак, вам нужно немного настраиваемой конфигурации, чтобы драйвер и сервер распознали, что вы хотите, чтобы произошло:

gremlin> cluster = Cluster.build().serializer(new GraphSONMessageSerializerV1d0()).create()
==>localhost/127.0.0.1:8182
gremlin> client = cluster.connect()
==>org.apache.tinkerpop.gremlin.driver.Client$ClusteredClient@277b8fa4
gremlin> x = client.submit("[1,2,3]").all().get()
==>result{object=1 class=java.lang.Integer}
==>result{object=2 class=java.lang.Integer}
==>result{object=3 class=java.lang.Integer}

Вы можете видеть, что вам нужно явно создать GraphSONMessageSerializerV1d0 (и в вашем В этом случае вы, скорее всего, добавите JanusGraphIoRegistry к этому вручную, используя конструктор, который принимает GraphSONMapper.

Все это говорит, хотя GraphSON 1.0 никуда не денется, любопытно, что вам нужно его использовать Если у вас нет действительно веских причин для этого, я настоятельно рекомендую вам придерживаться GraphSON 3.0. Он имеет самую широкую поддержку среди поставщиков графических вычислений - почти так же быстро, как Gryo в настоящее время для большинства операций сериализации. исключительно на JVM, я бы даже предложил попробовать GraphBinary, а не возвращаться к GraphSON 1.0.

...