Gremlin.Net中的GraphJSON序列化

时间:2019-10-02 15:46:52

标签: serialization gremlin tinkerpop

我正在尝试通过CosmosDB client library查询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之间交换,但没有运气。文档说脚本序列化程序应该包括所有属性。我必须以某种方式调整配置以使其正常工作并返回属性吗?

1 个答案:

答案 0 :(得分:2)

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

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

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