使用Gremlin与Azure Cosmos Graph在顶点中存储变更日志列表
我明白你想要的是把结构化的变更日志作为顶点的列表属性存储,而不是简单的字符串——当前的写法确实只能存单一字符串值,没法实现你要的嵌套对象结构。咱们来调整一下写法:
核心解决方案:用Map存储结构化日志条目
Gremlin支持将Map类型作为列表属性的元素,这样就能直接实现你期望的嵌套结构。下面是完整的实现代码:
1. 创建带结构化日志的顶点
graph.addV('person') .property('firstName', 'Thomas') // 直接传入Map作为log列表的元素 .property(list, 'log', [ user: 'user@user.dk', action: 'update', timestamp: '22-03-2017', field: 'firstName', oldValue: 'Marco' ]) .next()
注意:如果你的图数据库允许自定义顶点ID(比如Neo4j、JanusGraph),可以额外添加
.property('id', '95fcfa87-1c03-436d-b3ca-340cea926ee9'),但TinkerPop规范中默认ID由数据库自动生成,需根据实际情况调整。
2. 后续添加新的日志条目
如果要给已存在的顶点追加新的变更记录,只需要继续用property(list, 'log', 新Map)即可:
g.V('95fcfa87-1c03-436d-b3ca-340cea926ee9') .property(list, 'log', [ user: 'admin@example.com', action: 'add', timestamp: '23-03-2017', field: 'lastName', oldValue: null ]) .next()
3. 查询后的预期结构
执行查询g.V('95fcfa87-1c03-436d-b3ca-340cea926ee9').valueMap(true)后,会得到类似你期望的结构(不同数据库的返回格式可能略有差异,但核心结构一致):
{ "id": "95fcfa87-1c03-436d-b3ca-340cea926ee9", "label": "person", "firstName": ["Thomas"], "log": [ { "user": "user@user.dk", "action": "update", "timestamp": "22-03-2017", "field": "firstName", "oldValue": "Marco" }, { "user": "admin@example.com", "action": "add", "timestamp": "23-03-2017", "field": "lastName", "oldValue": null } ] }
注意事项
- 不是所有图数据库都支持嵌套Map作为属性值,比如部分轻量型或老版本数据库仅支持简单类型(字符串、数字等),请确认你使用的数据库(如Neo4j、Amazon Neptune、JanusGraph等)支持复杂属性类型。
- 如果你的数据库不支持嵌套Map,退而求其次的方案是将日志条目序列化为JSON字符串存储,查询时再反序列化,但这种方式会增加后续查询和操作的复杂度。
内容的提问来源于stack exchange,提问作者andreasnauta
相关产品推荐
相关产品推荐

