Azure Cosmos Graph DB嵌套属性Gremlin查询问题
Azure Cosmos Graph DB 嵌套属性查询解决方案
你在Azure Cosmos Graph DB中存储的嵌套properties数据会被自动扁平化存储,比如settings下的嵌套属性会变成类似p_settings.DigitalInput.Input1.nTransIn1.tagName的键,直接用valueMap("p_settings")无法获取完整嵌套结构,可通过以下几种方式解决:
方法1:动态重组嵌套结构(通用方案)
通过Gremlin的字符串处理和Map组装能力,将扁平化的键值对重新还原为嵌套结构,适合嵌套层级不固定或路径较多的场景:
g.V().has('s_objectId', within('9d8cf5c6-7b5f-4d0b-af70-bf516f219d73')) .project('settings') .by( properties().hasKey(containing('p_settings.')) .fold() .unfold() .map( map -> { def keyParts = map.key().split('\\.'); def value = map.value(); def nested = [:]; def current = nested; // 从第1个索引开始跳过前缀p_settings for (int i = 1; i < keyParts.length; i++) { if (i == keyParts.length - 1) { current[keyParts[i]] = value; } else { current[keyParts[i]] = [:]; current = current[keyParts[i]]; } } return nested; } ) .fold() .map( maps -> { def result = [:]; maps.each { m -> def rootKey = m.keySet().iterator().next(); // 合并层级Map if (result.containsKey(rootKey)) { result[rootKey] << m[rootKey]; } else { result[rootKey] = m[rootKey]; } } return result; } ) )
逻辑说明:
- 筛选目标顶点后,获取所有键名包含
p_settings.的属性 - 将每个属性的键按
.拆分,逐层构建嵌套Map - 最后合并所有层级Map,还原出完整的
settings嵌套结构
方法2:指定完整扁平化键查询(精准方案)
如果明确知道嵌套属性的完整路径,可以直接指定扁平化后的键名来查询,适合路径固定且数量较少的场景:
g.V().has('s_objectId', within('9d8cf5c6-7b5f-4d0b-af70-bf516f219d73')) .valueMap( 'p_settings.DigitalInput.Input1.nTransIn1.tagName', 'p_settings.DigitalInput.Input2.nTransIn2.tagName' )
查询结果会返回指定的扁平化键值对,你可以在客户端自行组装成嵌套结构。
方法3:写入时保留嵌套结构(前置优化)
修改数据写入逻辑,在存储扁平化属性的同时,额外存储完整的p_settings嵌套属性。这样后续查询时,直接使用valueMap("p_settings")就能获取完整嵌套结构,无需动态重组。
内容的提问来源于stack exchange,提问作者Divya Vyas
相关产品推荐
相关产品推荐

