You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
          }
        )
    )

逻辑说明:

  1. 筛选目标顶点后,获取所有键名包含p_settings.的属性
  2. 将每个属性的键按.拆分,逐层构建嵌套Map
  3. 最后合并所有层级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:05:25