Release 4B Snapshot 3: Connectathon 32 Base

This page is part of the FHIR Specification (v4.3.0: R4B - STU (v5.0.0-snapshot3: R5 Snapshot #3, to support Connectathon 32 ). The current version which supercedes this version is 5.0.0 . For a full list of available versions, see the Directory of published versions . Page versions: R5 R4B R4 R3

5.9 5.10 Resource GraphDefinition - Content

FHIR Infrastructure icon Work Group Maturity Level : 1   Trial Use Security Category : Anonymous Compartments : Not linked to any defined compartments

A formal computable definition of a graph of resources - that is, a coherent set of resources that form a graph by following references. The Graph Definition resource defines a set and makes rules about the set.

The GraphDefinition resource provides a formal computable definition of a graph of resources - that is, a coherent set of resources that form a graph by following references. The Graph Definition resource defines a set and makes rules about the set. The GraphDefinition resource can be used to:

  • Summarize a set of profiles on resources
  • Define a graph of resources to return in a query
  • Define a graph of resources to include in a document
  • Document rules about the relationship between a set of resources e.g. must all resources concern the same patient?

There is a close relationship between Profiles and GraphDefinitions :

  • A StructureDefinition defines a profile, and profiles can make rules about the relationships between resources. A carefully defined set of profiles implies part of what is in a GraphDefinition
  • A GraphDefinition defines rules about the relationships between resources, and in so doing, implies some constraints that would need to could or should be represented in their profiles profiles, if they are defined
  • Like CompartmentDefinition , GraphDefinition allows defining a grouping of resources and may be used for security access permissions. However, GraphDefinitions do not define additional query capabilities and are much more limited in how membership in the collection is defined (all resources that are part of a Compartment must expose a search parameter of the same name).

Profiles and Graph Definitions can be used together, or separately. When used together, they should be consistent. Note, though, that a graph definition may contain a subset or a superset of the relationships explicitly described in the profiles it refers to.

It is possible that in some circumstances, a graph definition makes incompatible rules with the Profiles it refers to - in this case, no graph if of resources will meet the constraints expressed. Applications should - but are not required to - detect when such incompatibilities arise.

This resource is referenced by

Structure

Σ string
Name icon Flags icon Card. icon Type icon Description & Constraints icon doco icon
. . GraphDefinition TU DomainResource Definition of a graph of resources
+ Warning: Name should be usable as an identifier for the module by machine processing applications such as code generation

Elements defined in Ancestors: id , meta , implicitRules , language , text , contained , extension , modifierExtension
Interfaces Implemented: CanonicalResource
. . . url Σ C 0..1 uri Canonical identifier for this graph definition, represented as a URI (globally unique)
+ Warning: URL should not contain | or # - these characters make processing canonical references problematic
. . . version Σ 0..1 string Business version of the graph definition
. . . versionAlgorithm[x] Σ 0..1 How to compare versions
Version Algorithm ( Extensible )
. . . . versionAlgorithmString string
.... versionAlgorithmCoding Coding
... title Σ T 1..1 0..1 string Name for this graph definition (computer (human friendly)
. . . status ?! Σ 1..1 code draft | active | retired | unknown
PublicationStatus ( Required )
. . . experimental Σ 0..1 boolean For testing purposes, not real usage
. . . date Σ 0..1 dateTime Date last changed
. . . publisher Σ T 0..1 string Name of the publisher publisher/steward (organization or individual)
. . . contact Σ 0..* ContactDetail Contact details for the publisher

. . . description T 0..1 markdown Natural language description of the graph definition
. . . useContext Σ 0..* UsageContext The context that the content is intended to support

. . . jurisdiction Σ 0..* CodeableConcept Intended jurisdiction for graph definition (if applicable)
Jurisdiction ValueSet ( Extensible )

. . . purpose T 0..1 markdown Why this graph definition is defined
. . . start 1..1 0..1 code id Type of resource at which the graph starts Starting Node
ResourceType ( Required )
. . profile . node 0..1 0..* canonical ( StructureDefinition BackboneElement ) Profile on base resource Potential target for the link

. . link . . nodeId 0..* 1..1 BackboneElement id Links this graph makes rules about Internal ID - target for link references
. . . . path description 0..1 string Path in the resource that contains the link Why this node is specified
. . . . sliceName type 1..1 code Type of resource this link refers to
All Resource Types ( Required )
.... profile 0..1 canonical ( StructureDefinition ) Profile for the target resource
... link 0..* BackboneElement Which slice (if profiled) Links this graph makes rules about

. . . . min description 0..1 integer string Minimum occurrences for Why this link is specified
. . . . max min 0..1 string integer Maximum Minimum occurrences for this link
. . . . description max 0..1 string Why Maximum occurrences for this link is specified
. . . target . sourceId 0..* 1..1 BackboneElement id Potential target Source Node for the this link
. . . . type path 1..1 0..1 code string Type of Path in the resource this that contains the link refers to
ResourceType ( Required )
. . . . params sliceName 0..1 string Criteria for reverse lookup Which slice (if profiled)
. . . profile . targetId 0..1 1..1 canonical ( StructureDefinition id ) Profile Target Node for the target resource this link
. . . compartment . params 0..* 0..1 BackboneElement string Compartment Consistency Rules Criteria for reverse lookup
. . . use . compartment 1..1 0..* code BackboneElement condition | requirement Compartment Consistency Rules

GraphCompartmentUse ( Required )
. . . . . code use 1..1 code Patient | Encounter | RelatedPerson | Practitioner where | Device requires
CompartmentType GraphCompartmentUse ( Required )
. . . . . rule 1..1 code identical | matching | different | custom
GraphCompartmentRule ( Required )
. . . . . expression code 0..1 1..1 string code Custom rule, as a FHIRPath expression Patient | Encounter | RelatedPerson | Practitioner | Device
CompartmentType ( Required )
. . . . . description expression 0..1 string Documentation for Custom rule, as a FHIRPath expression
. . . . link . description 0..* 0..1 see link string Additional links from target resource Documentation for FHIRPath expression

doco Documentation for this format icon

See the Extensions for this resource

UML Diagram ( Legend )

GraphDefinition ( DomainResource ) + CanonicalResource An absolute URI that is used to identify this graph definition when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which at which an authoritative instance of this graph definition is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the graph definition is stored on different servers url : uri [0..1] The identifier that is used to identify this version of the graph definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the graph definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence version : string [0..1] Indicates the mechanism used to compare versions to determine which is more current versionAlgorithm[x] : DataType [0..1] « string | Coding ; null (Strength=Extensible) VersionAlgorithm + » A natural language name identifying the graph definition. This name should be usable as an identifier for the module by machine processing applications such as code generation name : string [1..1] « This element has or is affected by some invariants C » A short, descriptive, user-friendly title for the capability statement title : string [0..1] The status of this graph definition. Enables tracking the life-cycle of the content (this element modifies the meaning of other elements) status : code [1..1] « null (Strength=Required) PublicationStatus ! » A Boolean value to indicate that this graph definition is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage experimental : boolean [0..1] The date (and optionally time) when the graph definition was published. last significantly changed. The date must change when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the graph definition changes date : dateTime [0..1] The name of the organization or individual that published responsible for the release and ongoing maintenance of the graph definition publisher : string [0..1] Contact details to assist a user in finding and communicating with the publisher contact : ContactDetail [0..*] A free text natural language description of the graph definition from a consumer's perspective description : markdown [0..1] The content was developed with a focus and intent of supporting the contexts that are listed. These contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate graph definition instances useContext : UsageContext [0..*] A legal or geographic region in which the graph definition is intended to be used jurisdiction : CodeableConcept [0..*] « null (Strength=Extensible) Jurisdiction ValueSet JurisdictionValueSet + » Explanation of why this graph definition is needed and why it has been designed as it has purpose : markdown [0..1] The type of FHIR resource Node at which instances of this graph start. If there is no nominated start, the graph can start at any of the nodes start : id [0..1] Node Internal ID of node - target for link references nodeId : id [1..1] Information about why this node is of interest in this graph definition description : string [0..1] Type of resource this link refers to type : code [1..1] « null (Strength=Required) ResourceType AllResourceTypes ! » The profile that describes the use of Profile for the base target resource profile : canonical [0..1] « StructureDefinition » Link A FHIR expression that identifies one Information about why this link is of FHIR References to other resources path : string [0..1] Which slice (if profiled) interest in this graph definition sliceName description : string [0..1] Minimum occurrences for this link min : integer [0..1] Maximum occurrences for this link max : string [0..1] Information about why The source node for this link is of interest in this graph definition description sourceId : string id [0..1] [1..1] A FHIRPath expression that identifies one of FHIR References to other resources path : string [0..1] Target Which slice (if profiled) sliceName : string [0..1] Type of resource The target node for this link refers to type targetId : code id [1..1] « null (Strength=Required) ResourceType ! » A set of parameters to look up params : string [0..1] Profile for the target resource profile : canonical [0..1] « StructureDefinition » Compartment Defines how the compartment rule is used - whether it it is used to test whether resources are subject to the rule, or whether it is a rule that must be followed use : code [1..1] « null (Strength=Required) GraphCompartmentUse ! » Identifies the compartment identical | matching | different | no-rule | custom code rule : code [1..1] « null (Strength=Required) CompartmentType GraphCompartmentRule ! » identical | matching | different | no-rule | custom Identifies the compartment rule code : code [1..1] « null (Strength=Required) GraphCompartmentRule CompartmentType ! » Custom rule, as a FHIRPath expression expression : string [0..1] Documentation for FHIRPath expression description : string [0..1] Compartment Consistency Rules compartment [0..*] Additional links from Potential target resource for the link node [0..*] Potential target for the link Compartment Consistency Rules target compartment [0..*] Links this graph makes rules about link [0..*]

XML Template

<GraphDefinition xmlns="http://hl7.org/fhir"> doco
 <!-- from Resource: id, meta, implicitRules, and language -->
 <!-- from DomainResource: text, contained, extension, and modifierExtension -->
 <

 <url value="[uri]"/><!-- 0..1 Canonical identifier for this graph definition, represented as a URI (globally unique) -->

 <version value="[string]"/><!-- 0..1 Business version of the graph definition -->
 <

 <versionAlgorithm[x]><!-- 0..1 string|Coding How to compare versions --></versionAlgorithm[x]>
 <name value="[string]"/><!-- I 1..1 Name for this graph definition (computer friendly) -->
 <title value="[string]"/><!-- 0..1 Name for this graph definition (human friendly) -->

 <status value="[code]"/><!-- 1..1 draft | active | retired | unknown -->
 <experimental value="[boolean]"/><!-- 0..1 For testing purposes, not real usage -->
 <
 <

 <date value="[dateTime]"/><!-- 0..1 Date last changed -->
 <publisher value="[string]"/><!-- 0..1 Name of the publisher/steward (organization or individual) -->

 <contact><!-- 0..* ContactDetail Contact details for the publisher --></contact>
 <description value="[markdown]"/><!-- 0..1 Natural language description of the graph definition -->
 <useContext><!-- 0..* UsageContext The context that the content is intended to support --></useContext>
 <jurisdiction><!-- 0..* CodeableConcept Intended jurisdiction for graph definition (if applicable) --></jurisdiction>
 <purpose value="[markdown]"/><!-- 0..1 Why this graph definition is defined -->
 <
 <</profile>

 <start value="[id]"/><!-- 0..1 Starting Node -->
 <node>  <!-- 0..* Potential target for the link -->
  <nodeId value="[id]"/><!-- 1..1 Internal ID - target for link references -->
  <description value="[string]"/><!-- 0..1 Why this node is specified -->
  <type value="[code]"/><!-- 1..1 Type of resource this link refers to -->
  <profile><!-- 0..1 canonical(StructureDefinition) Profile for the target resource --></profile>
 </node>

 <link>  <!-- 0..* Links this graph makes rules about -->
  <
  <

  <description value="[string]"/><!-- 0..1 Why this link is specified -->

  <min value="[integer]"/><!-- 0..1 Minimum occurrences for this link -->
  <max value="[string]"/><!-- 0..1 Maximum occurrences for this link -->
  <
  <
   <
   <
   <</profile>
   <
    <
    <
    <
    <
    <
   </compartment>
   <</link>
  </target>

  <sourceId value="[id]"/><!-- 1..1 Source Node for this link -->
  <path value="[string]"/><!-- 0..1 Path in the resource that contains the link -->
  <sliceName value="[string]"/><!-- 0..1 Which slice (if profiled) -->
  <targetId value="[id]"/><!-- 1..1 Target Node for this link -->
  <params value="[string]"/><!-- 0..1 Criteria for reverse lookup -->
  <compartment>  <!-- 0..* Compartment Consistency Rules -->
   <use value="[code]"/><!-- 1..1 where | requires -->
   <rule value="[code]"/><!-- 1..1 identical | matching | different | custom -->
   <code value="[code]"/><!-- 1..1 Patient | Encounter | RelatedPerson | Practitioner | Device -->
   <expression value="[string]"/><!-- 0..1 Custom rule, as a FHIRPath expression -->
   <description value="[string]"/><!-- 0..1 Documentation for FHIRPath expression -->
  </compartment>

 </link>
</GraphDefinition>

JSON Template

{doco
  "resourceType" : "GraphDefinition",
  // from Resource: id, meta, implicitRules, and language
  // from DomainResource: text, contained, extension, and modifierExtension
  "

  "url" : "<uri>", // Canonical identifier for this graph definition, represented as a URI (globally unique)

  "version" : "<string>", // Business version of the graph definition
  "

  // versionAlgorithm[x]: How to compare versions. One of these 2:
  "versionAlgorithmString" : "<string>",
  "versionAlgorithmCoding" : { Coding },
  "name" : "<string>", // I R!  Name for this graph definition (computer friendly)
  "title" : "<string>", // Name for this graph definition (human friendly)

  "status" : "<code>", // R!  draft | active | retired | unknown
  "experimental" : <boolean>, // For testing purposes, not real usage
  "
  "

  "date" : "<dateTime>", // Date last changed
  "publisher" : "<string>", // Name of the publisher/steward (organization or individual)

  "contact" : [{ ContactDetail }], // Contact details for the publisher
  "description" : "<markdown>", // Natural language description of the graph definition
  "useContext" : [{ UsageContext }], // The context that the content is intended to support
  "jurisdiction" : [{ CodeableConcept }], // Intended jurisdiction for graph definition (if applicable)
  "purpose" : "<markdown>", // Why this graph definition is defined
  "
  "

  "start" : "<id>", // Starting Node
  "node" : [{ // Potential target for the link
    "nodeId" : "<id>", // R!  Internal ID - target for link references
    "description" : "<string>", // Why this node is specified
    "type" : "<code>", // R!  Type of resource this link refers to
    "profile" : "<canonical(StructureDefinition)>" // Profile for the target resource
  }],

  "link" : [{ // Links this graph makes rules about
    "
    "

    "description" : "<string>", // Why this link is specified

    "min" : <integer>, // Minimum occurrences for this link
    "max" : "<string>", // Maximum occurrences for this link
    "
    "
      "
      "
      "
      "
        "
        "
        "
        "
        "
      }],
      "

    "sourceId" : "<id>", // R!  Source Node for this link
    "path" : "<string>", // Path in the resource that contains the link
    "sliceName" : "<string>", // Which slice (if profiled)
    "targetId" : "<id>", // R!  Target Node for this link
    "params" : "<string>", // Criteria for reverse lookup
    "compartment" : [{ // Compartment Consistency Rules
      "use" : "<code>", // R!  where | requires
      "rule" : "<code>", // R!  identical | matching | different | custom
      "code" : "<code>", // R!  Patient | Encounter | RelatedPerson | Practitioner | Device
      "expression" : "<string>", // Custom rule, as a FHIRPath expression
      "description" : "<string>" // Documentation for FHIRPath expression

    }]
  }]
}

Turtle Template

@prefix fhir: <http://hl7.org/fhir/> .doco


[ a fhir:GraphDefinition;
  fhir:nodeRole fhir:treeRoot; # if this is the parser root

  # from Resource: .id, .meta, .implicitRules, and .language
  # from DomainResource: .text, .contained, .extension, and .modifierExtension
  fhir:

  fhir:GraphDefinition.url [ uri ]; # 0..1 Canonical identifier for this graph definition, represented as a URI (globally unique)

  fhir:GraphDefinition.version [ string ]; # 0..1 Business version of the graph definition
  fhir:

  # GraphDefinition.versionAlgorithm[x] : 0..1 How to compare versions. One of these 2
    fhir:GraphDefinition.versionAlgorithmString [ string ]
    fhir:GraphDefinition.versionAlgorithmCoding [ Coding ]
  fhir:GraphDefinition.name [ string ]; # 1..1 I Name for this graph definition (computer friendly)
  fhir:GraphDefinition.title [ string ]; # 0..1 Name for this graph definition (human friendly)

  fhir:GraphDefinition.status [ code ]; # 1..1 draft | active | retired | unknown
  fhir:GraphDefinition.experimental [ boolean ]; # 0..1 For testing purposes, not real usage
  fhir:
  fhir:

  fhir:GraphDefinition.date [ dateTime ]; # 0..1 Date last changed
  fhir:GraphDefinition.publisher [ string ]; # 0..1 Name of the publisher/steward (organization or individual)

  fhir:GraphDefinition.contact [ ContactDetail ], ... ; # 0..* Contact details for the publisher
  fhir:GraphDefinition.description [ markdown ]; # 0..1 Natural language description of the graph definition
  fhir:GraphDefinition.useContext [ UsageContext ], ... ; # 0..* The context that the content is intended to support
  fhir:GraphDefinition.jurisdiction [ CodeableConcept ], ... ; # 0..* Intended jurisdiction for graph definition (if applicable)
  fhir:GraphDefinition.purpose [ markdown ]; # 0..1 Why this graph definition is defined
  fhir:
  fhir:

  fhir:GraphDefinition.start [ id ]; # 0..1 Starting Node
  fhir:GraphDefinition.node [ # 0..* Potential target for the link
    fhir:GraphDefinition.node.nodeId [ id ]; # 1..1 Internal ID - target for link references
    fhir:GraphDefinition.node.description [ string ]; # 0..1 Why this node is specified
    fhir:GraphDefinition.node.type [ code ]; # 1..1 Type of resource this link refers to
    fhir:GraphDefinition.node.profile [ canonical(StructureDefinition) ]; # 0..1 Profile for the target resource
  ], ...;

  fhir:GraphDefinition.link [ # 0..* Links this graph makes rules about
    fhir:
    fhir:

    fhir:GraphDefinition.link.description [ string ]; # 0..1 Why this link is specified

    fhir:GraphDefinition.link.min [ integer ]; # 0..1 Minimum occurrences for this link
    fhir:GraphDefinition.link.max [ string ]; # 0..1 Maximum occurrences for this link
    fhir:
    fhir:
      fhir:
      fhir:
      fhir:
      fhir:
        fhir:
        fhir:
        fhir:
        fhir:
        fhir:
      ], ...;
      fhir:

    fhir:GraphDefinition.link.sourceId [ id ]; # 1..1 Source Node for this link
    fhir:GraphDefinition.link.path [ string ]; # 0..1 Path in the resource that contains the link
    fhir:GraphDefinition.link.sliceName [ string ]; # 0..1 Which slice (if profiled)
    fhir:GraphDefinition.link.targetId [ id ]; # 1..1 Target Node for this link
    fhir:GraphDefinition.link.params [ string ]; # 0..1 Criteria for reverse lookup
    fhir:GraphDefinition.link.compartment [ # 0..* Compartment Consistency Rules
      fhir:GraphDefinition.link.compartment.use [ code ]; # 1..1 where | requires
      fhir:GraphDefinition.link.compartment.rule [ code ]; # 1..1 identical | matching | different | custom
      fhir:GraphDefinition.link.compartment.code [ code ]; # 1..1 Patient | Encounter | RelatedPerson | Practitioner | Device
      fhir:GraphDefinition.link.compartment.expression [ string ]; # 0..1 Custom rule, as a FHIRPath expression
      fhir:GraphDefinition.link.compartment.description [ string ]; # 0..1 Documentation for FHIRPath expression

    ], ...;
  ], ...;
]

Changes since R4

GraphDefinition
GraphDefinition.versionAlgorithm[x]
  • No Changes Added Element
GraphDefinition.title
  • Added Element
GraphDefinition.start
  • Min Cardinality changed from 1 to 0
  • Type changed from code to id
  • Remove Binding http://hl7.org/fhir/ValueSet/resource-types|4.0.0 (required)
  • Remove Binding http://hl7.org/fhir/ValueSet/resource-types|4.0.0 (required)
GraphDefinition.node
  • Added Element
GraphDefinition.node.nodeId
  • Added Mandatory Element
GraphDefinition.node.description
  • Added Element
GraphDefinition.node.type
  • Added Mandatory Element
GraphDefinition.node.profile
  • Added Element
GraphDefinition.link.sourceId
  • Added Mandatory Element
GraphDefinition.link.targetId
  • Added Mandatory Element
GraphDefinition.link.params
  • Added Element
GraphDefinition.link.compartment
  • Added Element
GraphDefinition.link.compartment.use
  • Added Mandatory Element
GraphDefinition.link.compartment.rule
  • Added Mandatory Element
GraphDefinition.link.compartment.code
  • Added Mandatory Element
GraphDefinition.link.compartment.expression
  • Added Element
GraphDefinition.link.compartment.description
  • Added Element
GraphDefinition.profile
  • deleted
GraphDefinition.link.target
  • deleted

See the Full Difference for further information

This analysis is available as XML or JSON .

Conversions between R3 and R4 See R3 <--> R4 Conversion Maps (status = 1 test that all execute ok. All tests pass round-trip testing and 1 r3 resources are invalid (0 errors). )

Structure

Σ string
Name icon Flags icon Card. icon Type icon Description & Constraints icon doco icon
. . GraphDefinition TU DomainResource Definition of a graph of resources
+ Warning: Name should be usable as an identifier for the module by machine processing applications such as code generation

Elements defined in Ancestors: id , meta , implicitRules , language , text , contained , extension , modifierExtension
Interfaces Implemented: CanonicalResource
. . . url Σ C 0..1 uri Canonical identifier for this graph definition, represented as a URI (globally unique)
+ Warning: URL should not contain | or # - these characters make processing canonical references problematic
. . . version Σ 0..1 string Business version of the graph definition
. . . versionAlgorithm[x] Σ 0..1 How to compare versions
Version Algorithm ( Extensible )
. . . . versionAlgorithmString string
.... versionAlgorithmCoding Coding
... title Σ T 1..1 0..1 string Name for this graph definition (computer (human friendly)
. . . status ?! Σ 1..1 code draft | active | retired | unknown
PublicationStatus ( Required )
. . . experimental Σ 0..1 boolean For testing purposes, not real usage
. . . date Σ 0..1 dateTime Date last changed
. . . publisher Σ T 0..1 string Name of the publisher publisher/steward (organization or individual)
. . . contact Σ 0..* ContactDetail Contact details for the publisher

. . . description T 0..1 markdown Natural language description of the graph definition
. . . useContext Σ 0..* UsageContext The context that the content is intended to support

. . . jurisdiction Σ 0..* CodeableConcept Intended jurisdiction for graph definition (if applicable)
Jurisdiction ValueSet ( Extensible )

. . . purpose T 0..1 markdown Why this graph definition is defined
. . . start 1..1 0..1 code id Type of resource at which the graph starts Starting Node
ResourceType ( Required )
. . profile . node 0..1 0..* canonical ( StructureDefinition BackboneElement ) Profile on base resource Potential target for the link

. . link . . nodeId 0..* 1..1 BackboneElement id Links this graph makes rules about Internal ID - target for link references
. . . . path description 0..1 string Path in the resource that contains the link Why this node is specified
. . . . sliceName type 1..1 code Type of resource this link refers to
All Resource Types ( Required )
.... profile 0..1 canonical ( StructureDefinition ) Profile for the target resource
... link 0..* BackboneElement Which slice (if profiled) Links this graph makes rules about

. . . . min description 0..1 integer string Minimum occurrences for Why this link is specified
. . . . max min 0..1 string integer Maximum Minimum occurrences for this link
. . . . description max 0..1 string Why Maximum occurrences for this link is specified
. . . target . sourceId 0..* 1..1 BackboneElement id Potential target Source Node for the this link
. . . . type path 1..1 0..1 code string Type of Path in the resource this that contains the link refers to
ResourceType ( Required )
. . . . params sliceName 0..1 string Criteria for reverse lookup Which slice (if profiled)
. . . profile . targetId 0..1 1..1 canonical ( StructureDefinition id ) Profile Target Node for the target resource this link
. . . compartment . params 0..* 0..1 BackboneElement string Compartment Consistency Rules Criteria for reverse lookup
. . . use . compartment 1..1 0..* code BackboneElement condition | requirement Compartment Consistency Rules

GraphCompartmentUse ( Required )
. . . . . code use 1..1 code Patient | Encounter | RelatedPerson | Practitioner where | Device requires
CompartmentType GraphCompartmentUse ( Required )
. . . . . rule 1..1 code identical | matching | different | custom
GraphCompartmentRule ( Required )
. . . . . expression code 0..1 1..1 string code Custom rule, as a FHIRPath expression Patient | Encounter | RelatedPerson | Practitioner | Device
CompartmentType ( Required )
. . . . . description expression 0..1 string Documentation for Custom rule, as a FHIRPath expression
. . . . link . description 0..* 0..1 see link string Additional links from target resource Documentation for FHIRPath expression

doco Documentation for this format icon

See the Extensions for this resource

UML Diagram ( Legend )

GraphDefinition ( DomainResource ) + CanonicalResource An absolute URI that is used to identify this graph definition when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which at which an authoritative instance of this graph definition is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the graph definition is stored on different servers url : uri [0..1] The identifier that is used to identify this version of the graph definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the graph definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence version : string [0..1] Indicates the mechanism used to compare versions to determine which is more current versionAlgorithm[x] : DataType [0..1] « string | Coding ; null (Strength=Extensible) VersionAlgorithm + » A natural language name identifying the graph definition. This name should be usable as an identifier for the module by machine processing applications such as code generation name : string [1..1] « This element has or is affected by some invariants C » A short, descriptive, user-friendly title for the capability statement title : string [0..1] The status of this graph definition. Enables tracking the life-cycle of the content (this element modifies the meaning of other elements) status : code [1..1] « null (Strength=Required) PublicationStatus ! » A Boolean value to indicate that this graph definition is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage experimental : boolean [0..1] The date (and optionally time) when the graph definition was published. last significantly changed. The date must change when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the graph definition changes date : dateTime [0..1] The name of the organization or individual that published responsible for the release and ongoing maintenance of the graph definition publisher : string [0..1] Contact details to assist a user in finding and communicating with the publisher contact : ContactDetail [0..*] A free text natural language description of the graph definition from a consumer's perspective description : markdown [0..1] The content was developed with a focus and intent of supporting the contexts that are listed. These contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate graph definition instances useContext : UsageContext [0..*] A legal or geographic region in which the graph definition is intended to be used jurisdiction : CodeableConcept [0..*] « null (Strength=Extensible) Jurisdiction ValueSet JurisdictionValueSet + » Explanation of why this graph definition is needed and why it has been designed as it has purpose : markdown [0..1] The type of FHIR resource Node at which instances of this graph start. If there is no nominated start, the graph can start at any of the nodes start : id [0..1] Node Internal ID of node - target for link references nodeId : id [1..1] Information about why this node is of interest in this graph definition description : string [0..1] Type of resource this link refers to type : code [1..1] « null (Strength=Required) ResourceType AllResourceTypes ! » The profile that describes the use of Profile for the base target resource profile : canonical [0..1] « StructureDefinition » Link A FHIR expression that identifies one Information about why this link is of FHIR References to other resources path : string [0..1] Which slice (if profiled) interest in this graph definition sliceName description : string [0..1] Minimum occurrences for this link min : integer [0..1] Maximum occurrences for this link max : string [0..1] Information about why The source node for this link is of interest in this graph definition description sourceId : string id [0..1] [1..1] A FHIRPath expression that identifies one of FHIR References to other resources path : string [0..1] Target Which slice (if profiled) sliceName : string [0..1] Type of resource The target node for this link refers to type targetId : code id [1..1] « null (Strength=Required) ResourceType ! » A set of parameters to look up params : string [0..1] Profile for the target resource profile : canonical [0..1] « StructureDefinition » Compartment Defines how the compartment rule is used - whether it it is used to test whether resources are subject to the rule, or whether it is a rule that must be followed use : code [1..1] « null (Strength=Required) GraphCompartmentUse ! » Identifies the compartment identical | matching | different | no-rule | custom code rule : code [1..1] « null (Strength=Required) CompartmentType GraphCompartmentRule ! » identical | matching | different | no-rule | custom Identifies the compartment rule code : code [1..1] « null (Strength=Required) GraphCompartmentRule CompartmentType ! » Custom rule, as a FHIRPath expression expression : string [0..1] Documentation for FHIRPath expression description : string [0..1] Compartment Consistency Rules compartment [0..*] Additional links from Potential target resource for the link node [0..*] Potential target for the link Compartment Consistency Rules target compartment [0..*] Links this graph makes rules about link [0..*]

XML Template

<GraphDefinition xmlns="http://hl7.org/fhir"> doco
 <!-- from Resource: id, meta, implicitRules, and language -->
 <!-- from DomainResource: text, contained, extension, and modifierExtension -->
 <

 <url value="[uri]"/><!-- 0..1 Canonical identifier for this graph definition, represented as a URI (globally unique) -->

 <version value="[string]"/><!-- 0..1 Business version of the graph definition -->
 <

 <versionAlgorithm[x]><!-- 0..1 string|Coding How to compare versions --></versionAlgorithm[x]>
 <name value="[string]"/><!-- I 1..1 Name for this graph definition (computer friendly) -->
 <title value="[string]"/><!-- 0..1 Name for this graph definition (human friendly) -->

 <status value="[code]"/><!-- 1..1 draft | active | retired | unknown -->
 <experimental value="[boolean]"/><!-- 0..1 For testing purposes, not real usage -->
 <
 <

 <date value="[dateTime]"/><!-- 0..1 Date last changed -->
 <publisher value="[string]"/><!-- 0..1 Name of the publisher/steward (organization or individual) -->

 <contact><!-- 0..* ContactDetail Contact details for the publisher --></contact>
 <description value="[markdown]"/><!-- 0..1 Natural language description of the graph definition -->
 <useContext><!-- 0..* UsageContext The context that the content is intended to support --></useContext>
 <jurisdiction><!-- 0..* CodeableConcept Intended jurisdiction for graph definition (if applicable) --></jurisdiction>
 <purpose value="[markdown]"/><!-- 0..1 Why this graph definition is defined -->
 <
 <</profile>

 <start value="[id]"/><!-- 0..1 Starting Node -->
 <node>  <!-- 0..* Potential target for the link -->
  <nodeId value="[id]"/><!-- 1..1 Internal ID - target for link references -->
  <description value="[string]"/><!-- 0..1 Why this node is specified -->
  <type value="[code]"/><!-- 1..1 Type of resource this link refers to -->
  <profile><!-- 0..1 canonical(StructureDefinition) Profile for the target resource --></profile>
 </node>

 <link>  <!-- 0..* Links this graph makes rules about -->
  <
  <

  <description value="[string]"/><!-- 0..1 Why this link is specified -->

  <min value="[integer]"/><!-- 0..1 Minimum occurrences for this link -->
  <max value="[string]"/><!-- 0..1 Maximum occurrences for this link -->
  <
  <
   <
   <
   <</profile>
   <
    <
    <
    <
    <
    <
   </compartment>
   <</link>
  </target>

  <sourceId value="[id]"/><!-- 1..1 Source Node for this link -->
  <path value="[string]"/><!-- 0..1 Path in the resource that contains the link -->
  <sliceName value="[string]"/><!-- 0..1 Which slice (if profiled) -->
  <targetId value="[id]"/><!-- 1..1 Target Node for this link -->
  <params value="[string]"/><!-- 0..1 Criteria for reverse lookup -->
  <compartment>  <!-- 0..* Compartment Consistency Rules -->
   <use value="[code]"/><!-- 1..1 where | requires -->
   <rule value="[code]"/><!-- 1..1 identical | matching | different | custom -->
   <code value="[code]"/><!-- 1..1 Patient | Encounter | RelatedPerson | Practitioner | Device -->
   <expression value="[string]"/><!-- 0..1 Custom rule, as a FHIRPath expression -->
   <description value="[string]"/><!-- 0..1 Documentation for FHIRPath expression -->
  </compartment>

 </link>
</GraphDefinition>

JSON Template

{doco
  "resourceType" : "GraphDefinition",
  // from Resource: id, meta, implicitRules, and language
  // from DomainResource: text, contained, extension, and modifierExtension
  "

  "url" : "<uri>", // Canonical identifier for this graph definition, represented as a URI (globally unique)

  "version" : "<string>", // Business version of the graph definition
  "

  // versionAlgorithm[x]: How to compare versions. One of these 2:
  "versionAlgorithmString" : "<string>",
  "versionAlgorithmCoding" : { Coding },
  "name" : "<string>", // I R!  Name for this graph definition (computer friendly)
  "title" : "<string>", // Name for this graph definition (human friendly)

  "status" : "<code>", // R!  draft | active | retired | unknown
  "experimental" : <boolean>, // For testing purposes, not real usage
  "
  "

  "date" : "<dateTime>", // Date last changed
  "publisher" : "<string>", // Name of the publisher/steward (organization or individual)

  "contact" : [{ ContactDetail }], // Contact details for the publisher
  "description" : "<markdown>", // Natural language description of the graph definition
  "useContext" : [{ UsageContext }], // The context that the content is intended to support
  "jurisdiction" : [{ CodeableConcept }], // Intended jurisdiction for graph definition (if applicable)
  "purpose" : "<markdown>", // Why this graph definition is defined
  "
  "

  "start" : "<id>", // Starting Node
  "node" : [{ // Potential target for the link
    "nodeId" : "<id>", // R!  Internal ID - target for link references
    "description" : "<string>", // Why this node is specified
    "type" : "<code>", // R!  Type of resource this link refers to
    "profile" : "<canonical(StructureDefinition)>" // Profile for the target resource
  }],

  "link" : [{ // Links this graph makes rules about
    "
    "

    "description" : "<string>", // Why this link is specified

    "min" : <integer>, // Minimum occurrences for this link
    "max" : "<string>", // Maximum occurrences for this link
    "
    "
      "
      "
      "
      "
        "
        "
        "
        "
        "
      }],
      "

    "sourceId" : "<id>", // R!  Source Node for this link
    "path" : "<string>", // Path in the resource that contains the link
    "sliceName" : "<string>", // Which slice (if profiled)
    "targetId" : "<id>", // R!  Target Node for this link
    "params" : "<string>", // Criteria for reverse lookup
    "compartment" : [{ // Compartment Consistency Rules
      "use" : "<code>", // R!  where | requires
      "rule" : "<code>", // R!  identical | matching | different | custom
      "code" : "<code>", // R!  Patient | Encounter | RelatedPerson | Practitioner | Device
      "expression" : "<string>", // Custom rule, as a FHIRPath expression
      "description" : "<string>" // Documentation for FHIRPath expression

    }]
  }]
}

Turtle Template

@prefix fhir: <http://hl7.org/fhir/> .doco


[ a fhir:GraphDefinition;
  fhir:nodeRole fhir:treeRoot; # if this is the parser root

  # from Resource: .id, .meta, .implicitRules, and .language
  # from DomainResource: .text, .contained, .extension, and .modifierExtension
  fhir:

  fhir:GraphDefinition.url [ uri ]; # 0..1 Canonical identifier for this graph definition, represented as a URI (globally unique)

  fhir:GraphDefinition.version [ string ]; # 0..1 Business version of the graph definition
  fhir:

  # GraphDefinition.versionAlgorithm[x] : 0..1 How to compare versions. One of these 2
    fhir:GraphDefinition.versionAlgorithmString [ string ]
    fhir:GraphDefinition.versionAlgorithmCoding [ Coding ]
  fhir:GraphDefinition.name [ string ]; # 1..1 I Name for this graph definition (computer friendly)
  fhir:GraphDefinition.title [ string ]; # 0..1 Name for this graph definition (human friendly)

  fhir:GraphDefinition.status [ code ]; # 1..1 draft | active | retired | unknown
  fhir:GraphDefinition.experimental [ boolean ]; # 0..1 For testing purposes, not real usage
  fhir:
  fhir:

  fhir:GraphDefinition.date [ dateTime ]; # 0..1 Date last changed
  fhir:GraphDefinition.publisher [ string ]; # 0..1 Name of the publisher/steward (organization or individual)

  fhir:GraphDefinition.contact [ ContactDetail ], ... ; # 0..* Contact details for the publisher
  fhir:GraphDefinition.description [ markdown ]; # 0..1 Natural language description of the graph definition
  fhir:GraphDefinition.useContext [ UsageContext ], ... ; # 0..* The context that the content is intended to support
  fhir:GraphDefinition.jurisdiction [ CodeableConcept ], ... ; # 0..* Intended jurisdiction for graph definition (if applicable)
  fhir:GraphDefinition.purpose [ markdown ]; # 0..1 Why this graph definition is defined
  fhir:
  fhir:

  fhir:GraphDefinition.start [ id ]; # 0..1 Starting Node
  fhir:GraphDefinition.node [ # 0..* Potential target for the link
    fhir:GraphDefinition.node.nodeId [ id ]; # 1..1 Internal ID - target for link references
    fhir:GraphDefinition.node.description [ string ]; # 0..1 Why this node is specified
    fhir:GraphDefinition.node.type [ code ]; # 1..1 Type of resource this link refers to
    fhir:GraphDefinition.node.profile [ canonical(StructureDefinition) ]; # 0..1 Profile for the target resource
  ], ...;

  fhir:GraphDefinition.link [ # 0..* Links this graph makes rules about
    fhir:
    fhir:

    fhir:GraphDefinition.link.description [ string ]; # 0..1 Why this link is specified

    fhir:GraphDefinition.link.min [ integer ]; # 0..1 Minimum occurrences for this link
    fhir:GraphDefinition.link.max [ string ]; # 0..1 Maximum occurrences for this link
    fhir:
    fhir:
      fhir:
      fhir:
      fhir:
      fhir:
        fhir:
        fhir:
        fhir:
        fhir:
        fhir:
      ], ...;
      fhir:

    fhir:GraphDefinition.link.sourceId [ id ]; # 1..1 Source Node for this link
    fhir:GraphDefinition.link.path [ string ]; # 0..1 Path in the resource that contains the link
    fhir:GraphDefinition.link.sliceName [ string ]; # 0..1 Which slice (if profiled)
    fhir:GraphDefinition.link.targetId [ id ]; # 1..1 Target Node for this link
    fhir:GraphDefinition.link.params [ string ]; # 0..1 Criteria for reverse lookup
    fhir:GraphDefinition.link.compartment [ # 0..* Compartment Consistency Rules
      fhir:GraphDefinition.link.compartment.use [ code ]; # 1..1 where | requires
      fhir:GraphDefinition.link.compartment.rule [ code ]; # 1..1 identical | matching | different | custom
      fhir:GraphDefinition.link.compartment.code [ code ]; # 1..1 Patient | Encounter | RelatedPerson | Practitioner | Device
      fhir:GraphDefinition.link.compartment.expression [ string ]; # 0..1 Custom rule, as a FHIRPath expression
      fhir:GraphDefinition.link.compartment.description [ string ]; # 0..1 Documentation for FHIRPath expression

    ], ...;
  ], ...;
]

Changes since Release 4

GraphDefinition
GraphDefinition.versionAlgorithm[x]
  • No Changes Added Element
GraphDefinition.title
  • Added Element
GraphDefinition.start
  • Min Cardinality changed from 1 to 0
  • Type changed from code to id
  • Remove Binding http://hl7.org/fhir/ValueSet/resource-types|4.0.0 (required)
  • Remove Binding http://hl7.org/fhir/ValueSet/resource-types|4.0.0 (required)
GraphDefinition.node
  • Added Element
GraphDefinition.node.nodeId
  • Added Mandatory Element
GraphDefinition.node.description
  • Added Element
GraphDefinition.node.type
  • Added Mandatory Element
GraphDefinition.node.profile
  • Added Element
GraphDefinition.link.sourceId
  • Added Mandatory Element
GraphDefinition.link.targetId
  • Added Mandatory Element
GraphDefinition.link.params
  • Added Element
GraphDefinition.link.compartment
  • Added Element
GraphDefinition.link.compartment.use
  • Added Mandatory Element
GraphDefinition.link.compartment.rule
  • Added Mandatory Element
GraphDefinition.link.compartment.code
  • Added Mandatory Element
GraphDefinition.link.compartment.expression
  • Added Element
GraphDefinition.link.compartment.description
  • Added Element
GraphDefinition.profile
  • deleted
GraphDefinition.link.target
  • deleted

See the Full Difference for further information

This analysis is available as XML or JSON .

Conversions between R3 and R4 See R3 <--> R4 Conversion Maps (status = 1 test that all execute ok. All tests pass round-trip testing and 1 r3 resources are invalid (0 errors). )

 

See the Profiles & Extensions and the alternate Additional definitions: Master Definition XML + JSON , XML Schema / Schematron + JSON Schema , ShEx (for Turtle ) + see , the extensions spreadsheet version & the dependency analysis

GraphDefinition.status GraphDefinition.jurisdiction GraphDefinition.start GraphDefinition.link.target.type GraphDefinition.link.target.compartment.code GraphDefinition.link.target.compartment.rule
Path Definition Type Reference
GraphDefinition.versionAlgorithm[x]

Indicates the mechanism used to compare versions to determine which is more current.

Required Extensible PublicationStatus VersionAlgorithm
GraphDefinition.status

The lifecycle status of an artifact.

Extensible Required Jurisdiction ValueSet PublicationStatus
GraphDefinition.jurisdiction

This value set defines a base set of codes for country, country subdivision and region for indicating where a resource is intended to be used.

Note: The codes for countries and country subdivisions are taken from ISO 3166 icon while the codes for "supra-national" regions are from UN Standard country or area codes for statistical use (M49) icon.

Required Extensible ResourceType JurisdictionValueSet
GraphDefinition.node.type

All fhir data types (including abstract resources)

Required ResourceType AllResourceTypes
GraphDefinition.link.target.compartment.use GraphDefinition.link.compartment.use

Defines how a compartment rule is used.

Required GraphCompartmentUse
GraphDefinition.link.compartment.rule

How a compartment must be linked.

Required CompartmentType GraphCompartmentRule
GraphDefinition.link.compartment.code

Which type a compartment definition describes.

Required GraphCompartmentRule CompartmentType

id UniqueKey Level Location Description Expression
gdf-0 img  cnl-0 Warning (base) Name should be usable as an identifier for the module by machine processing applications such as code generation name.exists() implies name.matches('[A-Z]([A-Za-z0-9_]){0,254}') name.matches('[A-Z]([A-Za-z0-9_]){1,254}')
img  cnl-1 Warning GraphDefinition.url URL should not contain | or # - these characters make processing canonical references problematic url.matches('([^|#])*')

The GraphDefinition resource can be used to:

  • Summarize a set of profiles on resources
  • Define a graph of resources to return in a query
  • Define a graph of resources to include in a document
  • Document rules about the relationship between a set of resources e.g. must all resources concern the same patient?

FHIR resources are relatively granular. In many/most cases, many resources are needed to handle any particular task. A typical example of this is a complex diagnostic report: it will start with a DiagnosticReport, which will link to a set of panels (Observation resources), each of which link to a set of Observation resources for atomic data items.

One way to represent this is to profile each of the resources, creating hundreds of profiles, and then leave it to the user to infer the overall pattern of the report from the detailed profiles for each observation in the report. But it's not easy to see the forest for the trees. A GraphDefinition can summarize the overall picture and present a summary to the user.

Here's an example icon of the kind of summary this represents. (Todo: make this an actual graph definition, and clone into the main spec)

As another example of using many resources, to completely represent a medication dispense, an application needs not only the MedicationDispense resource, but also resources to represent the patient, provider, organizations, and the associated prescription.

A client can retrieve a single resource:

  GET [base]/MedicationDispense/example

Then, when it reads the returned resource, it can fetch the referenced resources:

  GET [base]/Patient/example
  GET [base]/Practitioner/example
  GET [base]/MedicationRequest/example
  ... etc.

This is a very inefficient way to retrieve all the required resources. An alternative approach is to do a search, and _include the required resources:

  GET [base]/MedicationDispense?_id=example
    &_include=MedicationDispense:authorizingPrescription
    &_include=MedicationDispense:subject

But scaling this approach to fetch a full package with its dependencies becomes increasingly difficult as the package gets deeper. A graph definition can be used instead to inform the server what to return with the resource using the $graph operation :

  GET [base]/MedicationDispense/example/$graph?graph=med-package

This is a request to return a graph of resource, using the graph definition 'med-package'. In this case, the graph definition would look approximately like this:

MedicationDispense
  .subject
  .context
  .performer.actor
  .authorizingPrescription
     .requester.agent 
  .substitution.responsibleParty

Systems may either provide a pre-defined list of graph definitions that clients may choose from, or allow clients to define their own GraphDefinition resources and then refer to them.

Server may also allow clients also pass in their own graph definition using a text representation:

  GET [base]/MedicationDispense/example/$graph?definition=Patient{managingOrganization:Organization{endpoint:Endpoint}}

See below for further details.

A very similar issue applies when building a document using the $document operation . A document must include all the resources linked directly from the composition, but whether to include additional linked resources is at the discretion of the document author. How does the user inform the $document operation which linked resources to include? One option is a boolean flag for including all linked data, but this may be extensive - up to an entire patient record - and may include resources that are not desired.

An operation can use a graph definition as a parameter to the $document operation:

GET [base]/Composition/example/$document?graph=example

This tells the server to include the graph of resources defined in the example GraphDefinition - in this case, any resources referred to from lists, when the section content is a list. Alternatively, servers may allow a client to pass in a definition directly (as shown above) using the parameter definition .

One important question about the use of resources is cross-resource consistency. For example, if an Observation refers to both a Patient and Encounter, does the Encounter have to refer to the same patient?

In general, the answer to this is that it usually should - the record needs to be consistent. However there are edge cases where the references may differ. For example, with regard to patient references, they may differ for:

  • Health Records concerning mother and baby
  • Organ Transplants
  • Counselling, particularly family counselling

Other reasons for the references to differ - mixing records about the same patient from different servers, or specific records about patients mixed with records about groups of patients (particularly common in veterinarian care).

The GraphDefinition resource allows for compartment consistency rules to be made regarding the links between resources. For each link in the graph, the graph definition can make a rule about the compartment consistency. The rule can specify one of the following consistencies:

Code Meaning
identical The compartment must be identical (the same literal reference)
matching The compartment must be the same - the record must be about the same patient, but the reference may be different
different The compartment must be different
custom The compartment rule is defined in the accompanying FHIRPath expression

Todo: how would this be validated? - where is the graph referred to?

GraphDefinition can walk a graph forward through the links, which is the natural order. As an example, consider a profile on composition that wants to specify that the graph follows the section entry into a list:

    <!-- 
      starting from a Composition...
    -->

<!-- this graph starts with a composition. We don't care what the specific profile is
     (though the statement above 'this case doesn't cross patients' implies that we do care a little) -->
  <start value="composition1"/>
  
  <node>
    <nodeId value="composition1"/>
    <description value="The base composition"/>
    <type value="Composition"/>
    <profile value="http://hl7.org/fhir/StructureDefinition/clinicaldocument"/>
  </node>
  <node>
    <nodeId value="list1"/>
    <description value="A list resource that a section entry reference points to"/>
    <type value="List"/>
  </node>
  <node>
    <nodeId value="resN"/>
    <description value="Generic resource that's the target of a list reference"/>
    <type value="Resource"/>
  </node>

  <!-- define the section -> list link -->

  <link>
    <description value="Link from Composition.section to list"/>
    <sourceId value="composition1"/>
    <!-- any section entry. Todo: this recurses; are we profiling this at all levels? --> 
    <path value="Composition.section.entry"/>

    <!-- 
      follow and Composition.section.entry that refers to a list

      one target. This graph is not making rules about the content of the section entries - that
      would be done in a profile. it's just saying, if you see a reference to a list in a section
      entry, these are the rules that describe the graph

    -->
    <path value="Composition.section.entry"/>
    <target>
      <type value="List"/>      
      <!-- and inside this list, follow any items -->
      <link>
        <path value="List.entry.item"/>
        <target>
          <type value="Resource"/> 
        </target>
      </link>      
    </target>
  </link>

    <targetId value="list1"/>
  </link>    

  <!-- and from the list, any references -->
  <link>
    <description value="Include any list entries"/>
    <sourceId value="list1"/>
    <path value="List.entry.item"/>
    <targetId value="resN"/>
  </link>      

The pattern can be extended to require that the none of the resources in this little graph reference a different patient - that is, it is a requirement when traversing the links that the patient compartment remain identical:

  <!-- define the section -> list link -->

  <link>
    <description value="Link from Composition.section to list"/>
    <sourceId value="composition1"/>
    <!-- any section entry. Todo: this recurses; are we profiling this at all levels? --> 

    <path value="Composition.section.entry"/>
    <target>
      <type value="List"/>      
        <compartment>
          <use value="requirement"/>
          <code value="Patient"/>
          <rule value="identical"/>
        </compartment>
      </target>
      <link>
        <path value="List.entry.item"/>
        <description value="Include any list entries"/>
        <target>
          <type value="Resource"/> 
          <compartment>
            <use value="requirement"/>
            <code value="Patient"/>
            <rule value="identical"/>
          </compartment>
        </target>
      </link>      
    </target>

    <!-- 
      one target. This graph is not making rules about the content of the section entries - that
      would be done in a profile. it's just saying, if you see a reference to a list in a section
      entry, these are the rules that describe the graph
    -->
    <targetId value="list1"/>
    <compartment>
      <use value="requirement"/>
      <code value="Patient"/>
      <rule value="identical"/>
    </compartment>
  </link>    

  <!-- and from the list, any references -->
  <link>
    <description value="Include any list entries"/>
    <sourceId value="list1"/>
    <path value="List.entry.item"/>
    <targetId value="resN"/>
    <compartment>
      <use value="requirement"/>
      <code value="Patient"/>
      <rule value="identical"/>
    </compartment>

  </link>

Another useful approach is to walk any link * (e.g. wildcard support):

  <link>
    <sourceId value="comp1">

    <!-- 
      follow all links that refers to a list
    -->
    <path value="*"/>
    <target>
      <type value="List"/>      
      <!-- and inside this list, follow any references -->
      <link>
        <path value="*"/>
        <target>
          <type value="Resource"/> 
        </target>
      </link>      
    </target>

    <targetId value="list1">

  </link>
  <!-- and inside this list, follow any references -->
  <link>
    <sourceId value="list1">
    <path value="*"/>
    <targetId value="resN"/>
  </link>      

or you can follow any links in any resource:

  <link>
    <!-- 
      follow all links 
    -->
    <path value="*"/>
    <target>
      <type value="Resource"/>      
      <!-- and inside the target, follow any links -->
      <link>
        <path value="*"/>
        <target>
          <type value="Resource"/> 
        </target>
      </link>      
    </target>

    <targetid value="resN"/>

  </link>

It's also possible to build a graph by walking links in reverse. This technique is useful, for example, when including provenance resources in a document:

  <link>
    <sourceId value="obs1"/>

    <!-- if the path is missing <path value=""/> -->
    <target>
      <!-- 
        any provenance
      -->
      <type value="Provenance"/>
      <!--
        and specify the search parameters to include 
        all the provenances that refer to this resource
      -->
      <params value="target={ref}"/>      
    </target>

    <targetId value="prov"/>  <!-- any provenance -->
    <!--
      and specify the search parameters to include 
      all the provenances that refer to this resource
    -->
    <params value="target={ref}"/>      

  </link>

For convenience, a graph definition may be represented using a text short hand form, loosely based on the graphQL language . form. A graph definition is introduced by two or more node statements:


node start comp1 'The base composition' = Composition (http://hl7.org/fhir/StructureDefinition/clinicaldocument);
node list1 'A list resource that a section entry reference points to' = List;
node resN 'Generic resource that's the target of a list reference' = Resource;

Each node declaration starts with the name of the Resource ( fixed word GraphDefinition.start , node followed by an optional profile in parentheses ( the nodeId, the node description, GraphDefinition.profile = , then the node type, and then, if the node has a group profile, the profile value in brackets. One of links, surrounded by { and } : the nodes have the key word "start"

Patient(http://hl7.org/fhir/us/core/Patient) { }

Between Once all the brackets nodes are one or more declared, then the links ( GraphDefinition.link ), separated by commas. Links statements can either be path-based look ups, or a search to perform a reverse lookup: are declared:

Patient { 
  managingOrganization : Organization,
  generalPractitioner : Practitioner,
  search Observation?patient={ref}
}

link 'Link from Composition.section to list' = comp1[Composition.section.entry] -> list1 requires identical patient;
link 'Include any list entries' = list1[List.entry.item] -> resN requires identical patient;

The format for a path-based look up link is:

  [path] cardinality [min]..[max] '[description]' : [ResoureType rules]

link '{description}' {min}..{max} = sourceId[{path}:{sliceName}] {targetId}?{params} {resource-compartment-rules};

where:

  • path = GraphDefinition.link.path cardinality [min]..[max] is optional, and min = GraphDefinition.link.min description, min, max, path, sliceName, params and max = GraphDefinition.link.max resource-type-rules are all optional
  • description resource-compartment-rules is optional, present if there's a compartent, and = GraphDefinition.link.description The resource type rules statement consists of one or more of the following, separated by ; characters: [ResourceType] (profile) where: ResourceType = GraphDefinition.link.target.type profile is optional, and = GraphDefinition.link.target.profile description syntax is optional, and = GraphDefinition.link.description In addition, {use} {rule} {code}. If the resource type rule may be followed by a links section, surrounded by {} , with the content as described above. Search statements for reverse look ups have a slightly different format: Patient{ search [ResourceType]?[params] cardinality [min]..[max] '[description]' } where: ResourceType = GraphDefinition.link.target.type params = GraphDefinition.link.target.params cardinality [min]..[max] is optional, and min = GraphDefinition.link.min and max = GraphDefinition.link.max description 'custom' then the syntax is optional, and = GraphDefinition.link.description '=' '{fhirpath}' '{description}'

In this format, the amount of whitespace, and its form, is irrelevant. For the purposes of clarity, the examples statements here are laid out on different lines, but this is not required. When a GraphDefinition is used as a parameter in a url, no extra whitespace is used. used, just a single space, and the descriptions SHOULD be omitted.

Here is a full example that uses all the features of the syntax:

node pat = Patient;
node org = Organization;
node org2 = Organization;
node ept = EndPoint;
node prac = Practitioner;
node grp = Group;


Patient(http://hl7.org/fhir/us/core/Patient) { 
  managingOrganization cardinality 0..1 'description of item' : 
    Organization(http://hl7.org/fhir/us/core/Organization) { 
      endpoint : Endpoint 
    };
    Basic;
    Group { 
      item : Patient 
    },
  generalPractitioner : Organization,
  search Observation?patient={ref} cardinality 0..10 'Observations for the patient' {
    performer : Practitioner,
    related.where(type='has-member').target : Observation require matching Patient,
    related.where(type='derived-from').target : Observation where identical Patient,
    related.where(type='sequel-to').target : Observation where different Patient,
    related.where(type='qualified-by').target : Observation where custom Patient = path
  }
}

link 'patient managing org' 0..1 = pat[managingOrganization] -> org;
link = org[endpoint] -> ept
link 'groups patient is in' = pat -> grp?item={ref}
link 'registered GP' = pat[generalPractitioner] -> org;
link 'Observations for the patient' = pat -> org?patient={ref};
link = org[performer] -> prac;
link = org[related.where(type='has-member').target] -> org2 requires matching Patient;
link = org[related.where(type='derived-from').target] -> org2 requires identical Patient;
link = org[related.where(type='sequel-to').target] -> org2 requires different Organization;
link = org[related.where(type='qualified-by').target] -> org2 requires custom Patient = path;

Search parameters for this resource. The common parameters also apply. See Searching for more information about searching in REST, messaging, and services.

Name Type Description Expression In Common
context token A use context assigned to the graph definition (GraphDefinition.useContext.value as CodeableConcept) 30 Resources
context-quantity quantity A quantity- or range-valued use context assigned to the graph definition (GraphDefinition.useContext.value as Quantity) | (GraphDefinition.useContext.value as Range) 30 Resources
context-type token A type of use context assigned to the graph definition GraphDefinition.useContext.code 30 Resources
context-type-quantity composite A use context type and quantity- or range-based value assigned to the graph definition On GraphDefinition.useContext:
  context-type: code
  context-quantity: value.as(Quantity) value.ofType(Quantity) | value.as(Range) value.ofType(Range)
30 Resources
context-type-value composite A use context type and value assigned to the graph definition On GraphDefinition.useContext:
  context-type: code
  context: value.as(CodeableConcept) value.ofType(CodeableConcept)
30 Resources
date date The graph definition publication date GraphDefinition.date 30 Resources
description string The description of the graph definition GraphDefinition.description 28 Resources
jurisdiction token Intended jurisdiction for the graph definition GraphDefinition.jurisdiction 26 Resources
name string Computationally friendly name of the graph definition GraphDefinition.name 26 Resources
publisher string Name of the publisher of the graph definition GraphDefinition.publisher 30 Resources
start token Type of resource at which the graph starts GraphDefinition.start
status token The current status of the graph definition GraphDefinition.status 34 Resources
url uri The uri that identifies the graph definition GraphDefinition.url 33 Resources
version token The business version of the graph definition GraphDefinition.version 30 Resources