Apache Ossie表达式语言标识符解析与命名空间设计深度解析
【免费下载链接】ossieApache Ossie, industry wide specification effort to standardize how we exchange semantic metadata across analytics, AI and BI platforms, providing a vendor neutral, single source of truth for semantic data项目地址: https://gitcode.com/GitHub_Trending/osi1/ossie
Apache Ossie 是一个由 Apache 软件基金会孵化的开源项目,目标是让 AI、BI 与分析平台之间能够无损交换"语义模型"。要读懂它的规范,绕不开两块核心设计:表达式语言的标识符解析规则与命名空间(Namespace)机制。本文带你快速搞懂 Ossie SQL 方言中字段标识符如何书写、大小写如何匹配、dataset.field式命名空间如何工作,以及为什么这样设计才能让语义定义在 Snowflake、Databricks、BigQuery 之间自由流转。
为什么 Ossie 需要一套表达式语言?
Ossie 把语义模型分成三层(见上图):
| 层级 | 作用 | 使用的语言 |
|---|---|---|
| 本体层(Ontological Layer) | 偏 OWL 类建模语言 | 待定 |
| 逻辑层(Logical Layer) | 指标、字段、过滤器等定义 | Ossie SQL |
| 物理层(Physical) | 落到具体数据库 | 各数据库原生 SQL |
表达式语言提案目前只针对逻辑层——也就是你在 YAML 里写指标(metrics)、字段(fields)、过滤器(filters)时用的那部分。完整设计原则见 core-spec/expression_language.md:
- 可移植性:核心函数在所有实现中行为一致
- 熟悉度:基于被广泛采用的 SQL 语法(ANSI SQL:2003 Core)
- 分析导向:优先覆盖 BI 场景常用函数
- 可扩展性:厂商方言可以在核心之外做扩展
这意味着你写SUM(orders.amount)时,不用关心底层是 Snowflake 还是 PostgreSQL。
标识符解析:4 条核心规则
1. 遵循标准 SQL 标识符,上限 128 字符
所有标识符必须是合法的 ANSI SQL 名称,并且长度不超过 128 个字符。很多数据库支持更长,但 128 是一个对大多数厂商都"安全"的保守值——这是典型的"取最小公约数"式标准化思维。
2. 不带引号的标识符:大小写不敏感
普通(未加引号)标识符应视为大小写不敏感。也就是说,id会匹配Id和iD。
3. 引号统一使用双引号"
Ossie 方言遵循 ANSI SQL,用双引号做转义引号。注意:加引号后就是精确匹配,"id"和id是两个不同的东西。部分数据库使用反引号等其他引号,规范的做法是——Ossie 文档用 Ossie 方言书写,查询时再按本地方言执行。
4. 一张表看懂大小写匹配
规范中给出的对照表,建议收藏:
| 你在 SQL 中写 | 等价于 | 能匹配名为id的列吗? |
|---|---|---|
id | ID | ✅ 能(标准行为) |
Id | ID | ✅ 能(标准行为) |
"ID" | ID | ✅ 能(强制匹配规范化大小写) |
"id" | id | ❌ 不能(引号导致精确匹配小写) |
规范化标识符(Normalized Identifier)
为了让工具能做可靠的匹配,Ossie 定义了规范化标识符的形态:
- 普通标识符 →统一转大写
- 带引号标识符 →去掉引号并还原转义字符
规范化之后,匹配就变成了简单的"大小写敏感的精确比较"。这是整篇文档里对实现方最友好的设计之一:语义匹配交给规范化,而不是在运行时反复纠结大小写。
命名空间设计:dataset.field如何工作
字段引用的语法
标识符遵循标准 SQL 形式,允许多段式引用,用.分隔:
Field: <SQL Identifier> FieldExpr: Field | Field '.' Field所以orders.amount就是一个合法的字段表达式——orders是数据集(dataset)限定符,amount是字段名。这和 SQL 中表.列的习惯完全一致,降低学习成本。
三个命名空间决定"可见性与唯一性"
Ossie 规范中目前包含三个命名空间,一个字段(或指标)定义在什么位置,就决定了它属于哪个命名空间,进而决定了其他字段以什么方式引用它。在核心规范 core-spec/spec.md 中可以看到对应结构:
- 数据集内的字段:
datasets[].fields[],名字在所属数据集内唯一 - 指标:
metrics[],定义在语义模型级别,可以跨多个数据集引用字段 - 语义模型本身:文档顶层的
name
这也解释了为什么指标表达式里要写全限定名。看一个真实的规范示例:
- name: total_revenue expression: dialects: - dialect: ANSI_SQL expression: SUM(orders.amount)SUM(orders.amount)中的orders.前缀就是命名空间限定符,告诉解析器"去 orders 这个数据集里找 amount 字段"。这样即使两个数据集都有amount字段,引用也不会歧义——这正是命名空间存在的意义:用位置换取无歧义性。
一个完整可运行的 TPC-DS 语义模型示例见 examples/tpcds_semantic_model.yaml,机器可读的 Schema 定义见 core-spec/ossie-schema.json 与 core-spec/spec.yaml。
方言机制:Ossie SQL 是"默认答案"
命名空间解决了"找谁",方言(dialect)解决"怎么算"。表达式语言提案规定:
- 新增一个方言
Ossie_SQL_2026,指向这份语言规范 - 未显式指定方言时,
Ossie_SQL_2026为默认方言
当某个函数在各数据库间写法确实不同(比如 BigQuery 的DATE_TRUNC(d, MONTH)参数顺序与 ANSI 相反),你可以为同一字段提供多个方言版本:
expression: dialects: - dialect: ANSI_SQL expression: DATE_TRUNC('month', order_date) - dialect: BIGQUERY expression: DATE_TRUNC(order_date, MONTH)规范对实现的约束是:Ossie 方言必须被支持,其他方言可以被忽略;如果同一表达式声明了多个方言,实现必须确定性地选择其中一个,不能随机。
新手常见误区清单 ⚠️
| 误区 | 正确理解 |
|---|---|
"id"和id一样 | 不一样!引号内是精确匹配,跨库最不可移植的写法 |
| 标识符可以任意长 | 上限 128 字符,超长名会破坏可移植性 |
| 表达式里能写子查询 | 不支持SELECT/JOIN/子查询,交给语义层处理 |
| 省略数据集前缀更省事 | 多数据集存在同名字段时会产生歧义,建议始终写dataset.field |
| Ossie 方言是可选的 | 它是默认方言,所有实现必须支持 |
顺带一提,规范明确列出了不允许出现在表达式中的结构(GROUP BY、WHERE、CTE、UNION等),因为它们分别由粒度声明、filter 属性、语义层接管——表达式的边界越干净,跨平台解析器越好写。
延伸学习路径 📚
| 想了解 | 去哪里看 |
|---|---|
| 标识符解析、命名空间、函数全集、各 BI 工具函数映射 | core-spec/expression_language.md |
| 语义模型结构(datasets / fields / metrics) | core-spec/spec.md |
| 完整语义模型示例 | examples/tpcds_semantic_model.yaml、examples/flights.yaml |
| 各平台转换器(dbt、Databricks、Sigma 等) | converters/ |
| 模型合法性校验工具 | validation/ |
| 项目文档与工作组 | docs/index.md、docs/working_groups.md |
比如 converters/dbt/ 中的转换器就实现了"剥离数据集限定符"的逻辑(orders.amount→amount),是观察命名空间解析如何落地的绝佳参考;而 converters/sigma/LIMITATIONS.md 则记录了哪些 Sigma 表计算函数无法表达为可移植表达式——读"限制文档"往往比读规范正文更能帮你建立边界感。
总结:Ossie 表达式语言的设计哲学可以浓缩为一句话——用 ANSI SQL 的保守公约数定义核心(128 字符标识符、大小写规范化、dataset.field命名空间、默认 Ossie 方言),把差异留给方言扩展。理解了这个取舍,你就能读懂任何一份 Ossie 语义模型,也能预判它在各平台上会不会"水土不服"。
【免费下载链接】ossieApache Ossie, industry wide specification effort to standardize how we exchange semantic metadata across analytics, AI and BI platforms, providing a vendor neutral, single source of truth for semantic data项目地址: https://gitcode.com/GitHub_Trending/osi1/ossie
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考