Сериализация GraphJSON в Gremlin.Net - PullRequest
1 голос
/ 02 октября 2019

Я пытаюсь сделать запрос к серверу TinkerPop (расположенному внутри контейнера докера) через клиентскую библиотеку CosmosDB , которая используется под капотом Gremlin.Net. Так что мне удалось подключить его и вставить данные, вот перехваченный запрос WebSocket:

!application/vnd.gremlin-v1.0+json{
    "requestId": "b64bd2eb-46c3-4095-9eef-768bca2a14ed",
    "op": "eval",
    "processor": "",
    "args": {
        "gremlin": "g.addV(\"User\").property(\"UserId\",2).property(\"CustomerId\",1)"
    }
}

Ответ:

{
    "requestId": "b64bd2eb-46c3-4095-9eef-768bca2a14ed",
    "status": {
        "message": "",
        "code": 200,
        "attributes": {
            "host": "/172.19.0.1:38848"
        }
    },
    "result": {
        "data": [
            {
                "id": 0,
                "label": "User",
                "type": "vertex",
                "properties": {}
            }
        ],
        "meta": {}
    }
 }

Проблема в том, что я вижу эти свойства, когда я подключен черезконсоль gremlin

gremlin> g.V().hasLabel("User").has("CustomerId",1).has("UserId",2).limit(1).valueMap()
==>{UserId=[2], CustomerId=[1]}

Кроме того, я могу запросить сервер TinkerPop с Gremlin.Net:

!application/vnd.gremlin-v1.0+json{
    "requestId": "de35909f-4bc1-4aae-aa5f-28361b3c0933",
    "op": "eval",
    "processor": "",
    "args": {
        "gremlin": "g.V().hasLabel(\"User\").has(\"CustomerId\",1).has(\"UserId\",2).limit(1)"
    }
}

Но он возвращает полезную нагрузку с нулевым идентификатором и без каких-либо свойств. включено:

 {
        "requestId": "de35909f-4bc1-4aae-aa5f-28361b3c0933",
        "status": {
            "message": "",
            "code": 200,
            "attributes": {
                "host": "/172.19.0.1:38858"
            }
        },
        "result": {
            "data": [
                {
                    "id": 0,


             "label": "User",
                "type": "vertex",
                "properties": {}
            }
        ],
        "meta": {}
    }
}

Попытка поменять местами GraphSON v1, v2, v3 без удачи. Документация говорит, что сериализаторы сценариев должны включать все свойства. Должен ли я как-то настроить конфиг, чтобы это работало и возвращало свойства?

1 Ответ

2 голосов
/ 03 октября 2019

Таким образом, кажется, что с версией 3.4 сервера Gremlin ReferenceElementStrategy был добавлен по умолчанию к обходам, чтобы сохранить совместимость между двоичными и сериализаторами сценариев. В нашем случае мы хотели имитировать поведение CosmosDB, поэтому для настройки и получения желаемого поведения просто удалите стратегию из сценария инициализации (в нашем случае это было empty-sample.groovy

globals << [g : graph.traversal().withStrategies(ReferenceElementStrategy.instance())]

до

globals << [g : graph.traversal()]
...