Patient
→
person
implemented
primary
Core demographics record. One FHIR Patient maps to exactly one OMOP person row. The person table is the central identity record — every OMOP event table carries a person_id FK.
Conversion profile
omop-patient-person
A FHIR instance converts to person iff it validates against this profile.
| Path | Card | Type | Binding / Fixed | Comment |
|---|---|---|---|---|
| Patient.identifier | 1..*MS | At least one identifier is required; used as person.person_source_value (best of SSN > MR > first). | ||
| Patient.gender | 1..*MS | fhir/administrative-genderrequired | ||
| Patient.birthDate | 1..1MS | Required — drives person.year_of_birth (and month/day/birth_datetime when components are present). This is the routing discriminator for Patient → person. | ||
| Patient.address | MS | Optional. When present, drives the Patient → location edge and person.location_id. | ||
| Patient.generalPractitioner | MS | Optional. First Practitioner reference becomes person.provider_id. | ||
| Patient.managingOrganization | MS | Optional. Becomes person.care_site_id. |
ViewDefinition (Stage 1 flattener)
omop-patient-person
15 columns · resource Patient
| column name | FHIRPath | type |
|---|---|---|
| id | Patient.id | id |
| race_omb | Patient.extension('http://hl7.org/fhir/us/core/StructureDefinition/us-core-race').extension('ombCategory').value.ofType(Coding).where(system='urn:oid:2.16.840.1.113883.6.238').code | code |
| race_text | Patient.extension('http://hl7.org/fhir/us/core/StructureDefinition/us-core-race').extension('ombCategory').value.ofType(Coding).display | string |
| ethnicity_omb | Patient.extension('http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity').extension('ombCategory').value.ofType(Coding).where(system='urn:oid:2.16.840.1.113883.6.238').code | code |
| ethnicity_text | Patient.extension('http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity').extension('ombCategory').value.ofType(Coding).display | string |
| gender | Patient.gender | code |
| gender_code | Patient.gender | code |
| year_of_birth | Patient.birthDate | date |
| month_of_birth | Patient.birthDate | date |
| day_of_birth | Patient.birthDate | date |
| birth_datetime | Patient.birthDate + patient-birthTime extension | dateTime |
| address_id | Patient.address | Address |
| performer_id | Patient.generalPractitioner[0] (Practitioner) | Reference(Practitioner) |
| managing_organization_id | Patient.managingOrganization | Reference(Organization) |
| identifier_value | Patient.identifier (best: SSN > MR > first) | string |
Implementation:
src/mapper/patient.tsFields (18)
-
person_id←Patient.idinteger · idPKrequiredSurrogate key. Hash/sequence/lookup of Patient.id. HL7 IG FML leaves this as a TODO.4 sources ▾
-
TODO/commented placeholder — no concrete strategy
- fhir-omop-ig(fml) refs/refs/fhir-omop-ig/input/maps/PersonMap.fml
-
Direct copy from FPerson primary key
-
Auto-incrementing sequence
- FhirToCdm(csharp) refs/refs/FhirToCdm/FhirToCdmMappings.cs:20-170 — CreatePersonAndLocations()
- ETL-German-FHIR-Core(java) refs/refs/ETL-German-FHIR-Core/src/main/java/org/miracum/etl/fhirtoomop/mapper/PatientMapper.java
- NACHC-fhir-to-omop(java) refs/refs/NACHC-fhir-to-omop/src/main/java/org/nachc/tools/fhirtoomop/omop/person/factory/builder/person/OmopPersonBuilder.java
-
Reuse Patient.id verbatim as integer
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/Patient.jq
-
-
gender_concept_id←Patient.genderinteger · codeFK→CONCEPTrequiredmap:gendermale→8507, female→8532, other→8521, unknown→8551, absent→06 sources ▾
-
Standard concept_id lookup (8507/8532/8521/8551/0)
-
Pass-through FHIR code without translation (non-normative)
- fhir-omop-ig(fml) refs/refs/fhir-omop-ig/input/maps/PersonMap.fml
-
Switch on code with 0 fallback for unknown/other
- FhirToCdm(csharp) refs/refs/FhirToCdm/FhirToCdmMappings.cs:50-63
-
Concept lookup including German extension support
- ETL-German-FHIR-Core(java) refs/refs/ETL-German-FHIR-Core/src/main/java/org/miracum/etl/fhirtoomop/mapper/PatientMapper.java:607-641
-
Prefer us-core-birthsex extension over Patient.gender
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/Patient.jq
-
Null when no mapping found
-
-
gender_source_value←Patient.gendervarchar(50) · code -
gender_source_concept_id← constant integer · code=0 -
year_of_birth←Patient.birthDateinteger · daterequiredtransform:year(Patient.birthDate) -
month_of_birth←Patient.birthDateinteger · datetransform:month(Patient.birthDate) -
day_of_birth←Patient.birthDateinteger · datetransform:day(Patient.birthDate) -
birth_datetime←Patient.birthDate + patient-birthTime extensiondatetime · dateTime -
race_concept_id←Patient.extension[us-core-race].ombCategoryinteger · codeFK→CONCEPTrequiredmap:race -
race_source_value←Patient.extension[us-core-race].ombCategory.displayvarchar(50) · code -
race_source_concept_id← constant integer · code=0 -
ethnicity_concept_id←Patient.extension[us-core-ethnicity].ombCategoryinteger · codeFK→CONCEPTrequiredmap:ethnicity -
ethnicity_source_value←Patient.extension[us-core-ethnicity].ombCategory.displayvarchar(50) · code -
ethnicity_source_concept_id← constant integer · code=0 -
location_id←Patient.addressinteger · AddressFK→LOCATION -
provider_id←Patient.generalPractitioner[0] (Practitioner)integer · Reference(Practitioner)FK→PROVIDER -
care_site_id←Patient.managingOrganizationinteger · Reference(Organization)FK→CARE_SITE -
person_source_value←Patient.identifier (best: SSN > MR > first)varchar(50) · string
Vocabularies
gender
| Source | Display | Concept ID | Concept Name |
|---|---|---|---|
| male | Male | 8507 | MALE |
| female | Female | 8532 | FEMALE |
| other | Other | 8521 | OTHER |
| unknown | Unknown | 8551 | UNKNOWN |
| (absent) | Absent | 0 | No matching concept |
race
| Source | Display | Concept ID | Concept Name |
|---|---|---|---|
| 1002-5 | American Indian or Alaska Native | 8657 | American Indian or Alaska Native |
| 2028-9 | Asian | 8515 | Asian |
| 2054-5 | Black or African American | 8516 | Black or African American |
| 2076-8 | Native Hawaiian or Other Pacific Islander | 8557 | Native Hawaiian or Other Pacific Islander |
| 2106-3 | White | 8527 | White |
| (absent) | Absent | 0 | No matching concept |
ethnicity
| Source | Display | Concept ID | Concept Name |
|---|---|---|---|
| 2135-2 | Hispanic or Latino | 38003563 | Hispanic or Latino |
| 2186-5 | Not Hispanic or Latino | 38003564 | Not Hispanic or Latino |
| (absent) | Absent | 0 | No matching concept |
Edge Cases
Missing birthDate
OMOP convention: drop person. Most implementations write year_of_birth=0.
Partial birthDate (year-only or year-month)
Year always populated; month/day null when not provided. birth_datetime null if incomplete.
Missing gender
gender_concept_id=0, gender_source_value=null. Per OMOP Themis, use 0 rather than 8551.
Multiple identifiers
Pick best by priority: SSN > MR > first. Encoding varies across implementations.
Multiple generalPractitioner entries
Filter to Practitioner references only. Take last (most recent) or first.
Multi-race patient (multiple ombCategory entries)
OMOP has single race_concept_id. Pick first, or use 8522 (Other), or write 0.
deceasedBoolean=true without date
Cannot create death row. See Patient__death edge.
Multiple address entries
Pick most recent home address. See Patient__location edge.
Reference Implementations
- fhir-omop-ig(fml) refs/refs/fhir-omop-ig/input/maps/PersonMap.fml
- omoponfhir(java) refs/refs/omoponfhir-omopv5-r4-mapping/src/main/java/edu/gatech/chai/omoponfhir/omopv5/r4/mapping/OmopPatient.java:1-1338
- FhirToCdm(csharp) refs/refs/FhirToCdm/FhirToCdmMappings.cs — CreatePersonAndLocations() lines 20-170
- ETL-German-FHIR-Core(java) refs/refs/ETL-German-FHIR-Core/src/main/java/org/miracum/etl/fhirtoomop/mapper/PatientMapper.java
- NACHC-fhir-to-omop(java) refs/refs/NACHC-fhir-to-omop/src/main/java/org/nachc/tools/fhirtoomop/omop/person/factory/builder/person/OmopPersonBuilder.java
- fhir-to-omop-demo(jq) refs/refs/fhir-to-omop-demo/demo/translate/map/Patient.jq