Răspuns scurt: resursele FHIR de bază sunt intenționat flexibile: aproape totul este opțional și majoritatea codurilor sunt doar exemple, astfel încât un singur standard să se potrivească oricărei țări. Un profil este o StructureDefinition care restrânge o resursă pentru o anumită utilizare: în acest context, Pacientul trebuie să aibă un identificator de acest tip, Observation.code trebuie să fie un cod LOINC din această listă, acest element trebuie să fie suportat, celălalt nu poate apărea. O extensie adaugă un element pe care resursa de bază nu îl are, identificat printr-un URL și definit prin propria sa StructureDefinition. Ghidurile de implementare (US Core, IPS, ghiduri naționale) sunt colecții de profiluri, extensii, seturi de valori și exemple. O resursă indică ce profiluri pretinde că respectă în meta.profile, iar un validator o verifică.
Ce poate schimba un profil
Un profil FHIR poate modifica o resursă doar prin restrângerea acesteia: ajustarea cardinalității, marcarea elementelor ca fiind obligatorii (must-support), fixarea valorilor sau a modelelor, legarea elementelor la seturi de valori cu o anumită forță, împărțirea listelor în secțiuni denumite, restricționarea tipurilor de alegeri, adăugarea de invariante FHIRPath și limitarea țintelor de referință. Un profil nu poate adăuga elemente, redenumi nimic sau relaxa specificația de bază.
| Constângere | Ce face | Exemplu |
|---|---|---|
| Cardinalitate | Face elementele opționale obligatorii sau le interzice | Patient.identifier 1..*; Patient.photo 0..0 |
| Trebuie suportat | Destinatarii trebuie să poată stoca și afișa elementul dacă este trimis | US Core marchează birthDate ca "trebuie suportat" |
| Valoare fixă sau tipar | Blochează un element la o singură valoare | Observation.category fixat la vital-signs |
| Legătură (Binding) | Leagă un element la un set de valori cu o anumită forță | Observation.code legat la lista de semne vitale, obligatoriu |
| Segmentare (Slicing) | Împarte o listă în părți denumite cu propriile reguli | Tensiunea arterială: componenta segmentată în sistolică și diastolică |
| Restricție de tip | Limitează o alegere | value[x] restricționat la valueQuantity |
| Invariant | O regulă FHIRPath care trebuie respectată | "effective[x] trebuie să fie prezent" sau "value sau dataAbsentReason" |
| Țintă de referință | Limitează la ce poate indica o referință | subject doar Pacient, și doar pacienți conformi cu acest profil |
Un profil poate doar restrânge. Nu poate adăuga elemente (pentru asta există extensiile), nu poate redenumi nimic și nu poate relaxa constrângerile de bază.
Forța legăturii (Binding strength)
FHIR definește patru niveluri de forță a legăturii (binding strength). required: codul trebuie să provină din setul de valori. extensible: folosiți setul de valori dacă un concept se potrivește; altfel, este permis un alt cod. preferred: recomandat, dar nu obligatoriu. example: doar ilustrativ, ceea ce au majoritatea resurselor de bază. Interpretarea greșită a extensible ca required este o sursă comună de erori de validare false.
Un extras de profil lizibil
Un profil FHIR este o StructureDefinition al cărei diferențial listează doar constrângerile care diferă de resursa de bază, în timp ce snapshot-ul său listează fiecare element. Extrasul lizibil de mai jos restricționează Observation la tensiunea arterială la domiciliu: codul este fixat la LOINC 85354-9, iar componenta este împărțită în exact o parte sistolică și o parte diastolică.
Diferențialul unui profil listează doar ce s-a schimbat față de baza; snapshot-ul listează totul. Acest diferențial spune că o observație a tensiunii arteriale trebuie să conțină codul LOINC 85354-9 și exact două componente:
{
"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"}]}}
]}
}
Profilurile sunt rar scrise manual; autorii folosesc FHIR Shorthand (FSH) cu SUSHI, sau instrumente precum Forge și Simplifier, și publică cu IG Publisher de la HL7. Ghidurile sunt distribuite ca pachete (hl7.fhir.us.core#6.1.0, hl7.fhir.uv.ips#1.1.0) pe care validatorii și serverele le încarcă.
Extensii
O extensie este un element cheie-valoare plasat în extension (sau modifierExtension atunci când modifică sensul resursei și nu trebuie ignorat). url-ul său este URL-ul canonic al StructureDefinition-ului său; valoarea sa este un value[x] de un anumit tip, sau extensii imbricate. Locul nașterii este o extensie definită de HL7 pe Pacient:
{
"resourceType": "Patient",
"id": "example",
"extension": [{
"url": "http://hl7.org/fhir/StructureDefinition/patient-birthPlace",
"valueAddress": {"city": "Lyon", "country": "FR"}
}],
"name": [{"family": "Doe", "given": ["Jane"]}]
}
Reguli de bună practică: căutați o extensie existentă (registrul HL7 și ghidurile naționale) înainte de a defini una; dați-i un URL sub un domeniu pe care îl controlați; definiți-o într-o StructureDefinition, astfel încât alții să o poată valida; nu folosiți niciodată o extensie pentru ceva ce un element de bază acoperă deja.
meta.profile și validare
meta.profile este lista URL-urilor canonice la care o resursă FHIR pretinde că se conformează, iar pretinderea nu este dovadă. Un validator verifică resursa în raport cu specificația de bază și cu fiecare profil pretins, sau cu un profil pe care îl numiți. Validatorul de referință HL7 rulează local cu pachete, iar serverele FHIR expun o operațiune $validate care acceptă un parametru de profil.
meta.profile listează URL-urile canonice pe care o resursă pretinde că le respectă. Pretinderea nu este o dovadă: un validator verifică resursa în raport cu specificația de bază și cu fiecare profil pretins (sau cu un profil pe care îl cereți să-l folosească). Validatorul de referință HL7 (validator_cli.jar) rulează local și încarcă pachete; serverele oferă POST /Observation/$validate?profile=…; IG Publisher validează toate exemplele dintr-un ghid. O resursă poate fi conformă cu mai multe profiluri simultan (un profil național de Pacient și Pacientul IPS) atâta timp cât acestea nu contrazic.
Două reguli practice: un server care declară un profil în CapabilityStatement-ul său ar trebui să respingă resursele care nu îl respectă; un client care primește resurse nu ar trebui să respingă extensii necunoscute sau elemente suplimentare pe care un profil nu le-a interzis, deoarece specificația de bază le permite.
În Anpheros
Anpheros Platform este un server FHIR R4 care utilizează LOINC pentru observații, ATC pentru medicamente și SNOMED CT acolo unde este aplicabil, și oferă un validator gratuit care verifică structura unei resurse în raport cu FHIR R4. Când o clinică trimite resurse cu meta.profile setat la un profil național sau IPS, pretenția este păstrată, astfel încât un sistem ulterior să o poată valida.
Validatorul gratuit se află pe site-ul pentru dezvoltatori. Pentru ghidurile în sine, consultați Ghiduri de implementare FHIR explicate.
Pagini înrudite
- Ghiduri de implementare FHIR explicate
- CodeableConcept și Coding în FHIR
- Resursa FHIR Observation explicată
- Resursa FHIR Patient explicată
- Servere de terminologie explicate
- Validator FHIR (site pentru dezvoltatori)
Surse
- HL7 FHIR R4: Profiling FHIR
- HL7 FHIR R4: Extensibility
- HL7 FHIR R4: StructureDefinition
- HL7 FHIR R4: Terminology bindings
- HL7 FHIR Shorthand
- HL7 FHIR validator
- HL7 FHIR R4: patient-birthPlace extension
Întrebări frecvente
Poate un profil să adauge un element nou la o resursă?
Nu. Profilurile doar constrâng. Datele noi intră într-o extensie, pe care profilul o poate apoi cere sau interzice ca orice alt element.
Ce implică de fapt "trebuie suportat"?
Ghidul de implementare îl definește; de obicei, înseamnă că un expeditor completează elementul atunci când are datele, iar un receptor le stochează și le poate afișa. Nu face elementul obligatoriu.
Dacă o resursă nu are meta.profile, este invalidă?
Nu. meta.profile este o pretenție, nu o cerință. Un server sau un ghid poate să o solicite; specificația de bază nu o face. Validatorii pot fi rugați să verifice în raport cu un profil pe care resursa nu îl declară.
Cum știu ce profil să folosesc în țara mea?
Fiecare comunitate FHIR națională publică un ghid de bază (US Core, UK Core, nl-core, Basisprofile germane etc.); pagina ghidurilor de implementare explică cum să le găsiți. Rezumatele transfrontaliere folosesc IPS.
Încearcă gratuit în sandbox
Primul apel FHIR în 5 minute. Un API HL7 FHIR R4 cu consimțământul pacientului integrat: încearcă-l în sandbox, apoi conectează-ți propria aplicație sau sistemul clinicii.
Gratuit · 30 de pacienți sintetici · fără card

