首页 > 解决方案 > Gremlin.Net 中的 GraphJSON 序列化

问题描述

我正在尝试通过CosmosDB 客户端库查询 TinkerPop 服务器(托管在 docker 容器内) ,该库在 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]}

另外,我可以使用 Gremlin.Net 查询 TinkerPop 服务器:

!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)"
    }
}

但它返回一个具有零值 ID 且不包含任何属性的有效负载:

 {
        "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 之间进行交换,但没有成功。文档说脚本序列化程序应该包括所有属性。我是否必须以某种方式调整配置才能使其正常工作并返回属性?

标签: serializationgremlintinkerpop

解决方案


因此,Gremlin 服务器的3.4版本似乎默认将ReferenceElementStrategy 添加到遍历中,以保持二进制和脚本序列化程序之间的兼容性。在我们的例子中,我们想模仿 CosmosDB 的行为,所以要调整和接收所需的行为,只需从 init 脚本中删除策略(在我们的例子中是empty-sample.groovy

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

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

推荐阅读