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: NCPI Person

Official URL: https://nih-ncpi.github.io/ncpi-fhir-ig-2/StructureDefinition/ncpi-person Version: 0.1.0
Draft as of 2024-11-25 Computable Name: NcpiPerson

Person

Key Guidelines

In situations where a person participates in multiple studies that have participant data scoped in an exclusive way within one or more projects, we have a Person entity. It is functionally a “group” of Participants that are all describing one “actual” person. This is especially to support situations where access policies about that participant might be conflicting and cases where the data itself about the participant might conflict but cannot be adjudicated by the repository.

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.

Unique participant identifiers are essential to joining the information about a single entity's (i.e., person's) involvement in multiple research studies.

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 FHIR Mapping Usage Guidance Notes
Person 1..1 id Required It is strongly recommended for the Person ID to be a unique identifier with an appropriate system
Participant 0..1 link.target Required It is strongly recommended for the Participant ID to be a unique identifier with an appropriate system
Study Participation

The conventional FHIR mechanism to link Patient resources to a ResearchStudy is through the use of a ResearchSubject resource. Let's use GREGoR data as an example: NCPI Person "PS_000" which represents the "actual" person participating in a study is linked to a specific research study via NCPI Participant, "GSS123456". In this case, GSS123456 is connected to PS_000 by link.target and if PS_000 participanted in another study, their other unique NCPI Participant ID could be similarly linked. NCPI Study Participant connects NCPI Research Study, relevant Access Policies, and an NCPI Participant into a single profile while NCPI Study Group contains a list of Study Participants.

For further information, see the Participant, Research Study, and Person examples:

NCPI Profile Link to GREGoR Example
Research Study Example JSON
Research Study Group Example JSON
Study Participant Example JSON
Participant Example JSON GSS123456, Example JSON GSS654321
Person Example JSON

Usage:

Formal Views of Profile Content

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

This structure is derived from Person

NameFlagsCard.TypeDescription & Constraintsdoco
.. Person 0..* Person A generic person record
... id 1..1 id Unique participant identifier
... link 1..* BackboneElement Link to a resource that concerns the same actual person
.... target 1..1 Reference(NCPI Participant) The participant we are describing

doco Documentation for this format
NameFlagsCard.TypeDescription & Constraintsdoco
.. Person 0..* Person A generic person record
... id Σ 1..1 id Unique participant identifier
... implicitRules ?!Σ 0..1 uri A set of rules under which this content was created
... modifierExtension ?! 0..* Extension Extensions that cannot be ignored
... link 1..* BackboneElement Link to a resource that concerns the same actual person
.... modifierExtension ?!Σ 0..* Extension Extensions that cannot be ignored even if unrecognized
.... target 1..1 Reference(NCPI Participant) The participant we are describing

doco Documentation for this format

Constraints

IdGradePath(s)DetailsRequirements
dom-2errorPersonIf the resource is contained in another resource, it SHALL NOT contain nested Resources
: contained.contained.empty()
dom-3errorPersonIf 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-4errorPersonIf 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-5errorPersonIf a resource is contained in another resource, it SHALL NOT have a security label
: contained.meta.security.empty()
dom-6best practicePersonA 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()
NameFlagsCard.TypeDescription & Constraintsdoco
.. Person 0..* Person A generic person record
... id Σ 1..1 id Unique participant identifier
... meta Σ 0..1 Meta Metadata about the resource
... implicitRules ?!Σ 0..1 uri A set of rules under which this content was created
... text 0..1 Narrative Text summary of the resource, for human interpretation
... contained 0..* Resource Contained, inline Resources
dom-r4b: Containing new R4B resources within R4 resources may cause interoperability issues if instances are shared with R4 systems
... extension 0..* Extension Additional content defined by implementations
... modifierExtension ?! 0..* Extension Extensions that cannot be ignored
... identifier 0..* Identifier A human identifier for this person
... name Σ 0..* HumanName A name associated with the person
... telecom Σ 0..* ContactPoint A contact detail for the person
... gender Σ 0..1 code male | female | other | unknown
Binding: AdministrativeGender (required): The gender of a person used for administrative purposes.

... birthDate Σ 0..1 date The date on which the person was born
... address 0..* Address One or more addresses for the person
... photo 0..1 Attachment Image of the person
... managingOrganization Σ 0..1 Reference(Organization) The organization that is the custodian of the person record
... active ?!Σ 0..1 boolean This person's record is in active use
... link 1..* BackboneElement Link to a resource that concerns the same actual person
.... id 0..1 string Unique id for inter-element referencing
.... extension 0..* Extension Additional content defined by implementations
.... modifierExtension ?!Σ 0..* Extension Extensions that cannot be ignored even if unrecognized
.... target 1..1 Reference(NCPI Participant) The participant we are describing
.... assurance 0..1 code level1 | level2 | level3 | level4
Binding: IdentityAssuranceLevel (required): The level of confidence that this link represents the same actual person, based on NIST Authentication Levels.


doco Documentation for this format

Terminology Bindings

PathConformanceValueSetURI
Person.languagepreferredCommonLanguages
Additional Bindings Purpose
AllLanguages Max Binding
http://hl7.org/fhir/ValueSet/languages
from the FHIR Standard
Person.genderrequiredAdministrativeGender
http://hl7.org/fhir/ValueSet/administrative-gender|4.3.0
from the FHIR Standard
Person.link.assurancerequiredIdentityAssuranceLevel
http://hl7.org/fhir/ValueSet/identity-assuranceLevel|4.3.0
from the FHIR Standard

Constraints

IdGradePath(s)DetailsRequirements
dom-2errorPersonIf the resource is contained in another resource, it SHALL NOT contain nested Resources
: contained.contained.empty()
dom-3errorPersonIf 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-4errorPersonIf 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-5errorPersonIf a resource is contained in another resource, it SHALL NOT have a security label
: contained.meta.security.empty()
dom-6best practicePersonA resource should have narrative for robust management
: text.`div`.exists()
dom-r4bwarningPerson.containedContaining new R4B resources within R4 resources may cause interoperability issues if instances are shared with R4 systems
: ($this is Citation or $this is Evidence or $this is EvidenceReport or $this is EvidenceVariable or $this is MedicinalProductDefinition or $this is PackagedProductDefinition or $this is AdministrableProductDefinition or $this is Ingredient or $this is ClinicalUseDefinition or $this is RegulatedAuthorization or $this is SubstanceDefinition or $this is SubscriptionStatus or $this is SubscriptionTopic) implies (%resource is Citation or %resource is Evidence or %resource is EvidenceReport or %resource is EvidenceVariable or %resource is MedicinalProductDefinition or %resource is PackagedProductDefinition or %resource is AdministrableProductDefinition or %resource is Ingredient or %resource is ClinicalUseDefinition or %resource is RegulatedAuthorization or %resource is SubstanceDefinition or %resource is SubscriptionStatus or %resource is SubscriptionTopic)
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()

This structure is derived from Person

Summary

Mandatory: 2 elements

Structures

This structure refers to these other structures:

Differential View

This structure is derived from Person

NameFlagsCard.TypeDescription & Constraintsdoco
.. Person 0..* Person A generic person record
... id 1..1 id Unique participant identifier
... link 1..* BackboneElement Link to a resource that concerns the same actual person
.... target 1..1 Reference(NCPI Participant) The participant we are describing

doco Documentation for this format

Key Elements View

NameFlagsCard.TypeDescription & Constraintsdoco
.. Person 0..* Person A generic person record
... id Σ 1..1 id Unique participant identifier
... implicitRules ?!Σ 0..1 uri A set of rules under which this content was created
... modifierExtension ?! 0..* Extension Extensions that cannot be ignored
... link 1..* BackboneElement Link to a resource that concerns the same actual person
.... modifierExtension ?!Σ 0..* Extension Extensions that cannot be ignored even if unrecognized
.... target 1..1 Reference(NCPI Participant) The participant we are describing

doco Documentation for this format

Constraints

IdGradePath(s)DetailsRequirements
dom-2errorPersonIf the resource is contained in another resource, it SHALL NOT contain nested Resources
: contained.contained.empty()
dom-3errorPersonIf 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-4errorPersonIf 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-5errorPersonIf a resource is contained in another resource, it SHALL NOT have a security label
: contained.meta.security.empty()
dom-6best practicePersonA 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()

Snapshot View

NameFlagsCard.TypeDescription & Constraintsdoco
.. Person 0..* Person A generic person record
... id Σ 1..1 id Unique participant identifier
... meta Σ 0..1 Meta Metadata about the resource
... implicitRules ?!Σ 0..1 uri A set of rules under which this content was created
... text 0..1 Narrative Text summary of the resource, for human interpretation
... contained 0..* Resource Contained, inline Resources
dom-r4b: Containing new R4B resources within R4 resources may cause interoperability issues if instances are shared with R4 systems
... extension 0..* Extension Additional content defined by implementations
... modifierExtension ?! 0..* Extension Extensions that cannot be ignored
... identifier 0..* Identifier A human identifier for this person
... name Σ 0..* HumanName A name associated with the person
... telecom Σ 0..* ContactPoint A contact detail for the person
... gender Σ 0..1 code male | female | other | unknown
Binding: AdministrativeGender (required): The gender of a person used for administrative purposes.

... birthDate Σ 0..1 date The date on which the person was born
... address 0..* Address One or more addresses for the person
... photo 0..1 Attachment Image of the person
... managingOrganization Σ 0..1 Reference(Organization) The organization that is the custodian of the person record
... active ?!Σ 0..1 boolean This person's record is in active use
... link 1..* BackboneElement Link to a resource that concerns the same actual person
.... id 0..1 string Unique id for inter-element referencing
.... extension 0..* Extension Additional content defined by implementations
.... modifierExtension ?!Σ 0..* Extension Extensions that cannot be ignored even if unrecognized
.... target 1..1 Reference(NCPI Participant) The participant we are describing
.... assurance 0..1 code level1 | level2 | level3 | level4
Binding: IdentityAssuranceLevel (required): The level of confidence that this link represents the same actual person, based on NIST Authentication Levels.


doco Documentation for this format

Terminology Bindings

PathConformanceValueSetURI
Person.languagepreferredCommonLanguages
Additional Bindings Purpose
AllLanguages Max Binding
http://hl7.org/fhir/ValueSet/languages
from the FHIR Standard
Person.genderrequiredAdministrativeGender
http://hl7.org/fhir/ValueSet/administrative-gender|4.3.0
from the FHIR Standard
Person.link.assurancerequiredIdentityAssuranceLevel
http://hl7.org/fhir/ValueSet/identity-assuranceLevel|4.3.0
from the FHIR Standard

Constraints

IdGradePath(s)DetailsRequirements
dom-2errorPersonIf the resource is contained in another resource, it SHALL NOT contain nested Resources
: contained.contained.empty()
dom-3errorPersonIf 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-4errorPersonIf 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-5errorPersonIf a resource is contained in another resource, it SHALL NOT have a security label
: contained.meta.security.empty()
dom-6best practicePersonA resource should have narrative for robust management
: text.`div`.exists()
dom-r4bwarningPerson.containedContaining new R4B resources within R4 resources may cause interoperability issues if instances are shared with R4 systems
: ($this is Citation or $this is Evidence or $this is EvidenceReport or $this is EvidenceVariable or $this is MedicinalProductDefinition or $this is PackagedProductDefinition or $this is AdministrableProductDefinition or $this is Ingredient or $this is ClinicalUseDefinition or $this is RegulatedAuthorization or $this is SubstanceDefinition or $this is SubscriptionStatus or $this is SubscriptionTopic) implies (%resource is Citation or %resource is Evidence or %resource is EvidenceReport or %resource is EvidenceVariable or %resource is MedicinalProductDefinition or %resource is PackagedProductDefinition or %resource is AdministrableProductDefinition or %resource is Ingredient or %resource is ClinicalUseDefinition or %resource is RegulatedAuthorization or %resource is SubstanceDefinition or %resource is SubscriptionStatus or %resource is SubscriptionTopic)
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()

This structure is derived from Person

Summary

Mandatory: 2 elements

Structures

This structure refers to these other structures:

 

Other representations of profile: CSV, Excel, Schematron

Notes: