3. SNOMED CT发布文件与格式

SNOMED CT的发布文件采用RF2(Release Format 2)规范,这是当前所有官方发布和扩展发布的统一格式。理解RF2的结构,是术语集成工程中最基础也最关键的一步——无论是加载数据、比对版本、还是构建增量更新管道,都直接依赖对RF2文件组织方式的准确掌握。

RF2文件命名与目录组织

RF2发布包通常以压缩包形式提供,解压后按“发布类型/内容类型”分层组织目录。文件名遵循固定模式:

sct2_Concept_Snapshot_INT_20240101.txt
sct2_Description_Full-en_INT_20240101.txt
sct2_Relationship_Snapshot_INT_20240101.txt
sct2_StatedRelationship_Full_INT_20240101.txt
sct2_Identifier_Full_INT_20240101.txt
sct2_TextDefinition_Snapshot-en_INT_20240101.txt

命名中各段含义为:sct2表示SNOMED CT第二版发布格式;Concept、Description、Relationship等表示内容类型;Snapshot或Full表示视图类型;INT表示国际版,扩展版则使用命名空间标识(如US1000124、CN1000192);末尾日期为发布版本日期。扩展包中还会出现_Extension、_Delta等标识。

核心表与扩展表

RF2的核心表包括概念表(Concept)、描述表(Description)、关系表(Relationship)、标识符表(Identifier)和文本定义表(TextDefinition)。其中概念表定义每个SCTID及其是否有效;描述表承载术语的同义词、FSN等语言表达;关系表记录IS-A层级关系及属性关系;标识符表用于跨版本追踪SCTID的分配历史。

扩展表在结构上与核心表完全一致,区别在于其moduleId字段指向扩展模块,且SCTID的命名空间属于该扩展。例如中国扩展的概念SCTID以CN命名空间标识开头。集成时,扩展表与国际核心表通过SCTID和moduleId进行关联,不能简单合并去重,而应依据模块依赖关系决定优先级。

快照视图与全量视图

同一内容类型通常提供两种视图:Snapshot(快照)和Full(全量)。快照视图只包含当前版本中有效的组件状态,即每个SCTID在该版本下的最新有效行;全量视图则包含该组件自首次发布以来的所有历史行,包括已失效、已修改的记录。

两者的关键区别体现在字段effectiveTime和active上。快照中每个SCTID最多出现一次,且active=1;全量中同一SCTID可有多行,按effectiveTime排列,active可能为0或1。集成加载时,若只需当前术语集,用快照即可;若需审计变更历史或构建版本差异,则必须使用全量视图。

RF2 三种视图与增量更新机制 Snapshot 快照视图 每个SCTID仅保留最新有效行 id | effTime | active 138875005 | 20240101 | 1 404684003 | 20240101 | 1 73211009 | 20240101 | 1 ✓ 适合:术语集加载、查询 ✓ 体积小,加载快 ✗ 不含历史变更记录 Full 全量视图 同一SCTID保留所有历史行 id | effTime | active 73211009 | 20230701 | 1 73211009 | 20240101 | 1 73211009 | 20240101 | 0 ✓ 适合:审计、版本差异分析 ✓ 可追溯组件生命周期 ✗ 体积大,需按时间过滤 Delta 增量视图 仅包含本次发布新增/修改行 id | effTime | active 73211009 | 20240101 | 1 999999999 | 20240101 | 1 ✓ 适合:增量更新管道 ✓ 体积最小,传输高效 ✗ 需配合基线版本使用 增量更新机制:基线 + Delta 累积 基线版本 20230701 Full + Delta 1 20240101 + Delta 2 20240701 = 目标快照 20240701 Snapshot 按 effectiveTime 排序,同一SCTID取最新行;active=0 表示该行已失效

增量更新机制

增量更新是RF2设计中最具工程价值的部分。每次发布除了提供完整快照和全量文件外,还会提供Delta文件,其中只包含自上一版本以来发生变化的行。Delta文件同样按内容类型分文件,命名中带有_Delta_标识。

增量更新的核心逻辑是:以某个基线版本(如20230701的Full文件)为起点,按时间顺序依次应用后续每个版本的Delta文件,最终得到目标版本的完整状态。应用规则为:对每个SCTID,若Delta中存在该SCTID的新行,则用新行替换旧行;若Delta中某行active=0,则将该SCTID标记为失效。由于Delta只包含变化行,累积多个Delta后即可重建任意中间版本的状态。

工程提示:实际集成中,若只需最新版本,直接使用Snapshot文件即可,无需累积Delta。只有在需要版本回溯、审计追踪或增量同步到远端系统时,才需要维护基线+Delta的更新管道。Delta文件必须按effectiveTime严格排序应用,顺序错误会导致状态不一致。

字段结构与加载要点

RF2文件为制表符分隔的文本文件,首行为列名。核心字段包括:id(SCTID)、effectiveTime(格式YYYYMMDD)、active(1/0)、moduleId(模块SCTID)、definitionStatusId(概念定义状态)。描述表额外包含conceptId、languageCode、typeId、term、caseSignificanceId;关系表额外包含sourceId、destinationId、relationshipGroup、typeId、characteristicTypeId、modifierId。

加载时需注意:所有SCTID为64位整数,不可用32位整型存储;effectiveTime需转为日期类型以便排序;active字段在快照中恒为1,但在全量和Delta中可能为0,解析时不可忽略。扩展表加载时,应通过moduleId区分国际核心内容与扩展内容,避免模块间SCTID冲突。

常见错误:将Snapshot与Full文件混用导致重复行;忽略Delta中active=0的失效行导致已删除概念仍被检索;未按effectiveTime排序应用Delta导致版本状态错乱。这些都是在术语集成工程中高频出现的加载缺陷。

版本管理与集成策略

在集成工程中,建议维护一张版本元数据表,记录每次发布的版本日期、基线版本、Delta文件列表及其校验值。加载流程通常为:首次全量加载Snapshot建立基线;后续每次发布加载对应Delta,按effectiveTime排序后逐行应用;定期用最新Snapshot做全量校验,确保增量累积结果与官方快照一致。这样既保证了更新效率,又保留了可审计的版本轨迹。

对于多扩展并存的场景,还需处理模块依赖:国际核心模块是基础,国家扩展模块依赖核心,机构扩展模块依赖国家扩展。加载顺序应遵循依赖方向,先核心后扩展,且扩展的Delta只影响其自身模块范围内的组件,不应覆盖核心模块中同SCTID的行。