SNOMED CT — глобальная клиническая терминология, 350,000+ активных концептов с уникальными значениями и формальными logic-based определениями1. Это онтология в строгом смысле: единый корневой концепт SNOMED CT Concept, иерархия через IS-A relationships, дополнительные defining attributes (Finding site, Causative agent, Method…). Покрывает то, что LOINC не покрывает: диагнозы, симптомы, процедуры, анатомия, организмы, вещества, ситуации, qualifiers.

Пример иерархии: Diabetes mellitus type 2 IS-A Diabetes mellitus IS-A Disorder of carbohydrate metabolism IS-A Metabolic disorder IS-A … до корня.

Издаётся SNOMED International (member-funded organization, 50+ стран-членов). FHIR system URL: http://snomed.info/sct.

Структура

Три core artifacts:

  • Concept — уникальная клиническая идея с stable SCTID (6-18 digits, последняя — check digit по Verhoeff dihedral D52). Пример: 73211009 = Diabetes mellitus. ID никогда не reused, не recycles.
  • Description — текстовое представление концепта. У каждого концепта несколько:
    • FSN (Fully Specified Name) — каноническое имя с semantic tag в скобках: Diabetes mellitus (disorder). Уникальный, недвусмысленный.
    • Preferred Term (PT) — для UI: Diabetes mellitus.
    • Synonyms — альтернативные термины: Diabetes, DM.
  • Relationship — связи между концептами. Главная — IS-A (subsumption). Дополнительные: Finding site, Causative agent, Associated morphology, Method, и т.п. (defining attributes для compositional grammar).

Top-level hierarchies

Корневой концепт ветвится на несколько main branches (основные):

HierarchyЧто включает
Clinical findingсимптомы, расстройства, болезни
Procedureхирургические / диагностические / терапевтические процедуры
Body structureанатомия + морфологические аномалии
Substanceвещества, аллергены, drug substances
Pharmaceutical / biologic productлекарственные продукты
Organismбактерии, вирусы, грибы, паразиты
Observable entityто что можно наблюдать без конкретного значения
Specimenтипы образцов
Situation with explicit contextfamily history, planned procedure, etc
Eventтравмы, exposures, social events
Qualifier valueдополнительные модификаторы для post-coordination
Staging / scales / SNOMED CT model component / linkage / record artifact / physical object / physical force / environment / social contextEdge cases

Carry-over: где конкретно у нас в FHIR-output используется какая hierarchy + ValueSet — отдельная сессия по mapping audit. Сейчас примерно: Clinical finding → Condition.code, Procedure → Procedure.code, Substance/Organism → AllergyIntolerance.code, Body structure → Procedure.bodySite. RxNorm/ATC предпочтительнее для medications, LOINC system axis покрывает Specimen.

Pre-coordinated vs post-coordinated

  • Pre-coordinated — готовый concept с одним SCTID. Acute appendicitis = 85189001. Большинство case’ов.
  • Post-coordinated (compositional grammar) — комбинация концептов через operators для выражения того что нет в pre-coordinated виде. Пример: 271737000 |Anemia| : 363698007 |Finding site| = 113331007 |Liver|. Мощно, но сложно — большинство EHR используют только pre-coordinated.

У нас post-coordination не используется и в обозримом будущем не нужен.

Editions и licensing

  • International Edition — base, выпускается дважды в год (январь + июль).
  • National Extensions — добавляют local-specific concepts поверх International:
    • US Edition — выпускается март + сентябрь (после International), бесплатна через NLM UMLS для US-based использования
    • AU Edition (CSIRO) — Австралия; мы используем как validation source через Ontoserver — open-source FHIR terminology server, поддерживает $lookup / $expand / $validate-code операции (см. https://ontoserver.csiro.au/)
    • Также UK, NL, DK, SE, ES, и десяток других
  • Licensing model:
    • Бесплатно для residents/organizations в member countries — через national release center (US: NLM)
    • Commercial use non-member — paid Affiliate License Agreement с SNOMED International

Где живёт в FHIR

В любом CodeableConcept поле system="http://snomed.info/sct" означает SNOMED CT код:

{
  "system": "http://snomed.info/sct",
  "code": "73211009",
  "display": "Diabetes mellitus"
}

Опционально version URL для конкретной release: http://snomed.info/sct/900000000000207008/version/20260131 (International, Jan 2026).

В US Core SNOMED — обязательная codesystem для Condition.code, Procedure.code, AllergyIntolerance.code.

Где SNOMED появляется у нас

SNOMED-коды живут в наших FHIR-ресурсах в code полях:

  • Condition.code — диагнозы. См. fhir-condition для details про как мы их получаем и хранение.
  • Procedure.code — выполненные процедуры. См. fhir-procedure.
  • AllergyIntolerance.code — substance триггера реакции. См. fhir-allergy-intolerance.

Также SNOMED появляется в Resource.category defaults (когда наш code-builder заполняет category):

  • Procedure.category387713003 Surgical / 103693007 Diagnostic / 409063005 Counselling / 409073007 Education / 410606002 Social service
  • CarePlan.category734163000 Care plan + open для custom (например HL7 assess-plan)

Как именно мы получаем SNOMED-коды (pattern: LLM English term → terminology server $expand) — см. отдельную страницу clinical-code-resolution. Там же — failure modes (bare LLM coding на gpt-4o-mini = garbage), production path (V1 tx.fhir.org → V1+ Snowstorm Lite), audit practice через CSIRO Ontoserver $lookup.

Размер и обновления

  • 350,000+ активных concepts (International Edition, 2026)1
  • ~1.4M descriptions (с учётом synonyms и переводов)
  • ~1.6M relationships
  • Release cycle: International ×2/год (январь + июль); национальные extensions через 1-2 месяца
  • US Edition March 2026 release добавил 114 новых концептов US-specific
  • Полный RF2 download ~500MB (ZIP), снап-shot Active + Inactive concepts

Implications для нашего pipeline:

  • Static lookup tables — refresh policy (раз в полгода после International release).
  • Audit через $lookup перед merge изменений в snomed-coder.ts.
  • Inactive concepts — handle if encountered: $lookup вернёт inactive=true + replacedBy references.

Сравнение с ICD-10

SNOMED CTICD-10 / ICD-10-CM
Размер~357K concepts~14K codes (ICD-10), ~70K (ICD-10-CM)
ЦельClinical detail, EHRBilling, statistics
ИерархияPolyhierarchy (multiple parents)Strict tree
GranularityHigh (precise differentiation)Coarse (grouping для reimbursement)
GovernanceSNOMED InternationalWHO (ICD-10), CMS+NCHS (ICD-10-CM)
LicensingMember country / paid AffiliatePublic (WHO), free (CMS)
Где у насCondition.code (primary)Cross-coding в Condition.code.coding[] (optional)

В US Core рекомендуется dual-coding condition: SNOMED CT (clinical primary) + ICD-10-CM (billing secondary) в одном CodeableConcept.coding[]. Мы сегодня dual-coding не делаем.

Связано

  • fhir-condition — главный consumer SNOMED (диагнозы)
  • fhir-procedure — второй consumer (процедуры с SNOMED-based category enum)
  • fhir-allergy-intolerance — substance coding
  • loinc — параллельная codesystem; SNOMED ↔ LOINC complement (clinical concepts vs lab tests)
  • clinical-code-resolution — как именно мы получаем SNOMED-коды (LLM English term → $expand через terminology server); failure modes; audit practice
  • llm-numeric-codes-policy — policy «LLM не доверять числовым кодам»; rationale + variant C verification
  • agent-vs-workflow — связанный pattern: structured-LLM + deterministic resolver layer
  • us-core — обязывает SNOMED для Condition/Procedure/AllergyIntolerance в US-сертифицированных EHR
  • fhir-resource-categories — где SNOMED появляется в Resource.category defaults

Источники

Сноски

  1. Точное число активных concepts в каждом International release SNOMED International в release notes не публикует одной цифрой. Older sources (Wikipedia, NCBI articles) цитируют 357,000; на текущие 2026 releases это устаревший снимок. Безопасная нижняя граница — 350,000+ active concepts. Для exact числа нужен RF2 download и подсчёт active=1 rows в Concept snapshot. https://www.snomed.org/ + https://en.wikipedia.org/wiki/SNOMED_CT. Цит. по сессии ildar/29362bdd. 2

  2. SNOMED International, SNOMED CT Release File Specification §6.4.2 — SCTID check digit вычисляется через Verhoeff’s dihedral D5 check. Algorithm специально выбран для maximization детектирования common typographical errors (single errors, adjacent transpositions, 95%+ twin errors). Damm algorithm (2004) — отдельный алгоритм, SNOMED его НЕ использует. https://docs.snomed.org/snomed-ct-specifications/snomed-ct-release-file-specification/snomed-ct-identifiers/6.4-check-digit. Цит. по сессии ildar/29362bdd.