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 mehrerecoding-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.

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'
| Parameter | Wert | ErlÀuterung |
|---|---|---|
url | http://snomed.info/sct?fhir_vs=isa/404684003 | Implizite URL fĂŒr klinische Befundskonzepte in SNOMED5 |
count | 10 | Anzahl der zurĂŒckzugebenden Konzepte |
filter | diabetes mellitus | Zu 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" }
]
}
]
}
}
}
]
}'
| Filter | Wert | ErlÀuterung |
|---|---|---|
TTY | BN | Nur Handelsnamen |
tradename_of | CUI:161 | EnthÀlt Acetaminophen |
tradename_of | CUI:1886 | EnthÀ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?
- ZurĂŒck: EinfĂŒhrung in FHIR Terminology
- Weiter: Canonicals â demnĂ€chst verfĂŒgbar
Footnotes
-
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. â©
-
Wie diese URLs funktionieren, vertiefen wir in einem kĂŒnftigen Beitrag ĂŒber Canonicals. â©
-
Die Spezifikation definiert tatsÀchlich 4 Datentypen (sowie 3 weitere).
CodeableReferenceist jedoch in Bezug aufCodeableConceptdefiniert, und die weiteren sind SonderfÀlle. Deshalb konzentrieren wir uns auf die ersten drei. Siehe https://build.fhir.org/terminologies.html. ⩠-
In einem kĂŒnftigen Beitrag werden wir ein Tutorial zur Einrichtung eines Terminology-Servers fĂŒr eine Healthcare-Applikation von Grund auf vorstellen. â©
-
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. â©





