4. 集成工程中的术语子集与引用集

在SNOMED CT集成工程中,术语子集(Subset)与引用集(Reference Set)是控制术语使用范围、约束临床录入内容、支撑本地化表达的核心机制。如果把SNOMED CT全量概念比作一座拥有数十万词条的巨型词典,那么引用集就是为特定临床场景、特定科室或特定业务系统裁剪出的“专用词表”。理解引用集的类型体系、成员管理方式以及构建维护流程,是术语集成从“能查到”走向“用得住”的关键一步。

引用集的基本定位与类型体系

引用集本质上是一种标准化的容器结构,它通过“引用集标识符 + 成员记录”的方式,把一组SNOMED CT组件(概念、描述或关系)组织在一起,并附加成员级别的元数据。与简单的概念列表不同,引用集在SNOMED CT的发布文件中以独立文件形式存在,每个成员记录都包含引用集ID、被引用组件ID、成员状态以及若干可选字段。这种结构使得引用集既能表达“哪些概念属于这个集合”,也能表达“这些概念在该集合中扮演什么角色”。

从集成工程视角看,最常打交道的引用集类型包括以下几类:

  • 简单类型引用集(Simple type):最基础的成员集合,仅记录成员是否属于该集合,常用于表达“允许使用”“禁止使用”这类二元判断。例如某医院将“本院检验项目可编码概念”构建为一个简单引用集。
  • 有序类型引用集(Ordered type):在简单类型基础上增加排序字段,成员在集合中具有明确的先后顺序。典型场景是临床路径中的推荐术语排序、护理评估量表的选项顺序。
  • 关联类型引用集(Association type):成员之间建立映射或关联关系,常用于表达“旧概念→新概念”的替换关系,或本地术语与SNOMED CT概念之间的对应关系。
  • 属性值类型引用集(Attribute value type):为每个成员附加一个属性值,例如为某概念标注“适用科室=心内科”“使用优先级=高”。
  • 语言类型引用集(Language type):用于管理某语言或方言下的可接受描述,支持多语言临床环境。
  • 模块依赖类型引用集(Module dependency type):记录扩展模块之间的依赖关系,属于发布管理层面的引用集。

在集成工程中,选择哪种类型取决于业务需求:如果只需要控制“能不能用”,简单类型足够;如果需要控制“按什么顺序展示”,有序类型更合适;如果需要携带科室、优先级等附加信息,则应使用属性值类型。

成员管理:从标识到状态

引用集的成员管理围绕“成员记录”展开。每条成员记录至少包含三个核心字段:referencedComponentId(被引用的概念、描述或关系ID)、refsetId(所属引用集ID)、active(成员是否有效)。对于属性值类型,还会增加attributeValue字段;对于关联类型,则增加targetComponentId字段。

成员管理的关键操作包括新增、失效和更新。在SNOMED CT的版本化发布机制中,成员通常不直接删除,而是通过将active置为0来标记失效,从而保留历史可追溯性。例如,某概念因临床指南更新不再推荐使用,集成工程师不会从引用集中物理删除该成员,而是将其状态置为失效,并在关联类型引用集中指向新的推荐概念。这种“失效+替换”的模式是术语治理中保证数据可审计的重要实践。

在本地扩展中,引用集ID应遵循SNOMED CT的命名规范,通常由命名空间标识符与本地序列号组成,避免与国家标准发布内容冲突。

临床场景筛选:从业务需求到概念集合

临床场景筛选是引用集构建中最需要专业判断的环节。它要求集成工程师与临床专家协作,把“某个场景下医生应该能选到什么术语”转化为明确的概念集合。筛选通常遵循以下逻辑:

  1. 确定场景边界:明确引用集服务的业务范围,例如“急诊胸痛分诊”“糖尿病随访”“手术麻醉记录”。
  2. 确定语义范围:判断需要哪些语义轴上的概念,例如疾病诊断、症状、操作、检验项目、药物等。
  3. 利用层级关系收窄:通过SNOMED CT的IS-A层级,从高层概念向下筛选。例如“胸痛”场景可纳入“胸痛”及其所有后代概念,同时排除明确不属于该场景的分支。
  4. 排除不适用概念:剔除已失效概念、与本地政策冲突的概念、粒度过粗或过细的概念。
  5. 临床复核:由临床专家逐条确认或抽样确认,确保术语符合实际记录习惯。

在实际工程中,筛选往往借助SNOMED CT的表达式约束或ECL(Expression Constraint Language)查询来完成。例如,要筛选“所有属于心血管疾病且不在儿科专用集合中的概念”,可以用ECL表达为<< 49601007 |心血管疾病| MINUS ^ 900000000000000000 |儿科专用引用集|。这种基于表达式的筛选方式比手工枚举更可维护,也更容易在版本升级时重新执行。

子集构建与维护流程

一个可长期运行的引用集,需要建立从需求到发布再到维护的闭环流程。下图展示了一个典型的引用集构建与维护流程,涵盖需求分析、概念筛选、成员编辑、验证发布和版本维护五个阶段,并标注了各阶段的关键输入与输出。

引用集构建与维护流程 ① 需求分析 场景边界 · 语义范围 临床专家协作 ② 概念筛选 ECL查询 · 层级收窄 排除失效/冲突概念 ③ 成员编辑 新增/失效/更新 属性值标注 ④ 验证发布 临床复核 · 完整性检查 版本打包 ⑤ 版本维护 新版本重执行 失效替换追踪 迭代反馈 输入 临床需求文档 SNOMED CT国际版/国家版 输出 引用集文件(.txt/.csv) 成员清单与状态报告 关键成员字段 refsetId — 引用集标识 referencedComponentId — 概念ID active — 成员状态(1/0) attributeValue — 属性值(可选) targetComponentId — 目标ID(关联) 引用集构建不是一次性任务,而是随SNOMED CT版本升级和临床需求变化持续迭代的工程过程

在流程执行中,有几个工程细节值得特别注意。第一,概念筛选阶段应保留筛选表达式和中间结果,以便在SNOMED CT新版本发布后重新执行并对比差异。第二,成员编辑阶段应建立变更日志,记录每次新增、失效和更新的原因、操作人和时间。第三,验证发布阶段除了临床复核,还应做技术校验,包括:成员ID是否存在于当前版本、引用集ID是否唯一、属性值是否符合预期格式、是否存在重复成员记录。第四,版本维护阶段需要关注SNOMED CT国际版或国家版的更新说明,识别哪些被引用概念已失效或被替换,并据此更新本地引用集。

一个可参考的引用集成员记录示例

以下是一个属性值类型引用集的成员记录示例,用于表达“急诊胸痛分诊可编码概念”及其使用优先级。字段以制表符分隔,符合SNOMED CT引用集文件的一般格式:

refsetId	referencedComponentId	active	attributeValue	effectiveTime
900000000000100001	29857009	1	high	20250101
900000000000100001	23924002	1	high	20250101
900000000000100001	267036007	1	medium	20250101
900000000000100001	429559004	1	medium	20250101
900000000000100001	7180009	0	low	20250101

其中,29857009代表“胸痛”,23924002代表“胸部压迫感”,267036007代表“呼吸困难”,429559004代表“胸痛伴出汗”,7180009代表“非心源性胸痛”。最后一条active=0表示该成员已失效,可能因为临床指南不再将其作为急诊分诊的首选术语。这种记录方式既保留了历史,又清晰表达了当前有效成员及其优先级。

在本地扩展中直接修改国际版引用集成员状态是不允许的。本地化调整应通过新建本地引用集或使用关联类型引用集来表达,以保持与国际版发布内容的一致性。

总结来看,引用集与子集是SNOMED CT集成工程中连接“标准术语”与“临床落地”的桥梁。理解引用集的类型差异,掌握成员记录的结构与状态管理,建立从临床场景筛选到版本维护的闭环流程,才能让术语系统真正服务于临床记录、数据分析和互操作需求。在实际项目中,建议从一个小而明确的临床场景开始构建第一个引用集,跑通全流程后再逐步扩展,避免一开始就追求大而全的集合而陷入维护困境。