serialization - 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 之间进行交换,但没有成功。文档说脚本序列化程序应该包括所有属性。我是否必须以某种方式调整配置才能使其正常工作并返回属性?
解决方案
因此,Gremlin 服务器的3.4版本似乎默认将ReferenceElementStrategy
添加到遍历中,以保持二进制和脚本序列化程序之间的兼容性。在我们的例子中,我们想模仿 CosmosDB 的行为,所以要调整和接收所需的行为,只需从 init 脚本中删除策略(在我们的例子中是empty-sample.groovy
globals << [g : graph.traversal().withStrategies(ReferenceElementStrategy.instance())]
到
globals << [g : graph.traversal()]
推荐阅读
- xpath - 无法使用 xpath 编码匹配精确符号“&”“<”“>”
- javascript - 如何将 eval(ID) 从列表视图传递到 asp.net 上的模式弹出窗口
- python - 使用特定列将抓取的数据导出到 CSV
- netlogo - 在 NetLogo 中改变海龟变量的好方法是什么?
- angular - 如何解决使用自定义验证器语法遇到的错误?
- java - Java除法运算符没有给出预期的结果
- react-native - 如何使用 React Native 制作警报事件?
- python-3.x - 为什么会引发 http.client.IncompleteRead 异常?
- python - 视图中的问题,“学生”类没有“对象”成员pylint(无成员)?
- sql - Insert into 命令不插入任何内容,但 select 语句返回所需的所有元素