Apache Ossie JSON Schema详解:osi-schema.json逐行解读新手完整指南
【免费下载链接】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的朋友,一定绕不开 core-spec/osi-schema.json 这个文件——它是整个 Apache Ossie(语义模型交换的行业标准,前身为 OSI)的"宪法"。这个JSON Schema定义了语义模型(Semantic Model)的结构、类型与枚举,是 AI 工具、BI 平台之间交换语义元数据的唯一"官方合同"。本文将逐行带你读懂它,无需深厚编程背景。
一、osi-schema.json 是做什么的?
一句话定位:它是一个用于校验 Ossie 语义模型定义文件的 JSON Schema(2020-12 草案),对应文件头部的description字段:
"JSON Schema for validating Apache Ossie semantic model definitions"
在 Ossie 的三层架构中,osi-schema.json 规范的是逻辑层(Logical Layer)——即直接映射数据库的传统 BI 语义模型层:
图中标识了 Ossie 的三层模型:Ontological Layer(本体层)、Logical Layer(逻辑层,即本 Schema 管辖区)和 Physical(物理层,各数据库原生 SQL)。
二、顶层结构:只有 2 个字段,却条条必填 🧱
打开 osi-schema.json,前 22 行定义了文件骨架,逐行看:
| 行号 | 字段 | 作用 |
|---|---|---|
| 第 2 行 | $schema | 声明遵循 JSON Schema 2020-12 规范,校验器据此工作 |
| 第 4 行 | title | 文件标题:Apache Ossie Core Metadata Specification |
| 第 8-12 行 | version | 必填,且必须等于"0.2.0.dev0"(const硬校验,写错即不通过) |
| 第 13-19 行 | semantic_model | 必填,语义模型定义数组(一个文件可含多个模型) |
| 第 21 行 | required | version和semantic_model缺一不可 |
| 第 22 行 | additionalProperties: false | 禁止任何未定义字段——这是 Ossie 防"方言漂移"的关键设计 |
💡 新手要点:顶层只允许这两个字段,想加别的?不存在的。所有厂商定制需求都被赶到custom_extensions里(后文详述)。
三、$defs 速览:13 个定义,分四大类 📚
第 23 行开始进入$defs(可复用的类型定义库),按职责可分为四组:
1️⃣ 基础枚举:Dialect 与 DataType
Dialect(第 24 行):表达式的方言枚举,共 7 种:ANSI_SQL、SNOWFLAKE、MDX、TABLEAU、DATABRICKS、MAQL、BIGQUERY。它让同一字段/指标可以携带多种方言的 SQL 写法,实现跨平台移植。DataType(第 111 行):10 种逻辑数据类型——String、Integer、Decimal、Float、Boolean、Date、Time、DateTime、DateTimeTz、Opaque。注意DateTimeTz表示"带时区上下文的时刻",而Opaque是"逃生通道":遇到不可移植的类型,用它加custom_extensions标记。
2️⃣ 扩展机制:AIContext 与 CustomExtension
AIContext(第 34 行):给 AI 工具的上下文,oneOf二选一——直接写一段字符串,或写对象(含instructions使用指令、synonyms同义词、examples示例问题)。这就是 Ossie 拥抱 AI/BI 场景的体现。CustomExtension(第 66 行):厂商自定义扩展,结构固定为vendor_name(任意字符串)+data(JSON 字符串),两项均必填。各 BI 平台可在此夹带私货而不破坏核心兼容性。
3️⃣ 核心实体:一张表看懂必填项 ✅
| 定义 | 含义 | 必填字段 |
|---|---|---|
SemanticModel | 顶层容器,一个完整语义模型 | name、datasets(至少 1 个) |
Dataset | 逻辑数据集(事实/维度表) | name、source(物理表如db.schema.table或查询) |
Field | 行级属性,用于分组/过滤 | name、expression |
Relationship | 数据集间外键关系(多对一/一对一) | name、from、to、from_columns、to_columns |
Metric | 跨数据集的量化度量(KPI) | name、expression |
Dimension | 维度元数据 | 无(仅含is_time布尔标记) |
Expression/DialectExpression | 多方言表达式 | dialects(至少 1 项)/dialect、expression |
4️⃣ 表达式设计:多方言是本 Schema 的"杀手锏"
Expression要求dialects数组至少 1 项(minItems: 1),每项是dialect+expression的组合。一个指标可以这样同时给 Snowflake 和 BigQuery 各写一份 SQL,下游工具按自己的方言取用——这就是"厂商中立"的具体落点。
四、三个最容易踩坑的细节 ⚠️
is_time有默认逻辑(第 131 行):不显式设置时,datatype为Date/Time/DateTime/DateTimeTz的字段自动视为时间维度;审计时间戳这类"日期但不是时间维度"的列,需显式写is_time: false。- 所有实体都写了
additionalProperties: false:每个字段名都被锁死,拼写错误会被校验直接拦下,而不是静默忽略。 from是"多"端、to是"一"端(第 236-243 行):from_columns与to_columns必须一一对应,支持复合键。
五、写完后如何一键校验? 🚀
项目自带校验器 validation/validate.py,它做四件事:
- 用本 Schema 校验结构、类型、枚举;
- 检查数据集/字段/指标/关系名称唯一;
- 检查关系引用的数据集是否存在;
- 用 sqlglot 按方言校验 SQL 表达式语法(MDX、TABLEAU、MAQL 自动跳过)。
对示例文件运行:
python validation/validate.py examples/tpcds_semantic_model.yaml看到Validation PASSED就说明你的语义模型完全符合规范。完整示例可参考 examples/tpcds_semantic_model.yaml。
六、延伸阅读 📖
- 人类可读规范:core-spec/spec.md
- YAML 版字段说明(注释极详尽):core-spec/spec.yaml
- 表达式语言规范:core-spec/expression_language.md
- 官方转换器(dbt、GoodData、Snowflake 等):converters/
🎯总结:osi-schema.json 用约 350 行 JSON,定义了"版本锁 + 语义模型数组"的顶层契约和 13 个核心类型,配合"禁扩展字段 + 厂商扩展区"的双轨设计,实现了严格、中立、可扩展三者的平衡。读懂它,就拿到了整个 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),仅供参考