全部文档
文档中心DeepModel功能DeepQL常用语法与使用技巧八、层级与树形

八、层级与树形

对象开启层级结构后,会有一条指向父级的链接 parent。通过 parent 及其反向链接可以取父级、子级;通过 递归函数 可以取某成员的祖先、后代等集合。

含义

写法

父级

.parent(当前对象的父对象集合)

子级

.<parent[is 对象类型](指向当前对象的所有子对象)

parent 为多选链接时,.parent 可能是多个;反向 .<parent[is 对象类型] 表示「以当前对象为父的所有该类型对象」。

基于 parent 层级,常用递归函数如下:

函数

说明

cal::base(member)

指定成员的末级成员集合(叶子)

cal::ibase(member)

指定成员及其末级成员集合

cal::descendant(member)

指定成员的后代成员集合(不含自身)

cal::idescendant(member)

指定成员及其后代成员集合

cal::ancestor(member)

指定成员的祖先成员集合

cal::iancestor(member)

指定成员及其祖先成员集合

参数为对象实例的集合,通常传单条(如先 select 一条再传入)。

假设对象 DimRegion(大区)有层级:code、name、parent(父级)、可选 self/cal_self 等自我链接。

属性/链接

说明

code

大区编码(业务主键)

name

大区名称(多语言)

parent

父级(链接 DimRegion)

获取 code 为 ‘TotalRegion’ 的大区及其所有后代成员的 code、中文名。

Copy
with m := (select DimRegion filter .code = 'TotalRegion')

select cal::idescendant(m) {
    code,
    name_zh := <str>.name['zh-cn']
}

结果示意:

Copy
[
  { "code": "TotalRegion", "name_zh": "全国" },
  { "code": "HD", "name_zh": "华东" },
  { "code": "HN", "name_zh": "华南" }
]

维度根成员用空集表示:<对象类型>{}。例如取大区下所有成员(即「根的后代」):

Copy
select cal::idescendant(<DimRegion>{}) {
    code,
    name_zh := <str>.name['zh-cn']
}

获取「华东」的父级成员:

Copy
with m := (select DimRegion filter .code = 'HD').parent

select m {
    code,
    name_zh := <str>.name['zh-cn']
}

获取「华东」的子级成员:

Copy
with m := (select DimRegion filter .code = 'HD').<parent[is DimRegion]

select m {
    code,
    name_zh := <str>.name['zh-cn']
}

结果示意(子级):

Copy
[
  { "code": "SH", "name_zh": "上海" },
  { "code": "ZJ", "name_zh": "浙江" }
]

递归函数默认沿 parent 链接计算层级。当对象有多条自我链接(如 parent 之外还有 self、计算链接 cal_self 等),需要用 L"链接编码" 字符串来指定沿哪条链接递归。

完整签名:

Copy
cal::idescendant(member, link_code, validate)

参数

类型

说明

member

对象实例集合

起始成员

link_code

L"..." 字符串

指定递归所沿用的链接编码,必须用 L"..." 格式

validate

bool(可选)

是否校验成环,默认 false;为 true 时数据成环会报错

L"..." 是 DeepQL 中的链接字符串字面量,用于在需要传递链接编码的场景中引用链接名称。注意:计算链接同样可以用 L"..." 引用——只要链接在 schema 中定义了编码,无论是普通链接还是计算链接,都可以传入。

假设 DimRegion 除了 parent 还有一条计算链接 cal_self(通过业务规则动态计算的层级关系),取「华东」沿 cal_self 的所有后代:

Copy
with m := (select DimRegion filter .code = 'HD')

select cal::idescendant(m, L"cal_self") {
    code,
    name_zh := <str>.name['zh-cn']
}

带成环校验(数据有环时直接报错而不是死循环):

Copy
with m := (select DimRegion filter .code = 'HD')

select cal::idescendant(m, L"cal_self", true) {
    code,
    name_zh := <str>.name['zh-cn']
}

其他递归函数(cal::descendantcal::ancestorcal::iancestorcal::basecal::ibase)同样支持 link_codevalidate 参数,用法一致。

能力

写法

父级

.parent

子级

.<parent[is 对象类型]

后代/祖先

cal::idescendant(m)cal::iancestor(m)

根成员

<对象类型>{}

指定链接递归

cal::idescendant(m, L"链接编码"),普通链接和计算链接均可

成环校验

第三参数传 true,数据有环时报错而非死循环

下一步可了解如何查询模式元数据,见「九、自省查询」。

回到顶部

咨询热线

400-821-9199

我们使用 ChatGPT,基于文档中心的内容以及对话上下文回答您的问题。

ctrl+Enter to send