GraphDefinition — Décrire un graphe de ressources
Comment ramener "tout ce qui touche un patient" en une seule requête ? GraphDefinition
décrit formellement le graphe de ressources attendu et alimente l'opération
$graph.
Objet de la ressource
GraphDefinition est la métadonnée qui décrit un graphe orienté de ressources FHIR interconnectées par des Reference. Elle sert deux usages principaux :
- Alimenter l'opération
$graph— exécutée sur une ressource racine, elle retourne un Bundle searchset incluant toutes les ressources atteignables selon la définition. - Documenter dans un Implementation Guide ce que doit contenir un Bundle (document, message, transaction) pour un cas d'usage donné.
Champs clés
| Champ | Type | Cardinalité | Rôle |
|---|---|---|---|
url | uri | 0..1 | URL canonique. |
name | string | 1..1 | Nom machine. |
status | code | 1..1 | État de publication. |
start | code | 1..1 | Type de ressource racine du graphe. |
node | BackboneElement[] | 0..* | Nœuds du graphe (types + profils). |
node.nodeId | id | 1..1 | ID local du nœud. |
node.type | code | 1..1 | Type FHIR du nœud. |
node.profile | canonical | 0..1 | Profil sur le type. |
link | BackboneElement[] | 0..* | Arêtes orientées. |
link.sourceId | id | 1..1 | Nœud source. |
link.targetId | id | 1..1 | Nœud cible. |
link.path | string | 0..1 | FHIRPath ou type de référence. |
link.min / link.max | integer / string | 0..1 chacun | Cardinalité de la liaison. |
Exemple JSON
Graphe : Patient → Encounter → CareTeam → Practitioner. Utilisable pour
GET /Patient/123/$graph?graph=http://hl7.org/fhir/GraphDefinition/example :
{
"resourceType": "GraphDefinition",
"id": "example",
"url": "http://hl7.org/fhir/GraphDefinition/example",
"version": "5.0.0",
"name": "PatientCareTeamGraph",
"status": "active",
"experimental": false,
"date": "2026-05-14",
"publisher": "HL7 (FHIR Project)",
"description": "Graphe Patient + Encounter + CareTeam + Practitioner.",
"start": "Patient",
"node": [
{
"nodeId": "encounter",
"type": "Encounter",
"profile": "http://hl7.org/fhir/StructureDefinition/Encounter"
},
{
"nodeId": "careteam",
"type": "CareTeam",
"profile": "http://hl7.org/fhir/StructureDefinition/CareTeam"
},
{
"nodeId": "practitioner",
"type": "Practitioner",
"profile": "http://hl7.org/fhir/StructureDefinition/Practitioner"
}
],
"link": [
{
"description": "Patient → Encounter",
"min": 0,
"max": "*",
"sourceId": "Patient",
"targetId": "encounter",
"path": "Encounter.subject.where(reference.startsWith('Patient/'))"
},
{
"description": "Encounter → CareTeam",
"sourceId": "encounter",
"targetId": "careteam",
"path": "CareTeam.encounter"
},
{
"description": "CareTeam → Practitioner",
"sourceId": "careteam",
"targetId": "practitioner",
"path": "CareTeam.participant.member"
}
]
} Pièges courants
- Graphes cycliques non bornés — un graphe Patient → RelatedPerson → Patient sans
maxpeut explorer infiniment. Toujours borner. - FHIRPath non indexable — un
link.pathtrop complexe (filtres lourds) ne sera pas exécutable par le serveur. - Profile cible non chargé — si
node.profileréférence une StructureDefinition absente du serveur, l'expansion échoue. - Confondre
$graphet$everything—$everythingest défini sur Patient et CareTeam uniquement et retourne tout le dossier,$graphest paramétré par une GraphDefinition arbitraire.
Ressources liées
- StructureDefinition — profils sur les nœuds.
- OperationDefinition — décrit l'opération
$graphqui consomme une GraphDefinition. - MessageDefinition — peut référencer un graphe via
graph. - Bundle — conteneur retourné par
$graph.