Current Build

2.28 Base Resource Definitions

http://www.hl7.org/Special/committees/fiwg/index.cfmMaturity Level: 5 Normative Compartments: Not linked to any defined compartments

Normative Candidate Note: This page is candidate normative content for R4 in the Infrastructure Package. Once normative, it will lose it's Maturity Level, and breaking changes will no longer be made.

This specification defines a series of different types of resource that can be used to exchange and/or store data in order to solve a wide range of healthcare related problems, both clinical and administrative. In addition, this specification defines several different ways of exchanging the resources.

A resource is an entity that:

  • has a known identity (a URL) by which it can be addressed
  • identifies itself as one of the types of resource defined in this specification
  • contains a set of structured data items as described by the definition of the resource type
  • has an identified version that changes if the contents of the resource change

Resources have multiple representations.

The following optional elements and properties are defined for all resources:

  • An identity
  • Meta data
  • A base language
  • A reference to "Implicit Rules"

Most resources are derived from Domain Resources - so they also can contain text, contained resources, extensions, and data elements specific to the particular domain of the resource. There is a special type of resource called Bundle for collections of resources.

Note: there is documentation for the Structure, UML, XML, and JSON representations of the resource structure.

Structure

NameFlagsCard.TypeDescription & Constraintsdoco
.. Resource n/aBase Resource
... id Σ0..1idLogical id of this artifact
... meta Σ0..1MetaMetadata about the resource
... implicitRules ?!Σ0..1uriA set of rules under which this content was created
... language 0..1codeLanguage of the resource content
Common Languages (Extensible but limited to All Languages)

doco Documentation for this format

XML Template

<[name] xmlns="http://hl7.org/fhir"> doco
 <!-- from Element: extension -->
 <id value="[id]"/><!-- 0..1 Logical id of this artifact -->
 <meta><!-- 0..1 Meta Metadata about the resource --></meta>
 <implicitRules value="[uri]"/><!-- 0..1 A set of rules under which this content was created -->
 <language value="[code]"/><!-- 0..1 Language of the resource content -->
</[name]>

Turtle Template

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

[
 # from Element: Element.extension
  fhir:Resource.id [ id ]; # 0..1 Logical id of this artifact
  fhir:Resource.meta [ Meta ]; # 0..1 Metadata about the resource
  fhir:Resource.implicitRules [ uri ]; # 0..1 A set of rules under which this content was created
  fhir:Resource.language [ code ]; # 0..1 Language of the resource content
]

Structure

NameFlagsCard.TypeDescription & Constraintsdoco
.. Resource n/aBase Resource
... id Σ0..1idLogical id of this artifact
... meta Σ0..1MetaMetadata about the resource
... implicitRules ?!Σ0..1uriA set of rules under which this content was created
... language 0..1codeLanguage of the resource content
Common Languages (Extensible but limited to All Languages)

doco Documentation for this format

XML Template

<[name] xmlns="http://hl7.org/fhir"> doco
 <!-- from Element: extension -->
 <id value="[id]"/><!-- 0..1 Logical id of this artifact -->
 <meta><!-- 0..1 Meta Metadata about the resource --></meta>
 <implicitRules value="[uri]"/><!-- 0..1 A set of rules under which this content was created -->
 <language value="[code]"/><!-- 0..1 Language of the resource content -->
</[name]>

Turtle Template

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

[
 # from Element: Element.extension
  fhir:Resource.id [ id ]; # 0..1 Logical id of this artifact
  fhir:Resource.meta [ Meta ]; # 0..1 Metadata about the resource
  fhir:Resource.implicitRules [ uri ]; # 0..1 A set of rules under which this content was created
  fhir:Resource.language [ code ]; # 0..1 Language of the resource content
]
PathDefinitionTypeReference
Resource.language A human language.Extensible, but limited to All LanguagesCommon Languages

Each resource has an "id" element which contains the logical identity of the resource assigned by the server responsible for storing it. Resources always have a known identity except for the special case when a new resource is being sent to a server to assign an identity (create interaction). The logical identity is unique within the space of all resources of the same type on the same server. Once assigned, the identity is never changed. Note that if the resource is copied to another server, the copy might not be able to retain the same logical identity.

The unique identifier of a resource instance is an absolute URI constructed from the server base address at which the instance is found, the resource type and the Logical ID, such as http://test.fhir.org/rest/Patient/123 (where 123 is the Logical Id). When the literal identity is an HTTP address, this address can generally be used to retrieve or manipulate the resource. Note that implementations SHOULD NOT assume that the identity of a resource is always resolvable to a literal server - it may be temporarily unavailable, or not available by policy (e.g. firewalls) or in some cases, it may not actually exist (e.g. use of resource outside a RESTful environment). Resources reference each other by their identity. These references are allowed to be absolute or relative (see Resource References for further discussion). Copying or moving resources from one server to another means that resources acquire a new identity. For further details, see Managing Resource Identity.

Logical ids (and therefore literal identities) are case sensitive. Logical Ids are always opaque, and external systems need not and should not attempt to determine their internal structure. A logical id SHALL always be represented in the same way in resource references and URLs. Ids can be up to 64 characters long, and contain any combination of upper and lowercase ASCII letters, numerals, "-" and ".".

In addition to the logical id and literal identity discussed above, many resources contain an element named "identifier", which, if populated, contains a different kind of identifier. As resources are copied from server to server, their literal identity will change, and their logical id may change.

However, all copies of the resource refer to the same underlying concept, and this concept may also be represented in other formats (variously, HL7 v2 , CDA , XDS, and many more). Each representation carries the same identifier that identifies it consistently across all contexts of use. This is known as the business identifier, and is found in the identifier element. In a few resources, there is a url element that serves a similar purpose, but is constrained to be a literal URL for implementation reasons.

All resources that have an identifier element support searching by the identifier, so that records can be located by that method. So if an HL7 v2 message has the following OBR:

OBR|1|845439^GHH OE|1045813^GHH LAB|1554-5^GLUCOSE^LN|||200202150730|...

Then the DiagnosticReport it represents can be located using the following query:

 GET [base]/DiagnosticReport?identifier=1045813

If a FHIR server is a stable server that is the canonical master source for the definition of a concept, the business identifier for all systems may be the same as the literal identity of the resource on the master server.

Each resource contains an element "meta", of type "Meta", which is a set of metadata that provides technical and workflow context to the resource. The metadata items are all optional, though some or all of them may be required in particular implementations or contexts of use.

Metadata Item Type Usage
versionId (0..1) id Changes each time the content of the resource changes. Can be referenced in a resource reference. Can be used to ensure that updates are based on the latest version of the resource.
The version can be globally unique, or scoped by the Logical Id of the resource. Version identifiers are generally either a serially incrementing id scoped by the logical id, or a uuid, though neither of these approaches is required. There is no fixed order for version ids - clients cannot assume that a versionId that comes after another one either numerically or alphabetically represents a later version. The same versionId can never be used for more than one version of the same resource.
Note that servers SHOULD support versions, but some are unable to
lastUpdated (0..1) instant If populated, this value changes each time the content of the resource changes. it can be used by a system or a human to judge the currency of the resource content. Note that version aware updates do not use this element
profile (0..*) uri An assertion that the content conforms to a resource profile (a StructureDefinition). See Extending and Restricting Resources for further discussion. Can be changed as profiles and value sets change or the system rechecks conformance
security (0..*) Coding Security labels applied to this resource. These tags connect resources in specific ways to the overall security policy and infrastructure. Security tags can be updated when the resource changes, or whenever the security sub-system chooses to
tag (0..*) Coding Tags applied to this resource. Tags are used to relate resources to process and workflow. Applications are not required to consider the tags when interpreting the meaning of a resource.

Structure

NameFlagsCard.TypeDescription & Constraintsdoco
.. Meta ΣElementMetadata about a resource
Elements defined in Ancestors: id, extension
... versionId Σ0..1idVersion specific identifier
... lastUpdated Σ0..1instantWhen the resource version last changed
... profile Σ0..*uriProfiles this resource claims to conform to
... source Σ0..1uriIdentifies where the resource comes from
... security Σ0..*CodingSecurity Labels applied to this resource
All Security Labels (Extensible)
... tag Σ0..*CodingTags applied to this resource
Common Tags (Example)

doco Documentation for this format

XML Template

<meta xmlns="http://hl7.org/fhir"> doco
 <!-- from Element: extension -->
 <versionId value="[id]"/><!-- 0..1 Version specific identifier -->
 <lastUpdated value="[instant]"/><!-- 0..1 When the resource version last changed -->
 <profile value="[uri]"/><!-- 0..* Profiles this resource claims to conform to -->
 <source value="[uri]"/><!-- 0..1 Identifies where the resource comes from -->
 <security><!-- 0..* Coding Security Labels applied to this resource --></security>
 <tag><!-- 0..* Coding Tags applied to this resource --></tag>
</meta>

Turtle Template


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

[
 # from Element: Element.extension
  fhir:Meta.versionId [ id ]; # 0..1 Version specific identifier
  fhir:Meta.lastUpdated [ instant ]; # 0..1 When the resource version last changed
  fhir:Meta.profile [ uri ], ... ; # 0..* Profiles this resource claims to conform to
  fhir:Meta.source [ uri ]; # 0..1 Identifies where the resource comes from
  fhir:Meta.security [ Coding ], ... ; # 0..* Security Labels applied to this resource
  fhir:Meta.tag [ Coding ], ... ; # 0..* Tags applied to this resource
]

Changes since DSTU2


Meta
Meta.source
  • Added Element

See the Full Difference for further information

Structure

NameFlagsCard.TypeDescription & Constraintsdoco
.. Meta ΣElementMetadata about a resource
Elements defined in Ancestors: id, extension
... versionId Σ0..1idVersion specific identifier
... lastUpdated Σ0..1instantWhen the resource version last changed
... profile Σ0..*uriProfiles this resource claims to conform to
... source Σ0..1uriIdentifies where the resource comes from
... security Σ0..*CodingSecurity Labels applied to this resource
All Security Labels (Extensible)
... tag Σ0..*CodingTags applied to this resource
Common Tags (Example)

doco Documentation for this format

XML Template

<meta xmlns="http://hl7.org/fhir"> doco
 <!-- from Element: extension -->
 <versionId value="[id]"/><!-- 0..1 Version specific identifier -->
 <lastUpdated value="[instant]"/><!-- 0..1 When the resource version last changed -->
 <profile value="[uri]"/><!-- 0..* Profiles this resource claims to conform to -->
 <source value="[uri]"/><!-- 0..1 Identifies where the resource comes from -->
 <security><!-- 0..* Coding Security Labels applied to this resource --></security>
 <tag><!-- 0..* Coding Tags applied to this resource --></tag>
</meta>

Turtle Template

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

[
 # from Element: Element.extension
  fhir:Meta.versionId [ id ]; # 0..1 Version specific identifier
  fhir:Meta.lastUpdated [ instant ]; # 0..1 When the resource version last changed
  fhir:Meta.profile [ uri ], ... ; # 0..* Profiles this resource claims to conform to
  fhir:Meta.source [ uri ]; # 0..1 Identifies where the resource comes from
  fhir:Meta.security [ Coding ], ... ; # 0..* Security Labels applied to this resource
  fhir:Meta.tag [ Coding ], ... ; # 0..* Tags applied to this resource
]

Changes since DSTU2

Meta
Meta.source
  • Added Element

See the Full Difference for further information

Note that the RESTful API defines some Operations that provide direct read and write access to the meta element.

All resources are conceptually versioned, and each resource sits at the head of a linear list of past versions. The past versions are superseded by the current version, and only available for audit/integrity purposes. The current version is e.g. http://acme.org/fhir/ResourceType/id123, and a past version would be http://acme.org/fhir/ResourceType/id123/_history/v2.

Note that there's no requirement for servers to keep a history. The history interaction is provided for where this is an appropriate service to provide. However, whether a server keeps them or not, past versions are dead and gone. The current version of the resource is in the Resource.meta.versionId. For a value set this would be:

<ValueSet>
  <meta>
    <versionId value="v2"/>
  </meta>
</ValueSet>

That version changes every time the server updates the resource and writes a new version over the top of an existing one.

Some resources have another version marker in them. For instance, ValueSet has another version in it:

<ValueSet>
  <url value="http://acme.com/fhir/ValueSet/example"/>
  <version value="2.0"/>
</ValueSet>

This says that this is version 2.0 of the 'example' value set. This is the business version of the value set, the one that humans get involved with. These 2 versions elements have quite different lifecycles. To illustrate, take these cases:

  1. A value set is posted to a server (POST [base]/ValueSet) with ValueSet.url = "http://acme.com/valuesets/example". This is identified as the 1st version of the value set (ValueSet.version = 1). When the server gets it, it assigns an identity e.g. ValueSet.id = x1, and ValueSet.meta.versionId = 1. Later, another user creates a revised version of the value set, and this is called version 2. It is committed to the server as an update (PUT [base]/ValueSet/x1).
    Now, ValueSet.url = http://acme.com/valuesets/example, ValueSet.id = x1, ValueSet.version = 2 and ValueSet.meta.versionId = 2
  2. A value set is posted to a server (POST [base]/ValueSet) with ValueSet.url = "http://acme.com/valuesets/example". This is identified as the 1st version of the value set (ValueSet.version = 1). When the server gets it, it assigns an identity e.g. ValueSet.id = x1, and ValueSet.meta.versionId = 1. Then a typo is found in the definition, so this is fixed, but it's still v1 of the value set. This is PUT to [base]/ValueSet/x1. Now, ValueSet.url = http://acme.com/valuesets/example, ValueSet.id = x1, ValueSet.version = 1 and ValueSet.meta.versionId = 2.
    Later, another user creates a revised version of the value set, and this is called version 2. It is commmited to the server as an update (PUT [base]/ValueSet/x1). Now, ValueSet.url = http://acme.com/valuesets/example, ValueSet.id = x1, ValueSet.version = 2 and ValueSet.meta.versionId = 3
  3. A value set is posted to a server (POST [base]/ValueSet) with ValueSet.url = "http://acme.com/valuesets/example". This is identified as the 1st version of the value set (ValueSet.version = 1). When the server gets it, it assigns an identity e.g. ValueSet.id = x1, and ValueSet.meta.versionId = 1. Later, another user creates a revised version of the value set, and this is called version 2. This time, as well as supporting this new version 2, there are production systems still using version 1, and both need to be valid on the value set server. So a new value set is created on the server (POST [base]/ValueSet) and is assigned the identiity 'x2'.
    Now, there are two different value sets, both with URL "http://acme.com/valuesets/example". One has ValueSet.id = x1, ValueSet.version = 1 and ValueSet.meta.versionId = 1 and the other has ValueSet.id = x2, ValueSet.version = 2 and ValueSet.meta.versionId = 1.

A reference to a custom agreement that describes how the resource is being used (e.g. an implementation guide) that was followed when the resource was constructed, where the implemenation guide must be known and understood in order to safely processing the content.

Asserting this rule set restricts the content to be only understood by a limited set of trading partners. This inherently limits the usefulness of the data in the long term, and should be avoided where possible. However, the existing health eco-system is highly fractured, and not yet ready to define, collect, and exchange data in a generally exchangeable sense.

Note that resources are almost always constructed following some custom agreement. Best practice - which is recommended through out the conformance resources - is that such agreements make all knowledge about the content of the resource explicit in the content of the resource (e.g. no default values in profiles); if custom agreements follow this advice, and declare their extensions as required, then it is not necessary to understand the agreement in order to safely process the resource content. For this reason, use of implicitRules is rare.

Each resource may have a language element that specifies the base language of the content using a code defined in BCP 47 . The language element is provided to support indexing and accessibility (e.g. text-to-speech use the language tag).

There is no default language, though one may be inferred from the context of use. Not all of the content of the resource has to be in the specified language.

If a language is specified, it should also be specified on the Narrative Text. The html language tag in the narrative is used when processing the narrative. The language tag on the resource is provided so that applications processing the data in the resource can specify the language of any alternate presentations generated from the data.

These 3 metadata attributes are part of the resource, but are never used to keep information that needs to be understood when interpreting the content of a resource; their function is limited to finding and controlling access to the resource, and connecting resources to technical or clinical workflow.

Tags are used to associate additional operational information with the Resources, including such as workflow management. A typical use of tagging would be to maintain an informal list of resources that need review.

In a general tag, the coded concept may be a reference to a healthcare vocabulary, including ones defined in this specification, or vocabularies such as those defined by HL7 for other purposes (e.g. HL7 v2 and HL7 v3 /CDA ), LOINC, or SNOMED CT. Alternatively, the concept may be one defined by the implementation in the local context.

The list of tags on a resource is a set, where each tag is unique based on the system+code combination.

A profile assertion represents a claim that the resource conforms to the identified StructureDefinition, which makes rules about what content is allowed to be in a resource. In a profile tag, the term is a URL that references an identified StructureDefinition resource.

It's always possible to determine whether a resource conforms to any profile simply by testing it against the profile (the validation tools provide the functionality to perform this test in a variety of contexts). However there are several circumstances where simply examining whether a resource conforms to a particular profile as needed is impractical:

  • A server searching a set of resources for ones that conform to a particular profile
  • A receiver that has many profiles to choose when validating resource

Profile Tags serve these use cases - a client/creator of a resource can tag the resource with an assertion that the resource conforms to a particular structure definition. The server/receiver of the resource can choose to take this assertion at face value, or to assist in locating the correct StructureDefinition against which to validate the resource.

Note: resources can conform to multiple profiles at once. A resource can conform to a profile without ever being labeled that it does, or a resource may falsely claim to conform to a profile. For this reason, applications processing resources SHOULD always depend on the contents of the resource when processing them, and/or check resources against the StructureDefinitions directly rather than relying the existence of profile tags for meaning. Profile Tags are provided as a method of finding resources that conform to a particular StructureDefinition, not statements of meaning about the resource.

Many trading partner agreements will make rules about what claims can be made and when they must be tested, which will make the profile assertion more reliable.

The list of profiles on a resource is a set, where each profile is unique based on the value of the URI.

A security label is attached to a resource to provide specific security metadata about the information in the resource. For further information, see Security Labels.

The list of security on a resource is a set, where each tag is unique based on the system+code combination.

When a resource is updated (e.g. on the RESTful interface), servers generally follow this pattern:

  • Merge existing and new tags
  • Replace existing profile tags with new profile tags
  • Merge existing and new security labels

However, in some cases, an update may invalidate existing tags. Servers may update or remove previously existing recognized tags if this is known to be appropriate.

The Maturity level documentation has moved.

Common search parameters defined by this resource. See Searching for more information about searching in REST, messaging, and services.

NameTypeDescriptionPaths
_contentstringSearch on the entire content of the resource
_idtokenLogical id of this artifactResource.id
_lastUpdateddateWhen the resource version last changedResource.meta.lastUpdated
_profileuriProfiles this resource claims to conform toResource.meta.profile
_querytokenA custom search profile that describes a specific defined query operation
_securitytokenSecurity Labels applied to this resourceResource.meta.security
_sourceuriIdentifies where the resource comes fromResource.meta.source
_tagtokenTags applied to this resourceResource.meta.tag