The CodeSystem resource is used to declare the existence of and describe a code system or code system supplement and its key properties, and optionally define a part or all of its content.
4.8.1 Scope and Usage
The FHIR terminology specification is based on the concepts of code system and value set originally defined in HL7 v3 Core Principles :
Code systems define which codes (symbols and/or expressions) exist, and how they are understood. Value sets
select a set of codes from one or more code systems to specify which codes can be used in a particular context.
The CodeSystem resource is used to declare the existence of a code system, and its key properties:
Identifying URL and version
Description, Copyright, publication date, and other metadata
Some key properties of the code system itself - e.g. whether it exhibits concept permanence, whether it defines a compositional grammar, and whether the codes that it defines are case sensitive
What filters can be used in value sets that use the code system in a ValueSet.compose element
What concept properties are defined by the code system
In addition, the CodeSystem resource may list some or all of the concepts in the code system, along with
their basic properties (code, display, definition), designations, and additional properties. Code
System resources may also be used to define supplements, which extend an existing code system with
additional designations and properties.
The CodeSystem resource is not intended to support the process of maintaining code systems.
Instead, the focus is on publishing the properties and optionally the content of a code
system for use throughout the FHIR eco-system, such as to support value set expansion and
validation.
Note that the important existing (large) code systems (SNOMED CT, LOINC, RxNorm, ICD family, etc.)
all have their own maintenance systems and distribution formats, and CodeSystem is generally
not an efficient way to distribute their content, though it is used as one way of
declaring the filters and properties associated with those code systems.
The system element in the Coding (i.e. Coding.system) refers to a CodeSystem resource instance by its canonical URL (i.e. CodeSystem.url)
The CodeSystem resource design is based, in part, on the code system functionality described in
the HL7 CTS 2 specification.
A CTS2 server can be used to maintain code systems which are then published using the CodeSystem resource
The CodeSystem resource documents the inherent structure and capabilities of code system, whereas
the TerminologyCapabilities resource documents what a server hosting the code system is capable of
The CodeSystem resource declares the existence of a code system and its key properties including its preferred identifier.
The NamingSystem resource identifies the existence of a code or identifier system, and its possible and preferred identifiers.
The key difference between the resources is who creates and manages them - CodeSystem resources are managed
by the owner or publisher of the code system, who can properly define the code system features and content.
NamingSystem resources, on the other hand, are frequently defined by 3rd parties that encounter the
code system in use, and need to describe the use, but do not have the authority to define the features and content.
Additionally, there may be multiple authoritative NamingSystem resources for a code system, but ideally there
would be only one authoritative CodeSystem resource (identified by its canonical URL) that is provided by the code system publisher, with multiple copies distributed on additional FHIR servers or elsewhere and used where needed.
Both Code System supplements and Concept Maps may be used to define relationships between concepts
in different systems. ConceptMaps are assertions of the relationships between different concepts
that are associated with particular contexts of use, while CodeSystem supplements are used to
define inherent properties and semantics of the concepts in the code system
4.8.3 Background and Context
When using code systems and value sets, proper differentiation between a code system and a value set is important.
This is one very common area where significant clinical safety risks occur in practice. Implementers
should be familiar with the content in Using Codes in Resources.
4.8.3.1 CodeSystem Identification
A code system has three identifiers. The first two can be used to reference the code system in the FHIR context:
CodeSystem.id: The logical id on the system that holds the CodeSystem resource instance - this typically is expected to change as the resource moves from server to server. The location URI is constructed by appending the logical id to the server base address where the instance is found and the resource type. This URI should be a resolvable URL by which the resource instance may be retrieved, usually from a FHIR server, and it may be a relative reference typically to the server base URL.
CodeSystem.url: The canonical URL that never changes for this code system - it is the same in every copy. The element is named url rather than uri for legacy reasons and to strongly encourage providing a resolvable URL as the identifier whenever possible. This canonical URL is used to refer to all instances of this particular code system across all servers and systems. Ideally, this URI should be a URL which resolves to the location of the master version of the code system, though this is not always possible.
For example, for CodeSystems that are part of the FHIR specification, CodeSystem.url is the url where the CodeSystem may be accessed in the FHIR specification. However, while a new version of the FHIR specification is being prepared, new code systems that are published in CI build versions will not be found in the released FHIR specification version.
The third code system identifier is used typically for external references to the code system outside of FHIR:
CodeSystem.identifier: A system/value pair that is used to identify the code system in other contexts (such as an OID in an HL7 v3 specification)
For further information regarding resource identification, see Resource Identity.
This means that each code system has 2 different URIs that can be used to reference it -
its canonical URL (the url element), and its local location from which it may be retrieved (which includes the id element).
Most references to code systems use the canonical URL because it is stable and does not change from one FHIR server instance to another.
Alternatively, the identifier and version elements may be used to reference this code system in a
design, a profile, a CDA template
or HL7 v3 message (in the CD data
type codeSystem and codeSystemVersion properties). These different contexts may make additional restrictions on the
possible values of these elements. The identifier is generally not needed when using code systems in
a FHIR context, where the canonical URL is always the focus.
Declares the existence of and describes a code system or code system supplement + Warning: Name should be usable as an identifier for the module by machine processing applications such as code generation + Rule: Within a code system definition, all the codes SHALL be unique + Warning: If there is an explicit hierarchy, a hierarchyMeaning should be provided + Warning: If there is an implicit hierarchy, a hierarchyMeaning should be provided + Rule: If the code system content = supplement, it must nominate what it's a supplement for + Guideline: caseSensitive SHOULD be provided
Canonical identifier for this code system, represented as a URI (globally unique) (Coding.system) + Warning: URL should not contain | or # - these characters make processing canonical references problematic
@prefix fhir: <http://hl7.org/fhir/> .
[ a fhir:CodeSystem;
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:url[ uri ] ; # 0..1 Canonical identifier for this code system, represented as a URI (globally unique) (Coding.system)
fhir:identifier ( [ Identifier ] ... ) ; # 0..* Additional identifier for the code system (business identifier)
fhir:version[ string ] ; # 0..1 Business version of the code system (Coding.version)
# versionAlgorithm[x]: 0..1 How to compare versions. One of these 2
fhir:versionAlgorithm[ a fhir:string ; string ]
fhir:versionAlgorithm[ a fhir:Coding ; Coding ]
fhir:name[ string ] ; # 0..1 IName for this code system (computer friendly)
fhir:title[ string ] ; # 0..1 Name for this code system (human friendly)
fhir:status[ code ] ; # 1..1 draft | active | retired | unknown
fhir:experimental[ boolean ] ; # 0..1 For testing only - never for real usage
fhir:date[ dateTime ] ; # 0..1 Date last changed
fhir:publisher[ string ] ; # 0..1 Name of the publisher/steward (organization or individual)
fhir:contact ( [ ContactDetail ] ... ) ; # 0..* Contact details for the publisher
fhir:description[ markdown ] ; # 0..1 Natural language description of the code system
fhir:useContext ( [ UsageContext ] ... ) ; # 0..* The context that the content is intended to support
fhir:jurisdiction ( [ CodeableConcept ] ... ) ; # 0..* Intended jurisdiction for code system (if applicable)
fhir:purpose[ markdown ] ; # 0..1 Why this code system is defined
fhir:copyright[ markdown ] ; # 0..1 Use and/or publishing restrictions
fhir:copyrightLabel[ string ] ; # 0..1 Copyright holder and year(s)
fhir:approvalDate[ date ] ; # 0..1 When the CodeSystem was approved by publisher
fhir:lastReviewDate[ date ] ; # 0..1 When the CodeSystem was last reviewed by the publisher
fhir:effectivePeriod[ Period ] ; # 0..1 When the CodeSystem is expected to be used
fhir:topic ( [ CodeableConcept ] ... ) ; # 0..* E.g. Education, Treatment, Assessment, etc
fhir:author ( [ ContactDetail ] ... ) ; # 0..* Who authored the CodeSystem
fhir:editor ( [ ContactDetail ] ... ) ; # 0..* Who edited the CodeSystem
fhir:reviewer ( [ ContactDetail ] ... ) ; # 0..* Who reviewed the CodeSystem
fhir:endorser ( [ ContactDetail ] ... ) ; # 0..* Who endorsed the CodeSystem
fhir:relatedArtifact ( [ RelatedArtifact ] ... ) ; # 0..* Additional documentation, citations, etc
fhir:caseSensitive[ boolean ] ; # 0..1 If code comparison is case sensitive
fhir:valueSet[ canonical(ValueSet) ] ; # 0..1 Canonical reference to the value set with entire code system
fhir:hierarchyMeaning[ code ] ; # 0..1 Igrouped-by | is-a | part-of | classified-with
fhir:compositional[ boolean ] ; # 0..1 If code system defines a compositional grammar
fhir:versionNeeded[ boolean ] ; # 0..1 If definitions are not stable
fhir:content[ code ] ; # 1..1 Inot-present | example | fragment | complete | supplement
fhir:supplements[ canonical(CodeSystem) ] ; # 0..1 ICanonical URL of Code System this adds designations and properties to
fhir:count[ unsignedInt ] ; # 0..1 Total concepts in the code system
fhir:filter( [ # 0..* Filter that can be used in a value set
fhir:code[ code ] ; # 1..1 Code that identifies the filter
fhir:description[ string ] ; # 0..1 How or why the filter is used
fhir:operator ( [ code ] ... ) ; # 1..* = | is-a | descendent-of | is-not-a | regex | in | not-in | generalizes | child-of | descendent-leaf | exists
fhir:value[ string ] ; # 1..1 What to use for the value
] ... ) ;
fhir:property( [ # 0..* Additional information supplied about each concept
fhir:code[ code ] ; # 1..1 Identifies the property on the concepts, and when referred to in operations
fhir:uri[ uri ] ; # 0..1 Formal identifier for the property
fhir:description[ string ] ; # 0..1 Why the property is defined, and/or what it conveys
fhir:type[ code ] ; # 1..1 code | Coding | string | integer | boolean | dateTime | decimal
] ... ) ;
fhir:concept( [ # 0..* Concepts in the code system
fhir:code[ code ] ; # 1..1 ICode that identifies concept
fhir:display[ string ] ; # 0..1 Text to display to the user
fhir:definition[ string ] ; # 0..1 Formal definition
fhir:designation( [ # 0..* Additional representations for the concept
fhir:language[ code ] ; # 0..1 Human language of the designation
fhir:use[ Coding ] ; # 0..1 IDetails how this designation would be used
fhir:additionalUse ( [ Coding ] ... ) ; # 0..* IAdditional ways how this designation would be used
fhir:value[ string ] ; # 1..1 The text value for this designation
] ... ) ;
fhir:property( [ # 0..* Property value for the concept
fhir:code[ code ] ; # 1..1 IReference to CodeSystem.property.code
# value[x]: 1..1 Value of the property for this concept. One of these 7
fhir:value[ a fhir:code ; code ]
fhir:value[ a fhir:Coding ; Coding ]
fhir:value[ a fhir:string ; string ]
fhir:value[ a fhir:integer ; integer ]
fhir:value[ a fhir:boolean ; boolean ]
fhir:value[ a fhir:dateTime ; dateTime ]
fhir:value[ a fhir:decimal ; decimal ]
] ... ) ;
fhir:concept ( [ See CodeSystem.concept ] ... ) ; # 0..* Child Concepts (is-a/contains/categorizes)
] ... ) ;
]
Declares the existence of and describes a code system or code system supplement + Warning: Name should be usable as an identifier for the module by machine processing applications such as code generation + Rule: Within a code system definition, all the codes SHALL be unique + Warning: If there is an explicit hierarchy, a hierarchyMeaning should be provided + Warning: If there is an implicit hierarchy, a hierarchyMeaning should be provided + Rule: If the code system content = supplement, it must nominate what it's a supplement for + Guideline: caseSensitive SHOULD be provided
Canonical identifier for this code system, represented as a URI (globally unique) (Coding.system) + Warning: URL should not contain | or # - these characters make processing canonical references problematic
@prefix fhir: <http://hl7.org/fhir/> .
[ a fhir:CodeSystem;
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:url[ uri ] ; # 0..1 Canonical identifier for this code system, represented as a URI (globally unique) (Coding.system)
fhir:identifier ( [ Identifier ] ... ) ; # 0..* Additional identifier for the code system (business identifier)
fhir:version[ string ] ; # 0..1 Business version of the code system (Coding.version)
# versionAlgorithm[x]: 0..1 How to compare versions. One of these 2
fhir:versionAlgorithm[ a fhir:string ; string ]
fhir:versionAlgorithm[ a fhir:Coding ; Coding ]
fhir:name[ string ] ; # 0..1 IName for this code system (computer friendly)
fhir:title[ string ] ; # 0..1 Name for this code system (human friendly)
fhir:status[ code ] ; # 1..1 draft | active | retired | unknown
fhir:experimental[ boolean ] ; # 0..1 For testing only - never for real usage
fhir:date[ dateTime ] ; # 0..1 Date last changed
fhir:publisher[ string ] ; # 0..1 Name of the publisher/steward (organization or individual)
fhir:contact ( [ ContactDetail ] ... ) ; # 0..* Contact details for the publisher
fhir:description[ markdown ] ; # 0..1 Natural language description of the code system
fhir:useContext ( [ UsageContext ] ... ) ; # 0..* The context that the content is intended to support
fhir:jurisdiction ( [ CodeableConcept ] ... ) ; # 0..* Intended jurisdiction for code system (if applicable)
fhir:purpose[ markdown ] ; # 0..1 Why this code system is defined
fhir:copyright[ markdown ] ; # 0..1 Use and/or publishing restrictions
fhir:copyrightLabel[ string ] ; # 0..1 Copyright holder and year(s)
fhir:approvalDate[ date ] ; # 0..1 When the CodeSystem was approved by publisher
fhir:lastReviewDate[ date ] ; # 0..1 When the CodeSystem was last reviewed by the publisher
fhir:effectivePeriod[ Period ] ; # 0..1 When the CodeSystem is expected to be used
fhir:topic ( [ CodeableConcept ] ... ) ; # 0..* E.g. Education, Treatment, Assessment, etc
fhir:author ( [ ContactDetail ] ... ) ; # 0..* Who authored the CodeSystem
fhir:editor ( [ ContactDetail ] ... ) ; # 0..* Who edited the CodeSystem
fhir:reviewer ( [ ContactDetail ] ... ) ; # 0..* Who reviewed the CodeSystem
fhir:endorser ( [ ContactDetail ] ... ) ; # 0..* Who endorsed the CodeSystem
fhir:relatedArtifact ( [ RelatedArtifact ] ... ) ; # 0..* Additional documentation, citations, etc
fhir:caseSensitive[ boolean ] ; # 0..1 If code comparison is case sensitive
fhir:valueSet[ canonical(ValueSet) ] ; # 0..1 Canonical reference to the value set with entire code system
fhir:hierarchyMeaning[ code ] ; # 0..1 Igrouped-by | is-a | part-of | classified-with
fhir:compositional[ boolean ] ; # 0..1 If code system defines a compositional grammar
fhir:versionNeeded[ boolean ] ; # 0..1 If definitions are not stable
fhir:content[ code ] ; # 1..1 Inot-present | example | fragment | complete | supplement
fhir:supplements[ canonical(CodeSystem) ] ; # 0..1 ICanonical URL of Code System this adds designations and properties to
fhir:count[ unsignedInt ] ; # 0..1 Total concepts in the code system
fhir:filter( [ # 0..* Filter that can be used in a value set
fhir:code[ code ] ; # 1..1 Code that identifies the filter
fhir:description[ string ] ; # 0..1 How or why the filter is used
fhir:operator ( [ code ] ... ) ; # 1..* = | is-a | descendent-of | is-not-a | regex | in | not-in | generalizes | child-of | descendent-leaf | exists
fhir:value[ string ] ; # 1..1 What to use for the value
] ... ) ;
fhir:property( [ # 0..* Additional information supplied about each concept
fhir:code[ code ] ; # 1..1 Identifies the property on the concepts, and when referred to in operations
fhir:uri[ uri ] ; # 0..1 Formal identifier for the property
fhir:description[ string ] ; # 0..1 Why the property is defined, and/or what it conveys
fhir:type[ code ] ; # 1..1 code | Coding | string | integer | boolean | dateTime | decimal
] ... ) ;
fhir:concept( [ # 0..* Concepts in the code system
fhir:code[ code ] ; # 1..1 ICode that identifies concept
fhir:display[ string ] ; # 0..1 Text to display to the user
fhir:definition[ string ] ; # 0..1 Formal definition
fhir:designation( [ # 0..* Additional representations for the concept
fhir:language[ code ] ; # 0..1 Human language of the designation
fhir:use[ Coding ] ; # 0..1 IDetails how this designation would be used
fhir:additionalUse ( [ Coding ] ... ) ; # 0..* IAdditional ways how this designation would be used
fhir:value[ string ] ; # 1..1 The text value for this designation
] ... ) ;
fhir:property( [ # 0..* Property value for the concept
fhir:code[ code ] ; # 1..1 IReference to CodeSystem.property.code
# value[x]: 1..1 Value of the property for this concept. One of these 7
fhir:value[ a fhir:code ; code ]
fhir:value[ a fhir:Coding ; Coding ]
fhir:value[ a fhir:string ; string ]
fhir:value[ a fhir:integer ; integer ]
fhir:value[ a fhir:boolean ; boolean ]
fhir:value[ a fhir:dateTime ; dateTime ]
fhir:value[ a fhir:decimal ; decimal ]
] ... ) ;
fhir:concept ( [ See CodeSystem.concept ] ... ) ; # 0..* Child Concepts (is-a/contains/categorizes)
] ... ) ;
]
caseSensitive.exists() This is (only) a best practice guideline because:
There is scope for unsafe interpretation of codes if it's not known whether the CodeSystem is case sensitive or not
4.8.6 Versioning Code Systems
Most code systems evolve over time, due to corrections, clarifications, and changes to approach or underlying knowledge or reality.
If these changes lead to the meanings of existing codes changing significantly, then the interpretation of the code system becomes
version dependent. This significantly complicates implementation based on the code system, to the point where it is not clear that
safety can be assured, so changing the meaning of an existing code SHOULD be avoided whenever possible. It is preferable to assign a new identifier to a code system
when any concepts in it have a significant change in meaning (for example, the German diagnostic classification code system
ICD10GM2009 has a different system to ICD10GM2008), but this also can have substantial impact on implementation, so
is often not practical - for instance, SNOMED CT has a complex version release framework, which
may lead to variations in meaning of concepts, but there is only one identifier for SNOMED CT.
For this reason, a code system MAY provide a version which can be specified in CodeSystem.version. The version SHOULD be
provided whenever there are potentially significant changes in meaning across multiple releases of a code system.
There is no particular format requirement for the version, though HL7 recommends a date-based approach, or sem-ver .
When the CodeSystem.versionNeeded is 'true', then the CodeSystem.version value SHALL be used in Coding instances that refer to the code system.
Where the terminology does not clearly define what string should be used to identify code system versions, the recommendation is to use as the version string the date (expressed in FHIR date format) on which the version of the code system that is being used was officially published.
4.8.7 Multi-part Code Systems
The simple case for a code system is that the entire code system - all the concepts and their codes, designations and properties
are distributed in a single CodeSystem resource. However, for a variety of reasons, code systems may be distributed
by the code system authority in a set of fragments, and other authorities may issue additional designations and properties
in supplements.
4.8.8 Code System Fragments
If the CodeSystem.content value is fragment, then the resource
describes part of a code system.
Code Systems may be distributed in fragments for the following reasons:
Different IP distribution rules for different parts of the code system
Special purpose modules for specific purposes
Distribution of proposed content for evaluation
The following rules apply to code system fragments:
All fragments SHALL have the same CodeSystem.url
Fragments can only be published by the code system authority, or according to a process defined by the authority, if they have defined one
Fragments cannot contain any codes, concepts or properties that would not be found in a complete representation of the code system, if one exists. Implementers should note that a "complete representation" of the code system might not exist in a single authoritative publication (e.g., SNOMED International with all modules/extensions)
Publishing a code system in multiple fragments can create confusion for terminology servers and terminology service consumers.
Code System authorities that publish fragments should be careful and communicate their intent clearly
4.8.9 Code System Supplements
If the CodeSystem.content value is supplement, then the resource
describes a code system supplement. The following rules apply to code system supplements:
The CodeSystem.supplements element SHALL have a value, which is the URL of the code system being supplemented
The CodeSystem.url for a supplement SHALL never appear in a Coding.system
The CodeSystem.url for a supplement must be under the control of the authority creating or publishing the supplement
(e.g. not in the same space as the code system being supplemented, unless the supplement is being issued by the same authority as the original code system
A codesystem supplement cannot define any new CodeSystem.concept.code. i.e.: all CodeSystem.concept.code in the supplement must be a code from the "supplemented" code system
If a supplement needs to define new concepts/codes to use as property values, it can be paired with a new (possibly contained)
Code System and use the Coding type for the property values.
4.8.10 Display, Definition and Designations
Concepts have both a display and a definition. The display is a short text that represents the meaning
of the concept to human users, while the definition is a more formal statement of the meaning of the concept, which
is often longer. All concepts SHOULD have a display and a definition, though it is not
mandatory because there are many cases where no such properties are provided, in spite of their utility and importance
for clear and safe communication.
In addition to the display and definition, a concept can have one or more designation elements.
The display is equivalent to a special designation with an implied designation.use meaning "primary code/designation"
and a language equal to the Resource Language. The designations can provide additional displays
for other language, as well as designations for other purposes.
When using concepts, applications use the display and designation unless the language or usage in context provides a reason
to use one of the designations.
4.8.11 Concept Properties
Each code system can define one or more concept properties. Each concept defined by the code system
may have one or more values for each concept property defined by the code system. Typical uses for
properties include:
Tracking administrative status (inactive, deprecation date)
Providing additional statements about the meaning of the concept
Defining structured relationships with other concepts in the code system
Assigning scoring values to the concepts
Properties are identified by their master URI (CodeSystem.property.uri), and then, by their
code (CodeSystem.property.code), which is used both internally within the
code system resource (CodeSystem.concept.property.code) and also externally, in the following
places:
ConceptMap: ConceptMap.element.target.dependsOn.property and ConceptMap.element.target.product.property
ValueSet: ValueSet.compose.include.filter.property can refer to any defined code system property
$lookup operation: In Parameters.parameter.name when returning information about a code
$translate operation: In Parameters.parameter.part.name for dependencies and products
$find-matches operation: In Parameters.parameter.name when providing codes, and in Parameters.parameter.name when asking for codes
Properties are defined using the following elements:
Reference to the formal meaning of the property. One possible source of meaning is the Concept Properties code system.
This part of the definition is optional, but is recommended to provide an additional level of definitional consistency. See further comments below
The type of the property value. The values for properties of type "code" (CodeSystem.concept.property.valueCode) are drawn from the codes defined in the CodeSystem instance.
Properties do not have to have a uri the formally defines them, but they SHOULD have a uri, and
this is particularly important when using properties across multiple code systems. The following guidelines apply:
By convention, property URIs SHOULD have the form {canonical}#{code} where {canonical} is the CodeSystem URI, and {code} is the code for the property
The convention {canonical}#{code} is also used in some contexts to refer directly to a concept defined by the CodeSystem, so
if there is a concept defined with the same code as the property, it is treated as a 'backing' concept, to allow reasoning and use in value sets
Properties are explicitly defined, not implied by the existence of a concept with the same code, and the definitions and properties of the concept to not contribute to the definition of the property
CodeSystems MAY (and should!) use properties defined in other code system. The Concept Properties Code System exists for this purpose, and the properties defined there SHOULD always be used where applicable
When using a property defined in another code system, a code system SHOULD provide a full definition - code, uri, description, type, and valueSet where applicable
In such cases, the definition of the property must be consistent with the source CodeSystem. CodeSystems MAY contain additional descriptive text around the use of the property, and MAY narrow the applicable value set if there is one
If any of these features are not redeclared, applications SHOULD assume that the source CodeSystem definitions apply
Note that properties provide a common view of concept relationships that is common across all code systems.
Some code systems define properties with more sophistication, such as groups of properties, or subsumption
relationships between properties (e.g. SNOMED CT). Servers providing support for these code systems will need
to know full details about the underlying relationships in order to provide the correct information about
concepts and their properties, but this information does not surface in the resources or operations defined
by the FHIR specification.
4.8.12 Defined Concept Properties
In order to assist with consistency between code systems, the following basic property URIs are defined in the Concept Properties code system:
A property that indicates the status of the concept. If the property is identified by this URL, then it SHALL use at least these status values (where appropriate):
active - the concept is for normal use
experimental - provided for trial, but may be removed in the future
deprecated - the concept is outdated and planned to be withdrawn from use
retired - still present for historical reasons, but no longer allowed to be used
This concept is a grouping concept and not intended to be used in the normal use of the code system (though may be used for filters etc.). This is also known as 'Abstract'
This property contains an alternative code that may be used to identify this concept instead of the primary code (deprecated: use alternateCode, and see the discussion below)
A numeric value that allows the comparison (less than, greater than) or other numerical manipulation of a concept (e.g. Adding up components of a score). Scores are usually a whole number, but occasionally decimals are encountered in scores
A property that indicates the order of the concept amongst its siblings in the code system e.g. severity. The code system specific purpose of the ordering is defined elsewhere
The definition of the concept. This corresponds to CodeSystem.concept.definition and is not used in the definition of CodeSystems but is used when clients request the definition property be included in an expansion
Code System representations SHOULD use these properties where possible and these codes for these properties.
Code System representations SHOULD regard the codes for these properties (e.g. status, inactive, notSelectable, etc.)
as reserved values in CodeSystem.property.code values and that when used they SHOULD refer to the properties defined
in the concept properties code system.
In the absence of CodeSystem.property data elements being provided, when properties with these code values
are added to a concept (in CodeSystem.concept.property.code) the intended property SHOULD be assumed to refer
to the defined concept properties in the http://hl7.org/fhir/concept-properties code system.
The parent and child properties are used when performing concept lookup (using the $lookup operation),
and when using properties to indicate parent/child relationships (see below).
4.8.12.1 Concept Status
Many Code Systems have a 'status' associated with the concept. This may categorize the concept as:
Experimental - provided for trial, but may be removed in the future
Active - in normal use
Deprecated - planned to be removed from use
Retired - still present for historical reasons, but no longer allowed to be used
There is wide variation in the life cycles supported by the different code systems and the words
they use to describe the various status values they use, and some code systems have additional
status values. HL7 uses Active, Deprecated and Retired. These ideas overlap with setting
the concept to 'inactive'. In addition, concepts have dates associated with their retirement
or deprecation and some code systems imply the status by providing dates.
In addition to these status codes, concepts may also be labeled 'notSelectable' (aka 'Abstract'),
which means "not to be used in some circumstances", though the exact circumstances need to be clarified
somewhere. This is sometimes also considered a status, though it's usually dependent on the context
of use (e.g. set in a ValueSet).
4.8.12.2 Synonyms and Alternate Codes
Many code systems define multiple codes for the same real world concept. Some code systems do this as a matter of policy
(e.g. case-sensitive vs case insensitive) while others arise over time as the editorial process unfolds. Some
established code systems treat these as synonym codes for the same concept, while others treat them as synonym
concepts - duplicated concepts with the same real world meaning, though the definition sometimes differ. Another
reason for duplicated concepts is to deal with implied poly-heirarchical concepts in systems that do not support
formal poly-heirarchies.
Whatever the reason, in FHIR code systems, all kinds of synonyms are represented the same way: as
duplicate concepts with a declared relationship between them. The relationship is declared using the
'alternateCode' property, which identities another concept with the same
real-world meaning that the code system defines.
In most cases (but not necessarily all), the concepts related with the alternateCode property will have the same:
property values (with the exception of alternateCode, and administrative properties)
designations
The alternateCode property allows CodeSystem resource instances to represent multiple codes for a concept defined in a code system.
The correct way to use the alternateCode property for an instance of CodeSystem.concept (A):
the alternateCode value must be the code associated with a different CodeSystem.concept (B) in the same CodeSystem; and
B SHALL contain an instance of the alternateCode property with the value of the code for A. I.e. reflexivity is required (see csd-6 above)
All relationships shall be explicit - relationships (including transitivity and parent/child) must not be assumed.
Note to Balloters:
This section is newly introduced in R6 after extensive consideration in committee, and comments are sought.
4.8.13 Concept Hierarchy
Code systems may be presented hierarchically using either nested concept elements or properties.
When exclusively using nested concept elements the code system hierarchy is a single tree, and
concepts have only one parent. When using properties, polyhierarchies are allowed (e.g. concepts
may have more than one parent).
If a code system hierarchy is represented using properties (typically, concepts that are subsumed
by more than one other concept), nested concepts SHOULD NOT be used to represent any parts of the hierarchy
structure in the Code System resource; the relationships between concepts should be defined
using properties.
Operations based on the codeSystem resource SHALL have the same result whether or not the
relationships are represented explicitly as properties or implicitly using the CodeSystem
resource hierarchy.
4.8.14 Subsumption Testing
The words 'subsume', 'subsumes', 'subsumed' and 'subsumption' are defined in relation to the type of hierarchy (i.e. the value of CodeSystem.hierarchyMeaning) identified for the code system that is being represented by the CodeSystem resource.
Concept A is considered to be subsumed by Concept B if it comes under Concept B in the hierarchy, or if a parent/child relationship is declared in the properties, and the hierarchyMeaning is "is-a").
Where a CodeSystem does not declare its hierarchy meaning directly, then the code system documentation must be consulted manually to determine how subsumption is determined. If there is no definition, none of the subsumption based features can be used with the code system.
Subsumption based logic arises explicitly or implicitly in the following places in the FHIR specification:
The following filters are defined for all code systems:
Property Name
Operation
Value
Definition
Notes
code
regex
[string]
Matches any concept with the code matching the supplied string
The regex flavor is determined by the server
[property]
=
[string]
Includes all codes that have a property value equal to the specified string, where [property] is the code for any defined property.
Where the type of the property is on of integer, dateTime or decimal, the FHIR search prefixes and semantics apply (see below)
[property]
in
[string,string...]
Includes all codes that have a property value equal to one of the specified strings, where [property] is the code for any defined property
The values cannot include ",", since it is being used as a delimiter
[property]
regex
[string]
Includes all codes that have a property value matching the specified regex
[property]
exists
true or false
When value is "true", includes all codes that have the specified property. When value is "false", includes all codes that lack the specified property
designation
=
[string]
Matches any concept with a designation equal to the supplied string
Designations considered include the concept.display, which counts as a designation
designation
regex
[string]
Matches any concept with a designation matching the supplied string
Designations considered include the concept.display, which counts as a designation
The following filters are defined for all code systems that support "is-a" relationships between concepts. (The filters can be used regardless of whether the "is-a" relationships are conveyed as concept properties or as concept nesting):
Property Name
Operation
Value
Definition
Notes
concept
is-a
[string] concept code
Includes all concept ids that have a transitive is-a relationship with the concept Id provided as the value, including the provided concept itself (include descendant codes and self).
concept
descendent-of
[string] concept code
Includes all concept ids that have a transitive is-a relationship with the concept Id provided as the value, excluding the provided concept itself (i.e. include descendant codes only).
concept
is-not-a
[string] concept code
The specified property of the code does not have an is-a relationship with the provided value.
concept
generalizes
[string] concept code
Includes all concept ids that have a transitive is-a relationship from the concept Id provided as the value, including the provided concept itself (i.e. include ancestor codes and self).
concept
child-of
[string] concept code
Only concepts with a direct hierarchical relationship to the index code and no other concepts. This does not include the index code in the output.
concept
descendent-leaf
[string] concept code
Includes concept ids that have a transitive is-a relationship with the concept Id provided as the value, but which do not have any concept ids with transitive is-a relationships with themselves.
4.8.15.1 FHIR Search Semantics
If the = filter is used with a property that is defined on the CodeSystem, and if the
property has a type of integer, dateTime or decimal, then the
FHIR search rules apply. This means that the following prefixes may be used in the value of the filter:
eq: the code has a value for the property on the code and it is equal to the provided value
ne: the code has a value for the property on the code and it is not equal to the provided value
gt: the code has a value for the property on the code and it is greater than the provided value
lt: the code has a value for the property on the code and it is less than the provided value
ge: the code has a value for the property on the code and it is greater or equal to the provided value
le: the code has a value for the property on the code and it is less or equal to the provided value
sa: the code has a value for the property on the code and it is starts after the provided value
eb: the code has a value for the property on the code and it is ends before the provided value
ap: the code has a value for the property on the code and it is approximately the same to the provided value
The semantics of prefixes are as explained on the search page with regard to precision and range considerations, particularly on dates and decimals.
Note that eq is not redundant - in it's absence, the semantics are for a direct string match, not a smart match as defined by the
search semantics.