FHIR

Explicația profilurilor și extensiilor FHIR: cum un ghid de implementare restricționează o resursă și cum să validezi împotriva acestuia

Profil FHIR: StructureDefinition ce restricționează resurse (obligatorii, must-support, coduri fixe, slicing, bindings, invariante). Extensia adaugă funcționalități. Publicare profiluri, meta.profile, validare, exemplu.

de Publicat 6 min de citit

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

Surse

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

Anpheros Platform

Î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

Acest ghid este informativ și nu înlocuiește consultul medical. Pentru decizii despre sănătatea ta, vorbește cu medicul tău. În caz de urgență, sună la numărul de urgență local (112 în Europa).
Scris de
Echipa Anpheros

Anpheros construiește un dosar medical pe care pacientul îl controlează și îl poate da oricărei clinici, pe o platformă HL7 FHIR R4, cu sediul în UE. Ghidurile te ajută să-ți înțelegi și să-ți organizezi sănătatea; nu înlocuiesc medicul.

Despre Anpheros →