3. 术语资源建模与元数据设计

术语资源建模的核心任务,是把临床语义从“一堆词”变成“可被系统识别、校验、映射和演进的资源”。在医疗术语服务平台中,这一层通常围绕七类核心元数据展开:概念(Concept)、描述(Designation)、关系(Relationship)、映射(Mapping)、版本(Version)、语言(Language)与来源(Provenance)。它们不是并列的字段集合,而是有明确分工的语义骨架:概念回答“是什么”,描述回答“怎么称呼”,关系回答“与谁相关”,映射回答“如何对应到别的体系”,版本回答“何时生效”,语言回答“面向谁”,来源回答“谁说的、依据什么”。

以“2型糖尿病”为例,一个规范的概念应具备稳定的内部标识(如 conceptId = DM-T2-001)、首选显示名、定义文本、语义类型(疾病)、状态(active)以及来源(如院内术语委员会 2024 版)。描述层则挂接多个名称:中文首选“2型糖尿病”、英文“Type 2 diabetes mellitus”、缩写“T2DM”、旧称“非胰岛素依赖型糖尿病”。这些描述共享同一概念标识,但各自带有语言标签、使用场景(首选/别名/废弃)和生效区间。关系层再把它连到“糖尿病”父概念、以及“胰岛素抵抗”等关联概念,形成可推理的语义网络。

术语集与值集是两种不同粒度的数据模型。术语集(Terminology Set)是可维护的语义资产,包含概念、描述、关系、映射及其版本历史,强调“完整知识体系”;值集(Value Set)是面向具体使用场景的约束集合,通常通过规则(如“所有 active 的糖尿病相关概念”)或显式枚举来定义,强调“某次业务允许取哪些值”。例如,门诊诊断录入的值集可能只包含 ICD-10 中 E11 开头的糖尿病编码,而科研统计的值集则可能扩展到 SNOMED CT 的完整糖尿病层级。二者关系是:值集从术语集中“取子集”,并绑定版本与生效时间。

在 FHIR 资源建模中,这三类对象分别对应 CodeSystem、ValueSet 和 ConceptMap。CodeSystem 承载概念与描述,其 concept 数组可嵌套表达层级,designation 表达多语言名称,property 表达附加属性;ValueSet 通过 compose.include 引用一个或多个 CodeSystem,并可用 filter 做属性筛选;ConceptMap 则用 group 与 element 描述源系统到目标系统的映射,每个 target 可带 equivalence(equivalent、wider、narrower、inexact 等)和 comment。下面这张图展示了从术语集到值集、再到映射与版本发布的整体数据流关系。

术语集 / CodeSystem conceptId: DM-T2-001 display: 2型糖尿病 designation: T2DM / 旧称 property: 语义类型=疾病 relationship: 父=糖尿病 status: active 来源: 院内术语委员会 2024 值集 / ValueSet compose.include: system = 院内术语集 filter: status=active filter: 语义类型=糖尿病 binding: 门诊诊断录入 version: 2024.1 生效: 2024-01-01 至 2024-12-31 映射 / ConceptMap source: 院内术语集 target: ICD-10 element: DM-T2-001 target: E11.9 equivalence: equivalent comment: 不含并发症 版本: 2024.1 取子集 概念映射 版本化与生命周期管理 草稿 draft 已发布 active 修订中 revising 已废弃 retired 审核通过 需求变更 新版本替代 v0.1 v1.0 v1.1 v1.0 (retired) 版本链: 每次发布生成不可变快照,旧版本保留可追溯

版本化与生命周期管理是术语资源能否长期可用的关键。一个概念从草稿到发布,通常经历 draft → active → revising → retired 四个状态。每次发布生成一个不可变快照,版本号建议采用“主版本.次版本”语义:主版本表示不兼容变更(如概念拆分、语义类型调整),次版本表示兼容性扩展(如新增别名、补充映射)。旧版本不删除,而是标记为 retired 并保留生效区间,这样历史病历中的编码仍可回溯到当时的术语版本。值集和映射同样需要绑定版本,否则“同一个值集”在不同时间可能返回不同结果,导致统计口径漂移。

实际落地时,建议把元数据设计成可校验的约束。例如,概念标识必须全局唯一且不随名称变化;描述必须至少有一个首选中文名;关系必须声明方向与语义类型;映射必须给出 equivalence 等级;每个资源必须记录来源与版本。下面给出一个可直接参考的 CodeSystem 片段示例,展示概念、描述、属性与关系的组织方式:

{
  "resourceType": "CodeSystem",
  "id": "hospital-dm",
  "url": "http://hospital.example/fhir/CodeSystem/hospital-dm",
  "version": "2024.1",
  "name": "院内糖尿病术语集",
  "status": "active",
  "date": "2024-01-01",
  "publisher": "院内术语委员会",
  "language": "zh-CN",
  "concept": [
    {
      "code": "DM-T2-001",
      "display": "2型糖尿病",
      "definition": "以胰岛素抵抗为主的慢性高血糖疾病",
      "designation": [
        { "language": "zh-CN", "value": "2型糖尿病", "use": "preferred" },
        { "language": "en", "value": "Type 2 diabetes mellitus" },
        { "language": "zh-CN", "value": "T2DM", "use": "alias" }
      ],
      "property": [
        { "code": "semantic-type", "valueCode": "disease" },
        { "code": "status", "valueCode": "active" }
      ],
      "concept": [
        { "code": "DM-T2-001-A", "display": "2型糖尿病伴并发症" }
      ]
    }
  ]
}

这段结构说明:code 是稳定标识,display 是默认展示名,designation 承载多语言与别名,property 承载语义类型和状态,嵌套 concept 表达层级。值集则通过 compose.include 引用该 CodeSystem 并施加过滤条件,映射通过 ConceptMap 建立与 ICD-10 等外部体系的对应。三者共同构成“术语集—值集—映射”的闭环,再叠加版本与来源元数据,才能支撑临床、科研、医保等多场景的语义互操作。

设计检查要点:概念标识是否稳定且唯一;描述是否覆盖首选名、别名与多语言;关系是否声明方向与语义类型;映射是否标注 equivalence;值集是否绑定版本与生效区间;来源与发布者是否可追溯。这六项是术语资源能否被安全复用的底线。