> 译文仅供阅读便利。具有规范效力的是英文原文。 # 元模型组合 **元宇宙规范** **文档编号:** MU-V2-ARCH-016 **标题:** 元模型架构标准 - 组合、嵌套与连接器 **文档类别:** 规范性 **版本:** 2.0(草案) **状态:** 工作草案 **规范性引用:** 元宇宙宪章(MUC)、MMAS-Core、[Extension-Model](Extension-Model.md)、[Semantic-Mapping](../03-federation/Semantic-Mapping.md) **说明性引用:** [Relationship](../04-core-concepts/Relationship.md)、[Object](../04-core-concepts/Object.md)、[Projection](../04-core-concepts/Projection.md)、[Connector-Catalogue](../06-ecosystem/Connector-Catalogue.md)、[External-Models-Registry](../06-ecosystem/External-Models-Registry.md) **版权:** © Orkestron.AI **许可:** Apache-2.0 --- # 1. 目的 [Extension-Model](Extension-Model.md) 定义元模型如何**导入并扩展**外部标准。[Semantic-Mapping](../03-federation/Semantic-Mapping.md) 定义两个主权元模型如何在不合并的前提下**对齐含义**。本文档填补两者之间的一层:**结构性组合** - 一个元模型的*属性*与*其他元模型*之间是什么关系,以及对任一概念判断它应当是什么的规则: - 由元模型自身持有的**字面属性**(字段);或 - **内嵌**的嵌套元模型(该属性的类型*就是*另一个模型);或 - 指向另行治理的实体或代码表的**引用**。 没有这一层,已注册的模型就是语义孤岛:同一个概念 - 一个地址、一个国家、一笔金额、一条溯源记录 - 会在数十个元模型中各自独立地重新建模,形状彼此不同,于是它们重复了字段,也无法被组合、连接或一并校验。本文档定义了那些把[外部模型](../06-ecosystem/External-Models-Registry.md)目录变成一张互联织物的原则、机制与连接器。 --- # 2. 组合难题 元模型的作者会一次又一次遇到某个*看似*可以做成简单字段、实则更广的生态早已建模过的概念。把每个这样的概念都当成本地字段,会带来三种失效: - **分叉** - `street`、`city`、`postcode`、`country` 在一个元模型里随手建模,在下一个里又是另一套:地址概念被分叉,两者无法互操作。 - **漂移** - 把国家或货币清单复制进本地枚举,会悄然偏离维护它的权威方。 - **陈旧** - 把雇主的属性内联进人员,而不是引用它:于是每个人员都带着同一个组织的一份私有的、正在老化的副本。 元宇宙必须**优先组合而非重复** - 这是 [Extension-Model](Extension-Model.md) §3 中**扩展优于重复**原则在结构层面的对应物。本文档余下的部分让这一偏好变得可操作。 --- # 3. 概念的种类 元模型中出现的每一个概念,就表示方式而言,都必须被归入下列种类中恰好一种。种类通过决策准则(§5)决定了允许使用的组合机制(§4)。 | 种类 | 定义 | 判断 | 默认表示 | |------|------------|------|------------------------| | **属性值** | 一个字面值,没有独立身份,没有内部结构,其取值也不受任何外部权威管辖。 | 「它只是宿主自己拥有的一个值吗?」 | 属性(字段) | | **值对象** | 一组结构化的子值,它们一同出行,各部分相等时即彼此相等;自身没有身份。 | 「它是否有 ≥2 个只有合在一起才有意义的部分?」 | EMBED | | **实体** | 拥有自身身份与生命周期的事物,可被引用、可被共享,独立于任何宿主。 | 「其他对象能指向它吗;它能被独立创建、版本化、拥有吗?」 | REFERENCE | | **代码 / 分类符** | 某个由外部权威治理的值集、分类或标识符方案中的一员。 | 「允许取值的集合由别人维护吗?」 | REFERENCE(指向该方案) | | **切面** | 不分领域地附着于许多对象的横切关切 - 溯源、有效时间、策略、安全标记、多语言标签。 | 「这是*关于*数据的,而不是领域载荷的*一部分*吗?」 | MIX-IN | 概念的种类是一项建模决定,而不是内在真理:同一个词(「地址」「组织」)在一个元模型里可能是实体,在另一个里则是值对象的快照。作者必须记录所选的种类,使校验器与消费方能够据此推理。 --- # 4. 组合机制 有六种机制把元模型连接起来。每一种都有不同的耦合度与主权特征。其中两种 - **EXTEND** 与 **MAP** - 在别处规定,这里列出只为完整;本文档规定的是 **EMBED**、**REFERENCE** 与 **MIX-IN**。 | # | 机制 | 作用 | 耦合 | 主权 | 规定于 | |---|-----------|--------------|----------|-------------|--------------| | 1 | **EMBED**(组合) | 某属性的类型*就是*另一个元模型;该值作为没有独立身份的嵌套对象随宿主一同出行。 | 紧:复合体归宿主所有 | 复用嵌套模型的*形状*;其权威得以保留 | **本文档** | | 2 | **REFERENCE**(关联) | 某属性持有一个标识符,用以解析到外部实体或代码方案;被引用者在别处生存与被治理。 | 松 | 完全保留:被引用者仍然主权独立 | **本文档** | | 3 | **MIX-IN**(切面 / 特质) | 某个横切包的属性以自身命名空间统一施加于许多宿主对象。 | 正交 | 切面模型仍然权威 | **本文档** | | 4 | **EXTEND**(特化) | 宿主元模型是一种 / 细化某个导入模型,增加约束或属性。 | 紧(子类型) | 依导入规则 | [Extension-Model](Extension-Model.md) §8 | | 5 | **MAP**(对齐) | 两个主权模型声明字段等价,而不作结构改动。 | 无(结构上) | 最大 | [Semantic-Mapping](../03-federation/Semantic-Mapping.md) | | 6 | **ANNOTATE**(打标) | 把受控词表中的一个概念附加到属性上,为的是含义而不是结构。 | 无 | 最大 | 本文档(§4.3) | ## 4.1 EMBED EMBED 用于**值对象**。宿主属性由另一个元模型来定型(最好是作为[语义包](Extension-Model.md §4)导入的那种),而被内嵌的值: - 必须保留被内嵌模型的命名空间、版本与[语义指纹](Versioning.md); - 不得被压平成宿主的临时属性; - 在宿主内部**没有独立身份** - 它是一个值,与任何部分相同的内嵌值相等; - 把自己的形状贡献给宿主自身的语义指纹,从而可以证明两个「有地址」的宿主对「什么是地址」看法一致。 当某个概念具有在整个生态中反复出现的内部结构(地址、金额、数量、地理点、人名、时间区间)时,EMBED 正是那个正确的机制。 ## 4.2 REFERENCE REFERENCE 用于**实体**与**代码**。宿主属性持有的是标识符,而不是被引用者内容的副本。 - **实体引用** - 建模为指向某个以其正典标识符标识的元对象的[关系](../04-core-concepts/Relationship.md),或建模为由某个标识符方案定型的标识符属性。被引用者的属性不得被内联;它们要通过解析该引用来获取(当被引用者位于另一个宇宙时,须受[契约](../04-core-concepts/Contract.md)与[投影](../04-core-concepts/Projection.md)的约束)。 - **代码引用** - 建模为取值是「取自方案 *S* 的一个术语」的属性,并携带该方案的 URI 与版本。*S* 的成员不得被复制进本地枚举;携带方案与版本使漂移变得可检出。 当审计或不可变性要求一份冻结视图时(例如某个投影捕捉某地址在某一时刻的样子),引用可以被**快照** - 作为不可变的值副本被内嵌。快照必须被如此标注,并且必须记录来源标识符与捕获事件,以免它被误当作活的被引用者。这是「重复」的正当面向(§6)。 ## 4.3 MIX-IN 与 ANNOTATE **切面**必须以 MIX-IN 方式施加:一个已声明的切面包,其属性以自身命名空间融入宿主,并统一施加于许多对象(例如每个对象上的 `prov:*` 溯源、每个版本化对象上的有效时间、契约上的 `odrl:*` 策略)。切面不得被重新发明成定制的领域字段,也不得被埋进领域载荷之中 - 它是*关于*数据的。 ANNOTATE 把受控词表中的一个概念(一个 SKOS 概念、一个 schema.org 类型)附加到属性上,以确定其含义而不改变其结构。它是最轻的机制,并完整保留主权。 --- # 5. 决策准则 对元模型 *M* 中出现的任一概念 *C*,**按顺序**施加下列判断;第一条命中的即确定其表示方式。 1. **切面判断(正交,最先施加)。** *C* 是横切关切(溯源、有效时间、访问策略、安全标记、多语言标签),而不是领域载荷吗?→ 对相应切面模型作 **MIX-IN**。到此为止。 2. **身份判断。** *C* 是否指称一个拥有自身身份与生命周期、可被引用、可独立于 *M* 被创建、版本化或拥有的事物?→ *C* 是**实体**:按标识符 **REFERENCE** 它。只有当不可变性或审计要求时,才以标注过的**快照**形式内嵌。到此为止。 3. **权威判断。** *C* 的允许取值集合,或它的内部结构,是否已由某个外部标准治理? - **代码表 / 分类 / 标识符方案** → **REFERENCE** 该方案(术语 + 方案 URI + 版本)。绝不复制它的成员。到此为止。 - **结构化值对象标准**(地址、金额,等等)→ 优先采用那个正典模型,并继续进行结构判断。 4. **结构判断。** *C* 是否具有内部结构 - 两个或更多一同出行、拆散到宿主各处就毫无意义的子值?→ *C* 是**值对象**:把它 **EMBED** 为嵌套元模型(最好是导入的正典模型)。不要压平它的各部分。到此为止。 5. **复用判断。** 即便 *C* 目前是原子的,范围内是否有两个或更多元模型需要同样形状的它(现在或可预见的将来)?→ 把 *C* 抽出为共享的值对象并对其 EMBED/REFERENCE,使该形状只被定义一次。到此为止。 6. **默认。** *C* 是**属性值**:一个没有独立身份、没有外部权威、没有内部结构、也不跨模型复用的字面量。把它表示为**属性(字段)**。在多个元模型之间重复这样的字段是可以接受的(§6)。 ```text ┌───────────────────────────────────────────────┐ concept C │ 1. cross-cutting concern? ── yes ─▶ MIX-IN │ │ 2. own identity/lifecycle? ── yes ─▶ REFERENCE │ │ 3. governed value set? ── yes ─▶ REFERENCE │ │ 4. internal structure? ── yes ─▶ EMBED │ │ 5. reused across models? ── yes ─▶ EMBED │ │ 6. otherwise ─────────▶ FIELD │ └───────────────────────────────────────────────┘ ``` 合规的元模型应当能够为每一个属性说出产生其表示方式的那条判断,从而给出理由。 --- # 6. 何时重复是可接受的 「组合优于重复」是默认,而不是绝对。在以下情形中,重复某个值、或在多个元模型里把「同一个」概念作为普通字段持有,是**正确的**: - **原子属性值。**一个 `title`、一个 `quantity`、一段自由文本 `note` - 没有共同权威的字面量。两个元模型各自持有这样的字段并不是在分叉某个概念;它们持有的是两项恰好同名的独立属性。 - **不可变快照。**某个投影、审计记录或[冲突保留](../03-federation/Conflict-Resolution.md)条目为了不可变性或就近可用而刻意冻结一份值副本。这里*副本本身就是目的*;它必须被标注为快照,并带有来源标识符与捕获事件(§4.2)。 - **以映射维持主权。**当两个模型各自独立治理,而一条跨接([Semantic-Mapping](../03-federation/Semantic-Mapping.md))比结构耦合更可取时,各自保留自己的字段,链接是 MAP 而不是 EMBED。 - **避免过度规范化。**当抽出共享模型带来的耦合超过该概念本身的价值(一次性的、确实局部的原子值)时,保留一个字段才是相称的选择。 只有当重复分叉了*结构化的*值对象、*复制*了受治理的代码表、*内联*了实体,或*重新发明*了切面时,它才是**缺陷** - 这正是该准则要抓的四种情形。 --- # 7. 外部模型的组合角色 为使组合在生态规模上可预期,[注册表](../06-ecosystem/External-Models-Registry.md)中的每个外部模型都可以被赋予一个**组合角色**,用以预测其他模型应当如何与它相连。[Connector-Catalogue](../06-ecosystem/Connector-Catalogue.md) 把这些角色应用于基础连接器,而全部 1180 项已编目标准都在 [`external-models.csv`](../06-ecosystem/external-models.csv) 中带有角色与默认链接类型(分布情况见 [External-Models-Registry §3a](../06-ecosystem/External-Models-Registry.md))。 | 角色 | 说明 | 默认链接 | 示例 | |------|-------------|--------------|----------| | **R1 基础值对象** | 有结构、无身份、随处可见 | EMBED | 地址(CIQ xAL)、金额、数量(QUDT)、地理点、人名、时间区间 | | **R2 参考数据 / 代码表** | 经过策展的值集或分类 | REFERENCE | ISO 3166、ISO 4217、ISO 639、UCUM、GPC、NACE、ESCO、SNOMED CT | | **R3 标识符方案** | 实体的键 | REFERENCE | LEI、ISIN、GTIN、GLN、DOI、ORCID/ISNI、IBAN/BIC、DID | | **R4 实体模型** | 拥有身份与生命周期的事物 | REFERENCE;快照式 EMBED | schema:Organization、FHIR Patient、W3C ORG、schema:Place | | **R5 横切切面** | 施加于许多对象的关切 | MIX-IN | PROV-O、OWL-Time、ODRL、SKOS-XL 标签 | | **R6 聚合 / 文档** | 把 R1-R5 组合成一份文档 | 组合(很少被内嵌) | UBL Invoice、C-CDA、EPCIS Event、Order | | **R7 上层本体 / 基础** | 本体论上的落地 | ALIGN / ANNOTATE | BFO、DOLCE、ISO 15926 上层、Common Logic | | **R8 映射 / 提升工具** | 实现 MAP / 转换 | 不适用(工具) | R2RML、RML、SAWSDL | 角色是指引,不是法律:一个模型可以在某个上下文中被内嵌,在另一个中被引用。角色说的是*典型的*、*推荐的*链接方式。 --- # 8. 在 MMAS 中表达组合 每种机制在 MMAS 中都有具体表达。无论机制为何,每一条链接都必须保留被链接模型的**命名空间、版本、溯源与语义指纹**,并且不得违反 [Extension-Model](Extension-Model.md) §18 的导入不变量。 - **EMBED** - 一个由另一命名空间中的元对象类型定型的属性;被内嵌的模型被声明为语义包依赖;宿主的指纹纳入被内嵌的形状。 - **REFERENCE(实体)** - 指向某元对象的[关系](../04-core-concepts/Relationship.md),或以标识符定型的属性;跨宇宙的引用受契约治理,并以投影形式交换。 - **REFERENCE(代码)** - 类型为 `术语 ∈ 方案` 的属性,携带方案 URI 与版本;校验器可以检查成员资格并检出漂移。 - **MIX-IN** - 以自身命名空间融入的切面包;统一施加;在元模型的切面清单中声明。 - **EXTEND** / **MAP** / **ANNOTATE** - 按各自所属文档的规定。 元模型应当为每一个属性声明它的**组合种类**(attribute / embed / reference / mixin),并在 embed 与 reference 两种情形下声明连接器标识符与版本。正是这份声明,使某个模型的组合变得机器可查。 --- # 9. 完整示例 - `employee.person` 单单一个人员概念就用上了全部机制: | 概念 | 种类 | 机制 | 连接器 | |---------|------|-----------|-----------| | name | 值对象 | EMBED | 人名(CIQ xNL / schema 的姓名各部分) | | address | 值对象 | EMBED | 邮政地址(CIQ xAL / vCard ADR) | | nationality | 代码 | REFERENCE | ISO 3166-1 | | primaryLanguage | 代码 | REFERENCE | ISO 639(+ ISO 15924 书写系统) | | salary | 值对象 | EMBED | 货币金额(金额 + ISO 4217 币种) | | height | 属性值(+单位) | FIELD + REFERENCE | 字面值;单位 ∈ UCUM | | employer | 实体 | REFERENCE | 按 ISO 17442 LEI 指称的组织 | | orcid | 标识符 | REFERENCE | ORCID / ISO 27729 ISNI | | provenance | 切面 | MIX-IN | PROV-O | | validFrom/validTo | 切面 | MIX-IN | OWL-Time / 生命周期有效时间 | | accessPolicy | 切面 | MIX-IN | ODRL | 为了联邦,同一个 `person` 随后通过 [Semantic-Mapping](../03-federation/Semantic-Mapping.md) **MAP** 到 `fhir:Patient` 与 `foaf:Person`:为达成互操作,人员的任何字段都没有被复制;被声明的只是对应关系。 --- # 10. 反模式 - **被压平的值对象** - 用 `addr_line1`、`addr_city`、`addr_zip` 作宿主字段,而不是内嵌的地址。分叉了概念;阻断了连接与校验。 - **被复制的代码表** - 用本地 `country` 枚举而不是指向 ISO 3166 的引用。会偏离权威方。 - **被内联的实体** - 把雇主的名称、地址、注册信息复制进每一个人员,而不是用引用。产生陈旧的重复;侵犯被引用者的主权。 - **被重新发明的切面** - 用定制的 `created_by` / `created_at` / `source` 字段,而不是 PROV 混入。把溯源在整个生态中打得粉碎。 - **过度内嵌** - 把一个确实原子的属性值包进嵌套模型。带来不必要的耦合;这是反方向的错误。 - **按值内嵌实体** - 复制一个拥有身份的事物,从而丢掉它的身份、生命周期与主权。 它们与该准则(§5)所要防止的各类失效一一对应,并且是对[常见设计错误](../05-reference-architecture/Anti-Patterns.md)的扩展。 --- # 11. 校验与合规 合规的实现应当校验: - 每个属性都声明了组合种类; - embed 与 reference 属性都指明了连接器与版本; - 代码类型的属性都携带方案 URI 与版本(漂移可检出); - 没有任何一簇属性以平铺字段的方式复现出某个已知值对象连接器的形状(分叉检查); - 快照都已标注,并带有来源标识符与捕获事件。 这些检查是对 [Validation](Validation.md) 各级别与[语义测试套件](../tests/)的推荐补充。组合声明本身就是元模型的一部分,因而被它的语义指纹所覆盖。 --- # 12. 架构不变量 组合绝不得违反: - **元宇宙宪章**与语义主权 - 被引用与被内嵌的模型保留各自的权威、身份与治理; - **溯源与可追溯性** - 每条链接都记录出处、命名空间与版本; - **版本完整性** - 链接感知版本;连接器发生变化会触发兼容性评估,而不是悄然迁移; - [Extension-Model](Extension-Model.md) §18 的**导入不变量**。 --- # 结语 多数时候,字段就是正确答案 - 但当那个「字段」暗地里其实是一个地址、一个国家、一个组织,或一条世界上早已建模过的溯源记录时,就不是了。元模型组合给作者一条统一的规则来分辨它们,给出三种机制(内嵌、引用、混入)把它们接起来,并给出一份可供接入的连接器目录。正是这一层,把一份收录上千项孤立标准的注册表变成一张可组合的织物 - 概念只建模一次,却能处处复用,而没有任何模型因此交出自己的主权。