ediverse Explorer la plateforme

À la une PEPPOL BIS Billing 3.0 L’obligation européenne d’e-invoicing arrive : France sept 2026, Belgique janv 2026, Allemagne 2025.

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

ChampTypeCardinalitéRôle
urluri0..1URL canonique.
namestring1..1Nom machine.
statuscode1..1État de publication.
startcode1..1Type de ressource racine du graphe.
nodeBackboneElement[]0..*Nœuds du graphe (types + profils).
node.nodeIdid1..1ID local du nœud.
node.typecode1..1Type FHIR du nœud.
node.profilecanonical0..1Profil sur le type.
linkBackboneElement[]0..*Arêtes orientées.
link.sourceIdid1..1Nœud source.
link.targetIdid1..1Nœud cible.
link.pathstring0..1FHIRPath ou type de référence.
link.min / link.maxinteger / string0..1 chacunCardinalité de la liaison.

Exemple JSON

Graphe : Patient → Encounter → CareTeam → Practitioner. Utilisable pour GET /Patient/123/$graph?graph=http://hl7.org/fhir/GraphDefinition/example :

json graphdefinition-careteam.json
{
  "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 max peut explorer infiniment. Toujours borner.
  • FHIRPath non indexable — un link.path trop complexe (filtres lourds) ne sera pas exécutable par le serveur.
  • Profile cible non chargé — si node.profile référence une StructureDefinition absente du serveur, l'expansion échoue.
  • Confondre $graph et $everything$everything est défini sur Patient et CareTeam uniquement et retourne tout le dossier, $graph est paramétré par une GraphDefinition arbitraire.

Ressources liées

  • StructureDefinition — profils sur les nœuds.
  • OperationDefinition — décrit l'opération $graph qui consomme une GraphDefinition.
  • MessageDefinition — peut référencer un graphe via graph.
  • Bundle — conteneur retourné par $graph.