NCPI FHIR Implementation Guide v2
0.1.0 - ci-build

NCPI FHIR Implementation Guide v2 - Local Development build (v0.1.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions

Resource Profile: Family Relationship

Official URL: https://nih-ncpi.github.io/ncpi-fhir-ig-2/StructureDefinition/ncpi-family-relationship Version: 0.1.0
Draft as of 2025-03-24 Computable Name: NcpiFamilyRelationship

Family Relationship

Key Guidelines

Family Relationships describe the relationship between two Participants. The core use case is to present biological parentage of a participant to support family / pedigree analyses. In this spirit, platforms should seek to provide minimally the information in a “ped” file: if known, a Participant should have a Family Relationship to their biological mother and father. Twins are also a high priority item for reporting. Further extended relationships can be made available using Family Relationship, but may not be as widely supported as they are harder to interpret.

Added Profile Restrictions

In order to ensure that our resources are interoperable across studies, we have employed a number of restrictions that should make consuming Patient resources more consistent.

  • ID should be a globally unique identifier associated with the person. This practice is intended to make constructing queries for the same person compatible across different servers (such as QA vs PROD) but also to make the resource URLs more meaningful.

Family relationship profiles can be constructed for each individual to reflect the different directions of relationships. For example, if we have a mother and son enrolled in a given research study, NCPI Family Relationship can be used to define how mother (subject) relates to son (focus) and what kind of code describes their relationship (relationship), in this case, the code "MTH" for mother. Use of multiple NCPI Family Relationship profiles to define relevant parties will as a whole describe interrelationships.

FHIR Mappings

The following fields from the shared data model are to be mapped into the NCPI Participant as shown below:

Logical Model Property Cardinality NCPI Person Mapping Usage Guidance Notes
subject 1..1 subject Required  
target 1..1 focus    
relationship 1..1 code    

Usage:

Formal Views of Profile Content

Description of Profiles, Differentials, Snapshots and how the different presentations work.

NameFlagsCard.TypeDescription & Constraintsdoco
.. Observation C 0..* Observation Measurements and simple assertions
dom-2: If the resource is contained in another resource, it SHALL NOT contain nested Resources
dom-3: If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource
dom-4: If a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated
dom-5: If a resource is contained in another resource, it SHALL NOT have a security label
dom-6: A resource should have narrative for robust management
obs-6: dataAbsentReason SHALL only be present if Observation.value[x] is not present
obs-7: If Observation.code is the same as an Observation.component.code then the value element associated with the code SHALL NOT be present
... implicitRules ?!Σ 0..1 uri A set of rules under which this content was created
ele-1: All FHIR elements must have a @value or children
... modifierExtension ?! 0..* Extension Extensions that cannot be ignored
ele-1: All FHIR elements must have a @value or children
ext-1: Must have either extensions or value[x], not both
... status ?!Σ 1..1 code registered | preliminary | final | amended +
Binding: ObservationStatus (required): Codes providing the status of an observation.


ele-1: All FHIR elements must have a @value or children
... subject Σ 1..1 Reference(NCPI Participant) The participant we are describing
ele-1: All FHIR elements must have a @value or children
... focus Σ 1..1 Reference(NCPI Participant) The participant the subject has a relationship to, eg, 'Subject is Relationship to Target' or 'Subject is Mother of Target'
ele-1: All FHIR elements must have a @value or children

doco Documentation for this format

Terminology Bindings

PathConformanceValueSetURI
Observation.statusrequiredObservationStatus
http://hl7.org/fhir/ValueSet/observation-status|4.3.0
from the FHIR Standard
Observation.codeextensibleFamilyMember
http://terminology.hl7.org/ValueSet/v3-FamilyMember

Constraints

IdGradePath(s)DetailsRequirements
dom-2errorObservationIf the resource is contained in another resource, it SHALL NOT contain nested Resources
: contained.contained.empty()
dom-3errorObservationIf the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource
: contained.where(((id.exists() and ('#'+id in (%resource.descendants().reference | %resource.descendants().as(canonical) | %resource.descendants().as(uri) | %resource.descendants().as(url)))) or descendants().where(reference = '#').exists() or descendants().where(as(canonical) = '#').exists() or descendants().where(as(uri) = '#').exists()).not()).trace('unmatched', id).empty()
dom-4errorObservationIf a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated
: contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()
dom-5errorObservationIf a resource is contained in another resource, it SHALL NOT have a security label
: contained.meta.security.empty()
dom-6best practiceObservationA resource should have narrative for robust management
: text.`div`.exists()
ele-1error**ALL** elementsAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
ext-1error**ALL** extensionsMust have either extensions or value[x], not both
: extension.exists() != value.exists()
obs-6errorObservationdataAbsentReason SHALL only be present if Observation.value[x] is not present
: dataAbsentReason.empty() or value.empty()
obs-7errorObservationIf Observation.code is the same as an Observation.component.code then the value element associated with the code SHALL NOT be present
: value.empty() or component.code.where(coding.intersect(%resource.code.coding).exists()).empty()

 

Other representations of profile: CSV, Excel, Schematron

Notes: