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
FHIR
Infrastructure
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:
There
is
a
close
relationship
between
Profiles
and
GraphDefinitions
:
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.
Structure
Name
|
Flags
|
Card.
|
Type
|
Description
&
Constraints
|
|---|---|---|---|---|
|
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 |
|
|
Σ 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 |
|
Σ | 0..1 | string |
Business
version
of
the
graph
definition
|
| Σ | 0..1 |
How
to
compare
versions
Version Algorithm ( Extensible ) | |
| string | |||
![]() ![]() ![]() | Coding | |||
![]() ![]() |
Σ C | 1..1 | string |
Name
for
this
graph
definition
(computer
friendly)
|
![]() ![]() |
Σ T |
|
string |
Name
for
this
graph
definition
|
|
?! Σ | 1..1 | code |
draft
|
active
|
retired
|
unknown
PublicationStatus ( Required ) |
|
Σ | 0..1 | boolean |
For
testing
purposes,
not
real
usage
|
|
Σ | 0..1 | dateTime |
Date
last
changed
|
|
Σ T | 0..1 | string |
Name
of
the
|
|
Σ | 0..* | ContactDetail |
Contact
details
for
the
publisher
|
|
T | 0..1 | markdown |
Natural
language
description
of
the
graph
definition
|
|
Σ | 0..* | UsageContext |
The
context
that
the
content
is
intended
to
support
|
|
Σ | 0..* | CodeableConcept |
Intended
jurisdiction
for
graph
definition
(if
applicable)
Jurisdiction ValueSet ( Extensible ) |
|
T | 0..1 | markdown |
Why
this
graph
definition
is
defined
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0..1 | string |
|
|
|
1..1 | code |
Type
of
resource
this
link
refers
to
All Resource Types ( Required ) | |
![]() ![]() ![]() | 0..1 | canonical ( StructureDefinition ) |
Profile
for
the
target
resource
| |
![]() ![]() | 0..* | BackboneElement |
|
|
|
0..1 |
|
|
|
|
0..1 |
|
|
|
|
0..1 | string |
|
|
|
|
|
|
|
|
|
|
|
|
|
0..1 | string |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1..1 | code |
|
|
|
1..1 | code |
identical
|
matching
|
different
|
custom
GraphCompartmentRule ( Required ) |
|
|
|
|
CompartmentType ( Required ) |
|
|
0..1 | string |
|
|
|
|
|
|
|
Documentation
for
this
format
|
||||
See the Extensions for this resource
UML Diagram ( Legend )
XML Template
<GraphDefinition xmlns="http://hl7.org/fhir"><!-- 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
{
"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/> .[ 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 definitionfhir:# 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 usagefhir: 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 definedfhir: 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 aboutfhir: 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 linkfhir: 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] |
|
| GraphDefinition.title |
|
| GraphDefinition.start |
|
| GraphDefinition.node |
|
| GraphDefinition.node.nodeId |
|
| GraphDefinition.node.description |
|
| GraphDefinition.node.type |
|
| GraphDefinition.node.profile |
|
| GraphDefinition.link.sourceId |
|
| GraphDefinition.link.targetId |
|
| GraphDefinition.link.params |
|
| GraphDefinition.link.compartment |
|
| GraphDefinition.link.compartment.use |
|
| GraphDefinition.link.compartment.rule |
|
| GraphDefinition.link.compartment.code |
|
| GraphDefinition.link.compartment.expression |
|
| GraphDefinition.link.compartment.description |
|
| GraphDefinition.profile |
|
| GraphDefinition.link.target |
|
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
Name
|
Flags
|
Card.
|
Type
|
Description
&
Constraints
|
|---|---|---|---|---|
|
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 |
|
|
Σ 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 |
|
Σ | 0..1 | string |
Business
version
of
the
graph
definition
|
| Σ | 0..1 |
How
to
compare
versions
Version Algorithm ( Extensible ) | |
| string | |||
![]() ![]() ![]() | Coding | |||
![]() ![]() |
Σ C | 1..1 | string |
Name
for
this
graph
definition
(computer
friendly)
|
![]() ![]() |
Σ T |
|
string |
Name
for
this
graph
definition
|
|
?! Σ | 1..1 | code |
draft
|
active
|
retired
|
unknown
PublicationStatus ( Required ) |
|
Σ | 0..1 | boolean |
For
testing
purposes,
not
real
usage
|
|
Σ | 0..1 | dateTime |
Date
last
changed
|
|
Σ T | 0..1 | string |
Name
of
the
|
|
Σ | 0..* | ContactDetail |
Contact
details
for
the
publisher
|
|
T | 0..1 | markdown |
Natural
language
description
of
the
graph
definition
|
|
Σ | 0..* | UsageContext |
The
context
that
the
content
is
intended
to
support
|
|
Σ | 0..* | CodeableConcept |
Intended
jurisdiction
for
graph
definition
(if
applicable)
Jurisdiction ValueSet ( Extensible ) |
|
T | 0..1 | markdown |
Why
this
graph
definition
is
defined
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0..1 | string |
|
|
|
1..1 | code |
Type
of
resource
this
link
refers
to
All Resource Types ( Required ) | |
![]() ![]() ![]() | 0..1 | canonical ( StructureDefinition ) |
Profile
for
the
target
resource
| |
![]() ![]() | 0..* | BackboneElement |
|
|
|
0..1 |
|
|
|
|
0..1 |
|
|
|
|
0..1 | string |
|
|
|
|
|
|
|
|
|
|
|
|
|
0..1 | string |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1..1 | code |
|
|
|
1..1 | code |
identical
|
matching
|
different
|
custom
GraphCompartmentRule ( Required ) |
|
|
|
|
CompartmentType ( Required ) |
|
|
0..1 | string |
|
|
|
|
|
|
|
Documentation
for
this
format
|
||||
See the Extensions for this resource
XML Template
<GraphDefinition xmlns="http://hl7.org/fhir"><!-- 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
{
"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/> .[ 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 definitionfhir:# 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 usagefhir: 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 definedfhir: 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 aboutfhir: 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 linkfhir: 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] |
|
| GraphDefinition.title |
|
| GraphDefinition.start |
|
| GraphDefinition.node |
|
| GraphDefinition.node.nodeId |
|
| GraphDefinition.node.description |
|
| GraphDefinition.node.type |
|
| GraphDefinition.node.profile |
|
| GraphDefinition.link.sourceId |
|
| GraphDefinition.link.targetId |
|
| GraphDefinition.link.params |
|
| GraphDefinition.link.compartment |
|
| GraphDefinition.link.compartment.use |
|
| GraphDefinition.link.compartment.rule |
|
| GraphDefinition.link.compartment.code |
|
| GraphDefinition.link.compartment.expression |
|
| GraphDefinition.link.compartment.description |
|
| GraphDefinition.profile |
|
| GraphDefinition.link.target |
|
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
| Path | Definition | Type | Reference |
|---|---|---|---|
| GraphDefinition.versionAlgorithm[x] |
Indicates the mechanism used to compare versions to determine which is more current. |
|
|
| GraphDefinition.status |
The lifecycle status of an artifact. |
|
|
| 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
|
|
|
| GraphDefinition.node.type |
All fhir data types (including abstract resources) |
Required |
|
|
|
Defines how a compartment rule is used. |
Required | GraphCompartmentUse |
| GraphDefinition.link.compartment.rule |
How a compartment must be linked. |
Required |
|
| GraphDefinition.link.compartment.code |
Which type a compartment definition describes. |
Required |
|
|
|
Level | Location | Description | Expression |
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
|
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:
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
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:
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 listone 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
followed
by
GraphDefinition.start
,
node
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"
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:
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: |
30 Resources |
| context-type-value | composite | A use context type and value assigned to the graph definition |
On
GraphDefinition.useContext:
context-type: code context: |
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 |