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。下面这张图展示了从术语集到值集、再到映射与版本发布的整体数据流关系。
版本化与生命周期管理是术语资源能否长期可用的关键。一个概念从草稿到发布,通常经历 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 等外部体系的对应。三者共同构成“术语集—值集—映射”的闭环,再叠加版本与来源元数据,才能支撑临床、科研、医保等多场景的语义互操作。