|
13 Min. Lesezeit
|

EinfĂŒhrung in FHIR Terminology: Die Grundlagen

Diesen Artikel zusammenfassen mit:
ChatGPTPerplexityClaudeGrok

Dies ist der zweite Beitrag der EinfĂŒhrungsreihe zu FHIR Terminology. Wir behandeln die Kernkonzepte des FHIR Terminology-Moduls, zeigen konkrete Beispiele der lösbaren Probleme und geben einen Überblick darĂŒber, wie die einzelnen Bestandteile zusammenwirken.

AnwendungsfÀlle

Wie bereits erwĂ€hnt, beobachten wir, dass FHIR-Einsteiger die Terminology-Lösungen oft zu wenig nutzen. Wir glauben, dass dies zum Teil auf mangelndes Bewusstsein fĂŒr die lösbaren Probleme zurĂŒckzufĂŒhren ist – manche Personen verbinden Terminology mit Themen wie Standards, KonformitĂ€t, Compliance und Regulierung. Daher beginnen wir am besten mit einigen konkreten AnwendungsfĂ€llen, die sich mithilfe eines Terminology-Servers einfach umsetzen lassen. Alle folgenden Beispiele laufen live gegen unsere Sandbox-Instanz.

Jede Registerkarte zeigt ein Live-Beispiel – von Suchfeldern und Dropdown-MenĂŒs bis hin zu Mapping und Übersetzung. Öffnen Sie die Schublade am unteren Rand des Feldes, um die tatsĂ€chlichen Anfragen und Antworten einzusehen1.

Hintergrund

Wenn eine Ärztin „Herzinfarkt" schreibt und ein anderer Arzt „Myokardinfarkt", meinen beide dasselbe. FĂŒr ein Softwaresystem oder jeden Arbeitsablauf in grĂ¶ĂŸerem Maßstab sind dies jedoch lediglich zwei verschiedene Zeichenketten. Die FĂ€higkeit, Bedeutung zwischen verschiedenen Parteien auszutauschen, ist fĂŒr die InteroperabilitĂ€t unerlĂ€sslich. Genau dafĂŒr sind medizinische Terminologien da. Eines der frĂŒhesten Beispiele ist die Internationale Klassifikation der Krankheiten (ICD), die 1893 zur Kodierung von Todesursachen eingefĂŒhrt wurde. Sie entstand vor der Softwareentwicklung und wird bis heute verwendet.

Wir arbeiten mit einer Reihe von Konstrukten, die unter die Definition von Terminologie fallen: Taxonomien, Ontologien, Nomenklaturen, Code-Sets, Vokabulare, Klassifikationen. Der Einfachheit halber nennen wir sie Terminologien und definieren sie als eine Menge von Begriffen mit einem stabilen, maschinenlesbaren Bezeichner. Sie können unendlich groß sein, Synonyme, Eigenschaften, Beziehungen und Strukturen aufweisen. Die entscheidende Eigenschaft ist jedoch, dass jedes Element einen stabilen Bezeichner (Code) und eine textuelle Bezeichnung (Begriff/Display) besitzt.

In der „normalen" Webentwicklung verwenden Entwickler stĂ€ndig Terminologien – auch wenn sie nicht so genannt werden. Sie werden hĂ€ufig als Enumerationen oder als Tabellen mit EintrĂ€gen und einer CRUD-Adminansicht umgesetzt (wobei es ĂŒblich ist, dass die Enumerationswerte gleichzeitig die Codes sind und die Eintrags-Tabellen die Datenbank-ID als Bezeichner verwenden). Die obigen Beispiele hĂ€tten durchaus mit diesen Mustern umgesetzt werden können.

FHIR stellt ein Terminology-Modul bereit, das dafĂŒr ausgelegt ist, diese und weitere Probleme zu lösen. Ein interessanter Aspekt ist, dass dieselben Abstraktionen sowohl standardisierte, konforme, autoritative und umfangreiche Ontologien als auch enumerationsartige, kurze, lokale Code-Listen abbilden können.

Kodierte Werte

Viele FHIR-Ressourcen besitzen Felder, deren Wertebereich einer Liste (einer Terminologie) entnommen ist. Ihre Werte sind Codes, die andernorts vergeben wurden und ein definiertes Konzept bezeichnen. Zum Beispiel:

resourceType: Patient
name:
  - given: [Jane]
    family: Doe
gender: female

Beachten Sie, dass name in diesem Fall eine ungebundene Eigenschaft ist: Sie kann jeden menschlichen Namen annehmen, wÀhrend gender nur einen von vier Werten annehmen kann: male, female, other, unknown. In diesem Fall ist female ein kodierter Wert.

Ein kodierter Wert besteht im Wesentlichen aus einem Paar aus „system" und „code", wobei system eine URL2 ist, die das Code-System (die Terminologie) identifiziert, das die Codes definiert. Diese Entscheidung hat erhebliche Auswirkungen darauf, wie auffindbar kodierte Werte sind: Anstatt eine Zeichenkette vorzufinden, die zufĂ€llig wie ein LOINC-Code aussieht, sind kodierte Werte stets mit ihrem Code-System-Bezeichner versehen. Im obigen Gender-Beispiel ist das System implizit (Administrative Gender, http://hl7.org/fhir/administrative-gender); warum das so ist, klĂ€ren wir in KĂŒrze.

FHIR definiert 3 wesentliche Datentypen zur Darstellung dieser Codes3: code, Coding und CodeableConcept.

  • code: Die Instanz reprĂ€sentiert ausschließlich den Code. Das System ist implizit.
  • Coding: Der Datentyp enthĂ€lt einen Code sowie ein System, das angibt, woher die Definition des Codes stammt.
  • CodeableConcept: Ein Typ, der ein Konzept durch Freitext und/oder ein oder mehrere coding-Elemente darstellt.

Die meisten kodierten Elemente in FHIR verwenden CodeableConcept, da dieser Typ die grĂ¶ĂŸte FlexibilitĂ€t bietet. Er erlaubt mehrere Codierungen und ermöglicht Freitext, um beispielsweise das tatsĂ€chlich Eingegebene oder FĂ€lle ohne verfĂŒgbaren Code zu ĂŒbermitteln. Er erleichtert auch Übergangsphasen, da alte und neue Codes in derselben Struktur enthalten sein können (siehe Observation-Beispiel unten).

Der Datentyp Coding wird verwendet, wenn die Absicht darin besteht, auf einen spezifischen Code zu verweisen und kein Konzept allgemein auszudrĂŒcken. Der Einsatz von Coding ist selten, da er weniger flexibel als CodeableConcept ist und weder Freitext noch Übersetzungen erlaubt.

Der Datentyp code taucht typischerweise in enumerationsartigen Szenarien auf. Derartige Elemente haben in der Regel eine BindungsstĂ€rke von required, das heißt: Der Code muss aus dem angegebenen Value Set stammen, und es besteht keine Notwendigkeit, einen alternativen Code anzugeben. In der Regel sind solche Elemente an GeschĂ€ftslogik beteiligt, wie etwa das Verzweigen anhand eines Werts oder exakte Vergleiche. Beispielsweise könnte Client-Code retired-Ressourcen ignorieren oder nur auf active-Ressourcen reagieren.

Bindung

Bei den vorherigen Datentypen sind die Codes vom Typ string. Die EinschrĂ€nkung der möglichen Werte erfolgt ĂŒber Bindungen. Die Spezifikation bindet das Element an ein Value Set, das heißt, es darf nur Werte aus dieser Liste annehmen.

Bindungen haben zwei Haupteigenschaften: valueSet und strength. valueSet legt fest, welche Codes fĂŒr dieses Element gĂŒltig sind. strength gibt an, wie die Bindung zu verstehen ist: required, extensible, preferred, example.

Binding example
Patient spec fragment. Notice the highlighted elements, their datatypes, binding value sets and strengths

Im obigen Beispiel ist Patient.gender an das Value Set Administrative Gender mit der StÀrke required gebunden; daher kann gender nur die Werte male, female, other oder unknown annehmen. maritalStatus ist an Marital Status Codes mit der StÀrke extensible gebunden, das bedeutet: Die Codes sollten aus diesem Value Set stammen, es sei denn, der benötigte Code ist dort nicht vorhanden.

Beispiele fĂŒr kodierte Werte

resourceType: Patient
name:
  - given: [Jane]
    family: Doe
gender: female # code / AdministrativeGender (implicit)
maritalStatus: # CodeableConcept
  text: Married
  coding:
    - system: http://terminology.hl7.org/CodeSystem/v3-MaritalStatus
      code: M
      display: Married
resourceType: Location
name : South Wing Neuro OR 1
status: suspended # code / LocationStatus (implicit)
operationalStatus: # Coding
  system: http://terminology.hl7.org/CodeSystem/v2-0116
  code: H
  display: Housekeeping
type: # CodeableConcept
  coding:
    - system: http://terminology.hl7.org/CodeSystem/v3-RoleCode
      code: RNEU
      display: Neuroradiology unit
form: # CodeableConcept without codings
  text: Room
resourceType: Observation
status: final # code / ObservationStatus (implicit)
code: # CodeableConcept with local and standard codings
 coding:
   - system: http://acmelabs.org
     code: 104177
     display: "Blood culture"
   - system: http://loinc.org
     code: 600-7
     display: Bacteria identified in Blood by Culture
valueCodeableConcept: # CodeableConcept
  coding:
    - system: http://snomed.info/sct
      code: 3092008
      display: Staphylococcus aureus
interpretation:
  text: Positive
  coding:
    - system: http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation
      code: POS

Ressourcen

Wir betrachten nun kurz die FHIR-Ressourcen des Terminology-Moduls. In der Praxis erstellt man diese selten direkt. Sie werden in der Regel andernorts gepflegt und in einen Terminology-Server geladen4 (oder aus diesem exportiert).

Das Terminology-Modul definiert vier wesentliche Terminology-Ressourcen: CodeSystem, ValueSet, ConceptMap und NamingSystem. Jeder dieser Ressourcen widmen wir einen eigenen Beitrag. Hier geben wir zunĂ€chst einen kurzen Überblick ĂŒber CodeSystem und ValueSet.

CodeSystem

CodeSystem ist wohl die wichtigste Ressource in FHIR Terminology. Sie dient dazu, ein Code-System, seine Attribute und seinen Inhalt zu beschreiben. In der hÀufigsten Form enthÀlt sie eine Liste von Konzepten, wobei jedes Konzept seinen Code, Bezeichnungen und Eigenschaften umfasst.

Beispiele

resourceType: CodeSystem
url: http://hl7.org/fhir/administrative-gender
version: 5.0.0
content: complete
status: active
concept:
  - code: male
    display: Male
  - code: female
    display: Female
  - code: other
    display: Other
  - code: unknown
    display: Unknown
resourceType: CodeSystem
content: supplement
supplements: http://hl7.org/fhir/administrative-gender
concept:
- code: male
  designation:
  - language: es
    value: Masculino
- code: female
  designation:
  - language: es
    value: Femenino
- code: other
  designation:
  - language: es
    value: Otro
- code: unknown
  designation:
  - language: es
    value: Desconocido
resourceType: CodeSystem
url: http://www.nlm.nih.gov/research/umls/rxnorm
version: '03022026'
publisher: National Library of Medicine
content: complete
filter:
- code: concept
  operator: [is-a, generalizes, descendent-of]
  value: comma-separated list of concept codes for direct equality testing
- code: NDC
  operator: [=,in, exists]
  value: NDC code
property:
- {code: TTY, type: string}
- {code: NDC, type: string}
- {code: RXN_STRENGTH, type: string}
- {code: dose_form_of, type: code}
- {code: has_ingredient, type: code}
- {code: has_tradename, type: code}
# ...
concept:
- code: '5640'
  display: ibuprofen
  property:
  - code: TTY
    valueString: IN
  - code: has_tradename
    valueCode: '1100067'
  - code: ingredient_of
    valueCode: '1152223'
  - code: part_of
    valueCode: '821036'
  # ...
# ...
resourceType: CodeSystem
url: http://hl7.org/fhir/sid/icd-10-cm
version: '2025'
content: complete
property:
- description: Indicator [...] transactions ("billable code")
  type: integer
  code: valid
filter:
- description: Identify valid billable codes.
  value: 0 = "header" – not valid [...]
  code: valid
  operator: ["="]
valueSet: http://hl7.org/fhir/sid/icd-10-cm/vs
concept:
- code: Chapter-1
  display: Certain infectious and parasitic diseases (A00-B99)
  concept:
  - code: Section-A00-A09
    display: Intestinal infectious diseases (A00-A09)
    concept:
    - code: A00
      display: Cholera
      concept:
      - code: A00.0
        display: Cholera due to Vibrio cholerae 01, biovar cholerae
        property:
        - code: valid
          valueInteger: 1
# ...

ValueSet

Eine ValueSet-Ressource legt eine Menge von Codes fest, die aus einem oder mehreren Code-Systemen entnommen werden.

Unserer Erfahrung nach ist dies eine der am hĂ€ufigsten missverstandenen Ressourcen in FHIR Terminology. Ein möglicher Grund ist, dass der Unterschied zwischen Code-Systemen und Value Sets fĂŒr Implementierende nicht immer klar ist. Erschwerend kommt hinzu, dass im FHIR-Kern die meisten CodeSystem-Ressourcen ein Ă€quivalentes ValueSet besitzen, das alle ihre Codes einschließt. Beispielsweise: http://hl7.org/fhir/administrative-gender und http://hl7.org/fhir/ValueSet/administrative-gender.

Der wesentliche Unterschied besteht darin, dass Code-Systeme die Definition der Konzepte und deren Herkunft enthalten, wÀhrend Value Sets Codes aus den Code-Systemen auswÀhlen. Daher kann ein Value Set eine Teilmenge eines Code-Systems umfassen oder sogar aus mehreren Systemen zusammengestellt sein.

RxNorm beispielsweise ist eine Medikamenten-Terminologie, die Konzepte fĂŒr Handelsnamen, Wirkstoffe, Darreichungsformen und weiteres enthĂ€lt. Wir können ein Value Set der Wirkstoffe in RxNorm definieren. Die enthaltenen Konzepte wĂ€ren weiterhin RxNorm-Konzepte, jedoch wĂŒrden wir nur Wirkstoffe einschließen.

Ein weiterer hĂ€ufiger Anwendungsfall fĂŒr Value Sets ist das HinzufĂŒgen einer „Keine Angabe"-Option. Angenommen, wir verwenden ISO 3166 (LĂ€ndercodes) in einem Formular. Die Liste zeigt korrekt alle LĂ€nder mit ihren Codes an, enthĂ€lt jedoch keinen Code fĂŒr „Unbekannt". Wir können ein Value Set definieren, das alle Codes aus ISO 3166 sowie das Konzept UNK aus NullFlavor einschließt.

Beispiele

resourceType: ValueSet
url: http://example.org/rxnorm-ingredients
title: RxNorm Ingredients
compose:
  include:
  - system: http://www.nlm.nih.gov/research/umls/rxnorm
    filter:
    - property: TTY
      op: =
      value: IN
resourceType: ValueSet
url: http://hl7.org/fhir/ValueSet/example
title: LOINC Codes for Cholesterol in Serum/Plasma
compose:
  include:
  - system: http://loinc.org
    concept:
    - code: 14647-2
      display: Cholesterol [Moles/Volume]
    - code: 2093-3
      display: Cholesterol [Mass/Volume]
    - code: 35200-5
      display: Cholesterol [Mass Or Moles/Volume]
    - code: 9342-7
      display: Cholesterol [Percentile]
resourceType: ValueSet
url: http://hl7.org/fhir/ValueSet/administrative-gender
status: active
compose:
  include:
  - system: http://hl7.org/fhir/administrative-gender
resourceType: ValueSet
url: http://hl7.org/fhir/ValueSet/yesnodontknow
name: YesNoDontKnow
compose:
  include:
  - valueSet: ["http://terminology.hl7.org/ValueSet/v2-0136"]
  - system: http://terminology.hl7.org/CodeSystem/data-absent-reason
    concept:
    - code: asked-unknown
      display: Don't know

Operationen

Die wichtigste Art, mit dem Terminology-Modul und seinen Ressourcen zu interagieren, sind Operationen. Die R6-Spezifikation definiert 8 terminologiespezifische Operationen. Im Verlauf dieser Reihe werden wir die meisten davon im Detail betrachten. In diesem Beitrag stellen wir $expand vor, die Operation, die den Großteil unserer obigen Beispiele antreibt.

ValueSet/$expand

Gibt fĂŒr ein Value Set die Liste der darin definierten Codes zurĂŒck. Diese Operation eignet sich ideal fĂŒr die BefĂŒllung von UI-Elementen: Dropdown-MenĂŒs, Suchfelder, Code-Auswahlen und dergleichen. Neben dem Value Set können weitere Parameter angegeben werden: ein Textsuchfilter, Paginierung, welche Eigenschaften und Bezeichnungen zurĂŒckgegeben werden sollen, in welcher Sprache die Antwort erfolgen soll und mehr.

Nehmen wir unser erstes Beispiel: ein Typeahead-Suchfeld fĂŒr klinische Befunde in SNOMED. Angenommen, wir möchten nach „diabetes mellitus" suchen und 10 Ergebnisse erhalten. Eine Anfrage könnte folgendermaßen aussehen:

GET https://tx-sandbox.health-samurai.io/fhir/ValueSet/$expand
[Query]
url: http://snomed.info/sct?fhir_vs=isa/404684003
count: 10
filter: diabetes mellitus
curl -G 'https://tx-sandbox.health-samurai.io/fhir/ValueSet/$expand' \
  --data-urlencode 'url=http://snomed.info/sct?fhir_vs=isa/404684003' \
  --data-urlencode 'count=10' \
  --data-urlencode 'filter=diabetes mellitus'
ParameterWertErlÀuterung
urlhttp://snomed.info/sct?fhir_vs=isa/404684003Implizite URL fĂŒr klinische Befundskonzepte in SNOMED5
count10Anzahl der zurĂŒckzugebenden Konzepte
filterdiabetes mellitusZu suchender Text

Es ist auch möglich, ein Value Set direkt in der Anfrage mitzugeben. Dies erlaubt es, Abfragen an ein Code-System ĂŒber dessen Eigenschaften zu formulieren. Nehmen wir zum Beispiel an, wir möchten alle MarkenprĂ€parate ermitteln, die sowohl Koffein als auch Acetaminophen als Wirkstoffe enthalten.

POST https://tx-sandbox.health-samurai.io/fhir/ValueSet/$expand
Content-Type: application/json
{
  "resourceType": "Parameters",
  "parameter": [
    {
      "name": "valueSet",
      "resource": {
        "resourceType": "ValueSet",
        "status": "active",
        "compose": {
          "include": [
            {
              "system": "http://www.nlm.nih.gov/research/umls/rxnorm",
              "filter": [
                { "property": "TTY", "op": "=", "value": "BN" },
                { "property": "tradename_of", "op": "=", "value": "CUI:161" },
                { "property": "tradename_of", "op": "=", "value": "CUI:1886" }
              ]
            }
          ]
        }
      }
    }
  ]
}
curl -X POST 'https://tx-sandbox.health-samurai.io/fhir/ValueSet/$expand' \
  -H 'Content-Type: application/json' \
  -d '{
    "resourceType": "Parameters",
    "parameter": [
      {
        "name": "valueSet",
        "resource": {
          "resourceType": "ValueSet",
          "status": "active",
          "compose": {
            "include": [
              {
                "system": "http://www.nlm.nih.gov/research/umls/rxnorm",
                "filter": [
                  { "property": "TTY", "op": "=", "value": "BN" },
                  { "property": "tradename_of", "op": "=", "value": "CUI:161" },
                  { "property": "tradename_of", "op": "=", "value": "CUI:1886" }
                ]
              }
            ]
          }
        }
      }
    ]
  }'
FilterWertErlÀuterung
TTYBNNur Handelsnamen
tradename_ofCUI:161EnthÀlt Acetaminophen
tradename_ofCUI:1886EnthÀlt Koffein

Ausblick

Im nÀchsten Beitrag befassen wir uns mit Kanonischen URLs (Canonicals): Wie werden Terminology-Ressourcen identifiziert, welche Konventionen gelten, und wie funktionieren Versionierung und Auflösung?

Footnotes

  1. Die effizienteste Methode zur Umsetzung einiger dieser Beispiele ist die Verwendung von Batching. Wir halten die Anfragen hier jedoch isoliert, um die Inspektion zu erleichtern. ↩

  2. Wie diese URLs funktionieren, vertiefen wir in einem kĂŒnftigen Beitrag ĂŒber Canonicals. ↩

  3. Die Spezifikation definiert tatsĂ€chlich 4 Datentypen (sowie 3 weitere). CodeableReference ist jedoch in Bezug auf CodeableConcept definiert, und die weiteren sind SonderfĂ€lle. Deshalb konzentrieren wir uns auf die ersten drei. Siehe https://build.fhir.org/terminologies.html. ↩

  4. In einem kĂŒnftigen Beitrag werden wir ein Tutorial zur Einrichtung eines Terminology-Servers fĂŒr eine Healthcare-Applikation von Grund auf vorstellen. ↩

  5. Siehe https://terminology.hl7.org/en/SNOMEDCT.html fĂŒr die Verwendung von SNOMED mit FHIR Terminology. Einem kĂŒnftigen Beitrag werden wir SNOMED CT widmen. ↩

Diesen Artikel teilen
Comments
Comments
Sign in
Loading comments...
Subscribe to our blog

Get the latest articles on FHIR, interoperability, and healthcare IT.