Dies ist der zweite Beitrag der EinfĂŒhrung in FHIR Terminology-Reihe. Wir gehen auf die Kernkonzepte ein, aus denen das FHIR Terminology Module besteht. Wir sehen konkrete Beispiele dafĂŒr, welche Probleme es lösen kann, und geben einen Ăberblick darĂŒber, wie die verschiedenen Teile zusammenpassen.
AnwendungsfÀlle
Wie wir bereits erwĂ€hnt haben, beobachten wir, dass FHIR-Einsteiger die Terminology-Lösungen hĂ€ufig zu wenig nutzen. Wir glauben, dass dies zum Teil auf mangelndes Bewusstsein dafĂŒr zurĂŒckzufĂŒhren ist, welche Probleme damit gelöst werden können. Manche Menschen verbinden Terminology mit Themen wie Standards, KonformitĂ€t, Compliance und Regulierung. Deshalb ist ein guter Ausgangspunkt, einige konkrete AnwendungsfĂ€lle zu zeigen, die sich mit einem Terminology-Server leicht umsetzen lassen. TatsĂ€chlich laufen alle diese Beispiele live gegen unsere Sandbox-Instanz.
Jeder Tab zeigt ein Live-Beispiel â von Suchfeldern und Dropdowns bis hin zu Mapping und Ăbersetzung. Ăffnen Sie den Bereich am unteren Rand des Felds, um die tatsĂ€chlichen Anfragen und Antworten einzusehen1.
Hintergrund
Wenn ein Arzt âHerzinfarkt" schreibt und ein anderer âMyokardinfarkt", meinen beide dasselbe. FĂŒr ein Softwaresystem oder jeden skalierbaren Arbeitsablauf sind dies jedoch nur zwei verschiedene Zeichenketten. Die FĂ€higkeit, Bedeutung zwischen Parteien auszutauschen, ist fĂŒr die InteroperabilitĂ€t von zentraler Bedeutung. DafĂŒr sind medizinische Terminologien da. Eines der frĂŒhesten Beispiele fĂŒr eine medizinische Terminologie ist die Internationale Klassifikation der Krankheiten (ICD), die 1893 zur Kodierung von Todesursachen eingefĂŒhrt wurde. Sie ist Ă€lter als Software und wird noch heute verwendet.
Wir arbeiten mit einer Reihe von Konstrukten, die unter die Definition von Terminologie fallen: Taxonomien, Ontologien, Nomenklaturen, Code-Mengen, Vokabulare, Klassifikationen. FĂŒr praktische Zwecke nennen wir sie Terminologien und definieren sie als eine Menge von Begriffen mit einem stabilen, maschinenlesbaren Bezeichner. Sie können unendlich sein, Synonyme, Eigenschaften, Beziehungen und Strukturen besitzen usw. Die wichtigste Eigenschaft, die wir benötigen, ist jedoch, dass jedes Element einen stabilen Bezeichner (Code) und eine textuelle Bezeichnung (Begriff/Anzeigename) hat.
In der ânormalen" Webentwicklung verwenden Entwickler stĂ€ndig Terminologien (auch wenn sie nicht so genannt werden). Sie werden hĂ€ufig als Enums oder als Tabellen von EintrĂ€gen mit einer CRUD-Administrationsansicht implementiert (es ist sehr ĂŒblich, dass Enums ihre eigenen Codes sind und dass Eintrags-Tabellen die Datenbank-ID als Bezeichner verwenden). Die obigen Beispiele hĂ€tten sehr gut mit diesen Mustern implementiert werden können.
FHIR bietet ein Terminology Module, das zur Lösung dieser und anderer Probleme entwickelt wurde. Ein interessanter Aspekt ist, dass dieselben Abstraktionen in der Lage sind, sowohl standardisierte, konforme und autoritative groĂe Ontologien als auch enum-Ă€hnliche, kurze, lokale Code-Listen auszudrĂŒcken.
Codierte Werte
Viele FHIR-Ressourcen haben Felder, deren mögliche Werte aus einer Liste (einer Terminologie) stammen. Ihre Werte sind Codes, die anderswo vergeben wurden und ein definiertes Konzept identifizieren. 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 beliebigen menschlichen Namen annehmen, wÀhrend gender nur einen von vier Werten annehmen kann: male, female, other, unknown. In diesem Fall ist female ein codierter Wert.
Ein codierter Wert besteht hauptsĂ€chlich aus einem Paar von â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 codierte Werte sind: Anstatt eine Zeichenkette zu finden, die zufĂ€llig wie ein LOINC-Code aussieht, werden codierte Werte zusammen mit ihrem Code-System-Bezeichner geliefert. Im obigen Fall des Geschlechts ist das System implizit (Administrative Gender, http://hl7.org/fhir/administrative-gender); warum, werden wir gleich erlĂ€utern.
FHIR definiert 3 Haupt-Datentypen zur Darstellung dieser Codes3: code, Coding und CodeableConcept.
code: Die Instanz reprÀsentiert nur den Code. Das System ist implizit.Coding: Der Datentyp enthÀlt einen Code und ein System, das angibt, woher die Definition des Codes stammt.CodeableConcept: Ein Typ, der ein Konzept durch Freitext und/oder ein oder mehrerecoding-Elemente reprÀsentiert.
Die meisten codierten Elemente in FHIR verwenden CodeableConcept, da es die gröĂte FlexibilitĂ€t bietet. Es erlaubt mehrere Codierungen und ermöglicht Freitext, um beispielsweise darzustellen, was ein Dateneingeber tatsĂ€chlich eingegeben hat, oder FĂ€lle, in denen kein Code verfĂŒgbar ist. Es erleichtert auch ĂbergĂ€nge, da man alte und neue Codes in derselben Struktur einschlieĂen kann (siehe Observation-Beispiel unten).
Der Coding-Datentyp wird verwendet, wenn die Absicht darin besteht, auf einen bestimmten Code zu verweisen, nicht ein Konzept allgemein auszudrĂŒcken. Die Verwendung von Coding ist selten, da es weniger flexibel als CodeableConcept ist und keinen Freitext oder Ăbersetzungen erlaubt.
Der code-Datentyp erscheint in der Regel in enum-Ă€hnlichen Szenarien. Typischerweise haben diese Elemente eine BindungsstĂ€rke von required, d. h.: Dieser Code muss aus dem angegebenen Value Set stammen, und es besteht keine Notwendigkeit, einen alternativen Code anzugeben. Solche Elemente sind hĂ€ufig in GeschĂ€ftslogik involviert, wie z. B. das Verzweigen anhand eines Werts, exakte Vergleiche usw. Zum Beispiel: ein Ressourcenstatus â Client-Code könnte retired-Ressourcen ignorieren oder nur auf active-Ressourcen reagieren.
Bindung
Bei den zuvor genannten Datentypen sind die Codes vom Typ string. Die Möglichkeit, den Wertebereich einzuschrÀnken, bieten Bindungen. Die Spezifikation bindet das Element an ein Value Set, d. h. es kann nur Werte aus dieser Liste annehmen.
Bindungen haben zwei Haupteigenschaften: valueSet und strength. valueSet definiert, 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 sein: male, female, other, unknown. Und maritalStatus ist an Marital Status Codes mit der StÀrke extensible gebunden, was bedeutet: Die Codes sollten aus diesem Value Set stammen, es sei denn, der erwartete Code ist dort nicht enthalten.
Beispiele fĂŒr codierte 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 werfen nun einen kurzen Blick auf die FHIR-Ressourcen, die zum Terminology Module gehören. In der Praxis erstellt man diese selten direkt. Sie werden in der Regel an anderer Stelle gepflegt und in einen Terminology-Server geladen4 (oder aus einem solchen exportiert).
Das Terminology Module definiert vier Haupt-Terminology-Ressourcen: CodeSystem, ValueSet, ConceptMap und NamingSystem. Jeder dieser Ressourcen werden wir einen eigenen Beitrag widmen. FĂŒr jetzt geben wir einen kurzen Ăberblick ĂŒber CodeSystem und ValueSet.
CodeSystem
CodeSystem ist wohl die wichtigste Ressource in FHIR Terminology. Sie wird verwendet, um ein Code-System, seine Attribute und Inhalte zu beschreiben. In seiner hÀufigsten Form enthÀlt es eine Liste von Konzepten, wobei jedes Konzept seinen Code, Bezeichnungen und Eigenschaften hat.
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 gibt eine Menge von Codes an, die aus einem oder mehreren Code-Systemen entnommen wurden.
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 Entwickler nicht immer klar ist. Es hilft nicht, dass im FHIR-Kern die meisten CodeSystem-Ressourcen ein Ă€quivalentes ValueSet haben, das alle ihre Codes enthĂ€lt. Zum Beispiel: 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. Ein Value Set kann daher eine Teilmenge eines Code-Systems enthalten oder sogar mehrere mischen.
RxNorm beispielsweise ist eine Medikamenten-Terminologie, die Konzepte fĂŒr Markennamen, Wirkstoffe, Darreichungsformen usw. enthĂ€lt. Wir können ein Value Set der Wirkstoffe in RxNorm definieren. Die enthaltenen Konzepte wĂ€ren weiterhin RxNorm-Konzepte, aber wir wĂŒrden nur Wirkstoffe einschlieĂen.
Ein weiterer hĂ€ufiger Anwendungsfall fĂŒr Value Sets ist das HinzufĂŒgen einer Null-Option. Angenommen, wir verwenden ISO 3166 (LĂ€ndercodes) in einem Formular. Es zeigt korrekt jedes Land und seine Codes an, aber es gibt keinen âUnbekannt"-LĂ€ndercode. Wir können ein Value Set definieren, das alle Codes aus ISO 3166 einschlieĂt sowie das Konzept UNK aus NullFlavor.
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
Der Hauptweg zur Interaktion mit dem Terminology Module und seinen Ressourcen sind Operationen. Die R6-Spezifikation definiert 8 terminology-spezifische Operationen. Im Verlauf dieser Reihe werden wir die meisten davon im Detail betrachten. In diesem Beitrag stellen wir $expand vor, die Operation, die die meisten unserer obigen Beispiele antreibt.
ValueSet/$expand
Gibt bei einem Value Set die Liste der darin definierten Codes zurĂŒck. Diese Operation eignet sich ideal zur BefĂŒllung von UI-Elementen: Dropdowns, Suchfelder, Code-Auswahlelemente usw. Neben dem Value Set können Sie einen Textsuchfilter, Paginierung, zurĂŒckzugebende Eigenschaften und Bezeichnungen, die zurĂŒckzugebende Sprache und weitere Parameter angeben.
Nehmen wir unser erstes Beispiel: ein Typeahead-Suchfeld fĂŒr klinische Befunde aus SNOMED. Angenommen, wir möchten nach âdiabetes mellitus" suchen und 10 Ergebnisse erhalten. So könnte eine Anfrage 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 aus SNOMED5 |
count | 10 | Anzahl der zu matchenden Konzepte |
filter | diabetes mellitus | Zu matchender Text |
Wir können auch ein Value Set direkt in der Anfrage angeben. Dies erlaubt uns, Abfragen auf ein Code-System ĂŒber Eigenschaften zu formulieren. Angenommen, wir möchten alle Markenmedikamente abrufen, die sowohl Koffein als auch Paracetamol 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 Markennamen |
tradename_of | CUI:161 | EnthÀlt Paracetamol |
tradename_of | CUI:1886 | EnthÀlt Koffein |
Weiter
In unserem nÀchsten Beitrag befassen wir uns mit Canonicals: Wie Terminology-Ressourcen identifiziert werden, welche Konventionen verwendet werden und wie Versionierung und Auflösung funktionieren.
- Vorheriger Beitrag: EinfĂŒhrung in FHIR Terminology
- NĂ€chster Beitrag: Canonicals â demnĂ€chst verfĂŒgbar
Footnotes
-
Die effizienteste Methode zur Implementierung einiger dieser Beispiele ist die Verwendung von Batching. Wir halten die Anfragen zur einfacheren Inspektion isoliert. â©
-
In einem zukĂŒnftigen Beitrag ĂŒber Canonicals werden wir genauer darauf eingehen, wie diese URLs funktionieren. â©
-
Die Spezifikation definiert tatsÀchlich 4 Datentypen (und 3 weitere). Da
CodeableReferencejedoch in Bezug aufCodeableConceptdefiniert ist und die weiteren Typen SonderfÀlle darstellen, konzentrieren wir uns auf die ersten drei. Siehe https://build.fhir.org/terminologies.html. ⩠-
In einem zukĂŒnftigen Beitrag werden wir uns ein Tutorial zur Einrichtung eines Terminology-Servers ansehen, um damit von Grund auf eine Healthcare-Anwendung zu betreiben. â©
-
Siehe https://terminology.hl7.org/en/SNOMEDCT.html fĂŒr die Verwendung von SNOMED mit FHIR Terminology. Wir werden SNOMED CT einem eigenen zukĂŒnftigen Beitrag widmen. â©





