Krótka odpowiedź: podstawowe zasoby FHIR są celowo elastyczne: prawie wszystko jest opcjonalne, a większość kodów to tylko przykłady, dzięki czemu jeden standard pasuje do każdego kraju. Profil to StructureDefinition, który doprecyzowuje zasób dla jednego zastosowania: w tym kontekście Patient musi mieć identyfikator tego typu, Observation.code musi być kodem LOINC z tej listy, ten element musi być obsługiwany, tamten nie może się pojawić. Rozszerzenie dodaje element, którego brakuje w podstawowym zasobie, identyfikowany przez adres URL i definiowany przez własny StructureDefinition. Przewodniki implementacyjne (US Core, IPS, krajowe przewodniki) to zbiory profili, rozszerzeń, zestawów wartości i przykładów. Zasób wskazuje, które profile deklaruje w meta.profile, a walidator sprawdza go.
Co profil może zmienić
Profil FHIR może zmienić zasób jedynie poprzez jego zawężenie: ustalenie kardynalności, oznaczenie elementów jako wymagane do obsługi, ustalenie wartości lub wzorców, powiązanie elementów z zestawami wartości z określoną siłą, podział list na nazwane części, ograniczenie typów wyboru, dodanie niezmiennych FHIRPath i ograniczenie celów odniesienia. Profil nie może dodawać elementów, zmieniać nazw ani rozluźniać podstawowej specyfikacji.
| Ograniczenie | Co robi | Przykład |
|---|---|---|
| Kardynalność | Sprawia, że opcjonalne elementy stają się wymagane lub je zabrania | Patient.identifier 1..*; Patient.photo 0..0 |
| Musi być obsługiwane | Odbiorcy muszą być w stanie przechowywać i wyświetlać element, jeśli zostanie wysłany | US Core oznacza birthDate jako „must-support” |
| Stała wartość lub wzorzec | Blokuje element na jedną wartość | Observation.category ustawione na vital-signs |
| Powiązanie | Wskazuje element na zestaw wartości z określonym poziomem siły | Observation.code powiązane z listą parametrów życiowych, wymagane |
| Krojenie (Slicing) | Dzieli listę na nazwane części z własnymi zasadami | Ciśnienie krwi: komponent podzielony na skurczowe i rozkurczowe |
| Ograniczenie typu | Ogranicza wybór | value[x] ograniczone do valueQuantity |
| Niezmiennik (Invariant) | Reguła FHIRPath, która musi być spełniona | „effective[x] musi być obecne” lub „value lub dataAbsentReason” |
| Cel referencji | Ogranicza, do czego może wskazywać referencja | subject tylko do Patient, i tylko do pacjentów zgodnych z tym profilem |
Profil może tylko zawężać. Nie może dodawać elementów (do tego służą rozszerzenia), zmieniać nazw ani rozluźniać podstawowych zasad.
Siła powiązania
FHIR definiuje cztery siły powiązania. required (wymagane): kod musi pochodzić z zestawu wartości. extensible (rozszerzalne): użyj zestawu wartości, jeśli koncepcja pasuje; w przeciwnym razie dozwolony jest inny kod. preferred (preferowane): zalecane, ale nie egzekwowane. example (przykład): tylko ilustracyjne, co jest typowe dla większości podstawowych zasobów. Błędne odczytanie extensible jako required jest częstym źródłem fałszywych błędów walidacji.
Czytelny fragment profilu
Profil FHIR to StructureDefinition, którego lista różnicowa zawiera tylko ograniczenia różniące się od podstawowego zasobu, podczas gdy jego migawka zawiera każdy element. Czytelny fragment poniżej ogranicza Observation do pomiaru ciśnienia krwi w domu: kod jest ustalony na LOINC 85354-9, a komponent jest podzielony na dokładnie jedną część skurczową i jedną rozkurczową.
Różnica (differential) profilu wymienia tylko to, co zostało zmienione w stosunku do podstawy; migawka (snapshot) wymienia wszystko. Ta różnica mówi, że obserwacja ciśnienia krwi musi zawierać LOINC 85354-9 i dokładnie dwa komponenty:
{
"resourceType": "StructureDefinition",
"url": "https://example.org/fhir/StructureDefinition/bp-home",
"name": "HomeBloodPressure",
"status": "active",
"kind": "resource",
"abstract": false,
"type": "Observation",
"baseDefinition": "http://hl7.org/fhir/StructureDefinition/Observation",
"derivation": "constraint",
"differential": {"element": [
{"id": "Observation.code", "path": "Observation.code",
"patternCodeableConcept": {"coding": [{"system": "http://loinc.org", "code": "85354-9"}]}},
{"id": "Observation.component", "path": "Observation.component", "min": 2, "max": "2",
"slicing": {"discriminator": [{"type": "pattern", "path": "code"}], "rules": "closed"}},
{"id": "Observation.component:systolic", "path": "Observation.component", "sliceName": "systolic", "min": 1, "max": "1"},
{"id": "Observation.component:systolic.code", "path": "Observation.component.code",
"patternCodeableConcept": {"coding": [{"system": "http://loinc.org", "code": "8480-6"}]}},
{"id": "Observation.component:diastolic", "path": "Observation.component", "sliceName": "diastolic", "min": 1, "max": "1"},
{"id": "Observation.component:diastolic.code", "path": "Observation.component.code",
"patternCodeableConcept": {"coding": [{"system": "http://loinc.org", "code": "8462-4"}]}}
]}
}
Profile rzadko pisze się ręcznie; autorzy używają FHIR Shorthand (FSH) z SUSHI lub narzędzi takich jak Forge i Simplifier, a publikują za pomocą IG Publisher HL7. Przewodniki są dystrybuowane jako pakiety (hl7.fhir.us.core#6.1.0, hl7.fhir.uv.ips#1.1.0), które walidatory i serwery ładują.
Rozszerzenia
Rozszerzenie to element klucz-wartość umieszczony w extension (lub modifierExtension, gdy zmienia znaczenie zasobu i nie wolno go ignorować). Jego url to kanoniczny adres URL jego StructureDefinition; jego wartość to jedna z typowanych value[x] lub zagnieżdżone rozszerzenia. Miejsce urodzenia to rozszerzenie zdefiniowane przez HL7 na zasobie Patient:
{
"resourceType": "Patient",
"id": "example",
"extension": [{
"url": "http://hl7.org/fhir/StructureDefinition/patient-birthPlace",
"valueAddress": {"city": "Lyon", "country": "FR"}
}],
"name": [{"family": "Doe", "given": ["Jane"]}]
}
Zasady dobrej praktyki: przed zdefiniowaniem własnego rozszerzenia poszukaj istniejącego (rejestr HL7 i krajowe przewodniki); nadaj mu adres URL w domenie, którą kontrolujesz; zdefiniuj je w StructureDefinition, aby inni mogli je walidować; nigdy nie używaj rozszerzenia do czegoś, co już pokrywa podstawowy element.
meta.profile i walidacja
meta.profile to lista kanonicznych adresów URL, do których zasób FHIR deklaruje zgodność, a deklaracja nie jest dowodem. Walidator sprawdza zasób w odniesieniu do podstawowej specyfikacji i każdego zadeklarowanego profilu, lub w odniesieniu do profilu, który nazwiesz. Walidator referencyjny HL7 działa lokalnie z pakietami, a serwery FHIR udostępniają operację $validate, która akceptuje parametr profilu.
meta.profile wymienia kanoniczne adresy URL, do których zasób deklaruje zgodność. Deklaracja nie jest dowodem: walidator sprawdza zasób względem podstawowej specyfikacji i względem każdego zadeklarowanego profilu (lub względem profilu, o który poprosisz). Walidator referencyjny HL7 (validator_cli.jar) działa lokalnie i ładuje pakiety; serwery oferują POST /Observation/$validate?profile=…; IG Publisher waliduje wszystkie przykłady w przewodniku. Zasób może być zgodny z kilkoma profilami jednocześnie (krajowy profil Patient i IPS Patient), o ile się nie wykluczają.
Dwie praktyczne zasady: serwer, który deklaruje profil w swoim CapabilityStatement, powinien odrzucać zasoby, które go nie spełniają; klient, który odbiera zasoby, nie powinien odrzucać nieznanych rozszerzeń ani dodatkowych elementów, których profil nie zabronił, ponieważ podstawowa specyfikacja na to pozwala.
W Anpheros
Anpheros Platform to serwer FHIR R4, który używa LOINC dla obserwacji, ATC dla leków i SNOMED CT tam, gdzie to możliwe, oraz oferuje darmowy walidator, który sprawdza strukturę zasobu w odniesieniu do FHIR R4. Kiedy klinika wysyła zasoby z meta.profile ustawionym na profil krajowy lub IPS, deklaracja jest zachowywana, dzięki czemu systemy niższego poziomu mogą ją walidować.
Darmowy walidator znajduje się na stronie dla deweloperów. Same przewodniki można znaleźć w Przewodnikach implementacji FHIR wyjaśnionych.
Powiązane strony
- Wyjaśnienie przewodników implementacyjnych FHIR
- CodeableConcept i Coding w FHIR
- Wyjaśnienie zasobu FHIR Observation
- Wyjaśnienie zasobu FHIR Patient
- Wyjaśnienie serwerów terminologicznych
- Walidator FHIR (strona dla deweloperów)
Źródła
- HL7 FHIR R4: Profilowanie FHIR
- HL7 FHIR R4: Rozszerzalność
- HL7 FHIR R4: StructureDefinition
- HL7 FHIR R4: Powiązania terminologiczne
- HL7 FHIR Shorthand
- Walidator HL7 FHIR
- HL7 FHIR R4: rozszerzenie patient-birthPlace
Najczęstsze pytania
Czy profil może dodać nowy element do zasobu?
Nie. Profile tylko ograniczają. Nowe dane trafiają do rozszerzenia, które profil może następnie wymagać lub zabraniać, jak każdy inny element.
Czego dokładnie wymaga „must-support”?
Definiuje to przewodnik implementacyjny; zazwyczaj oznacza to, że nadawca wypełnia element, gdy posiada dane, a odbiorca je przechowuje i może wyświetlić. Nie czyni to elementu obowiązkowym.
Czy zasób bez meta.profile jest nieprawidłowy?
Nie. meta.profile to deklaracja, a nie wymóg. Serwer lub przewodnik może go wymagać; podstawowa specyfikacja nie. Walidatory mogą być poproszone o sprawdzenie względem profilu, którego zasób nie deklaruje.
Skąd mam wiedzieć, który profil użyć w moim kraju?
Każda krajowa społeczność FHIR publikuje podstawowy przewodnik (US Core, UK Core, nl-core, niemieckie Basisprofile itd.); strona przewodników implementacyjnych wyjaśnia, jak je znaleźć. Międzynarodowe podsumowania wykorzystują IPS.
Wypróbuj za darmo w sandboksie
Pierwsze wywołanie FHIR w 5 minut. API HL7 FHIR R4 z wbudowaną zgodą pacjenta: wypróbuj w piaskownicy, a następnie połącz własną aplikację lub system kliniczny.
Za darmo · 30 syntetycznych pacjentów · bez karty

