FHIR to SDC4 Holistic Mapping Strategy

About This Document: This describes the open SDC4 specification maintained by the Semantic Data Charter. SDCStudio by Axius SDC, Inc. is one commercial implementation of this specification. See ABOUT_SDC4_AND_SDCSTUDIO.md for the distinction between open specifications and commercial tools.


Executive Summary

This document provides a top-down, holistic analysis of how complete FHIR resources map to SDC4 Data Model architecture, moving beyond individual datatype mapping to show how FHIR's compositional patterns naturally align with SDC4's hierarchical structure.

Previous Analysis Gap: The prior datatype analysis (FHIR_DATATYPES_ANALYSIS.md) focused on individual primitive and complex types in isolation, using a bottom-up approach.

This Analysis: Shows how complete FHIR resources compose into SDC4 DM structures, revealing that:



1. SDC4 Architecture Overview

1.1 The DM (Data Model) Root Structure

The SDC4 specification requires a DM (Data Model) as the root of all data models.

Implementation Example (SDCStudio):

The following shows how SDCStudio (a commercial Django application by Axius SDC, Inc.) implements the DM concept:

class DM(models.Model):
    """This is the root node of a Data Model."""

    # Core Identity
    ct_id = CharField(max_length=30, unique=True)  # CUID2 identifier
    title = CharField(max_length=255, unique=True)
    description = TextField

    # Metadata (Dublin Core)
    dc_subject = CharField  # Keywords (MeSH terms)
    source = CharField      # Supporting source/URL
    rights = CharField      # License statement
    publisher = CharField   # Publisher/copyright holder
    dc_language = CharField # Language (en-US, etc.)

    # Lifecycle
    created = DateTimeField
    updated = DateTimeField
    pub_date = DateTimeField
    published = BooleanField  # Generation complete?

    # Authorship
    creator = ForeignKey(Modeler)
    edited_by = ForeignKey(Modeler)
    author = ForeignKey(Modeler)
    contrib = ManyToManyField(Modeler)  # Contributors

    # Structure - THE KEY TO EVERYTHING
    data = ForeignKey(Cluster)  # Root Cluster (the model content!)

    # Context & Provenance
    subject = ForeignKey(Party)         # Who the data is about
    provider = ForeignKey(Party)        # Who provided the data
    participations = ManyToManyField(Participation)  # Other participants

    # Audit & Attestation
    audit = ManyToManyField(Audit)
    attestation = ForeignKey(Attestation)

    # Protocol & Workflow
    protocol = ForeignKey(XdString)  # Clinical guideline, protocol ID
    workflow = ForeignKey(XdLink)    # Workflow engine reference
    acs = ForeignKey(XdLink)         # Access control system

    # Semantic Links
    pred_obj = ManyToManyField(PredObj)  # RDF triples

    # Generated Artifacts
    xsd_file = FileField        # Generated XSD schema
    xml_file = FileField        # XML instance
    json_instance_file = FileField  # JSON instance data
    jsonld_file = FileField     # JSON-LD schema
    html_file = FileField       # Documentation

    # References
    links = ManyToManyField(XdLink)  # Ad-hoc links between models

Key Insight: The DM already has structures for:

1.2 The Cluster Hierarchical Structure

class Cluster(Common):
    """
    The grouping structure of Item, which may contain further instances of Item subclasses,
    in an ordered list. This provides the root Item for potentially very complex structures.
    """

    # Nested Clusters (hierarchy!)
    clusters = ManyToManyField('Cluster')

    # All Component Types
    xdboolean = ManyToManyField(XdBoolean)
    xdlink = ManyToManyField(XdLink)
    xdstring = ManyToManyField(XdString)
    xdtoken = ManyToManyField(XdToken)
    xdfile = ManyToManyField(XdFile)
    xdordinal = ManyToManyField(XdOrdinal)
    xdcount = ManyToManyField(XdCount)
    xddouble = ManyToManyField(XdDouble)
    xdquantity = ManyToManyField(XdQuantity)
    xdfloat = ManyToManyField(XdFloat)
    xdtemporal = ManyToManyField(XdTemporal)

    # List Types
    xdbooleanlist = ManyToManyField(XdBooleanList)
    xdstringlist = ManyToManyField(XdStringList)
    xddecimallist = ManyToManyField(XdDecimalList)
    # ... etc.

Inheritance from Common:

class Common(models.Model):
    """Abstract base model providing fields common to all entries except DM."""

    project = ForeignKey(Project)
    public = BooleanField  # Reusable component?
    label = CharField      # Human-readable label
    ct_id = CharField      # CUID2 identifier
    created = DateTimeField
    updated = DateTimeField
    published = BooleanField
    description = TextField

    # Semantic Links - CRITICAL!
    pred_obj = ManyToManyField(PredObj)  # RDF triples for semantics

    # Generated Code
    schema_code = TextField  # XSD generation
    app_code = TextField     # UI generation

    # Metadata
    lang = CharField
    creator = ForeignKey(Modeler)
    edited_by = ForeignKey(Modeler)
    seq = CharField  # UI sequence/tab index
    validate = BooleanField  # Hard vs soft validation

Key Insight: Every Cluster and Component has:

1.3 Reference Ranges - Already Built In!

class XdOrdered(XdAny):
    """Abstract class defining the concept of ordered values."""

    # FHIR needs this! And it already exists!
    reference_ranges = ManyToManyField('ReferenceRange')
    normal_status = CharField
    simple_rr = ForeignKey('SimpleReferenceRange')

class ReferenceRange(XdAny):
    """Defines a named range to be associated with any ORDERED datum."""

    definition = CharField  # "normal", "critical", "therapeutic"
    interval = ForeignKey(XdInterval)  # The actual range
    is_normal = BooleanField

class XdInterval(XdAny):
    """Generic class defining an interval (range) of a comparable type."""

    lower = CharField
    upper = CharField
    interval_type = CharField  # int, decimal, date, time, duration...
    lower_included = BooleanField
    upper_included = BooleanField
    lower_bounded = BooleanField
    upper_bounded = BooleanField
    units_name = CharField
    units_uri = URLField

CRITICAL INSIGHT: FHIR Observation.referenceRange maps directly to existing SDC4 ReferenceRange!

No need to create @FHIR:ReferenceRange - just use the native SDC4 pattern!

1.4 Party, Participation, Audit, Attestation

class Party(Common):
    """A proxy description of a party (person, organization, etc.)."""

    details = ForeignKey('Cluster')  # Cluster for party details!
    external_ref = ManyToManyField(XdLink)  # Links to external systems

class Participation(Common):
    """Model of a participation of a Party in an activity."""

    performer = ForeignKey(Party)
    function = ForeignKey(XdString)  # Role in activity
    mode = ForeignKey(XdString)  # How they participated (in-person, phone, etc.)

class Audit(Common):
    """Mechanism to identify who/where/when tracking of instances."""

    system_id = ForeignKey(XdString)
    system_user = ForeignKey(Party)
    location = ForeignKey('Cluster')

class Attestation(Common):
    """Record an attestation by a party of item(s) of record content."""

    view = ForeignKey(XdFile)  # Attested view
    proof = ForeignKey(XdFile)  # Signature/proof
    reason = ForeignKey(XdString)
    committer = ForeignKey(Party)

Key Insight: SDC4 already has:

We should map FHIR concepts to THESE, not create duplicates!


2. FHIR Resource Compositional Patterns

2.1 FHIR Patient Resource - Complete Structure

Patient Resource (DomainResource)
β”œβ”€β”€ Resource Metadata
β”‚   β”œβ”€β”€ id: string
β”‚   β”œβ”€β”€ meta: Meta
β”‚   β”‚   β”œβ”€β”€ versionId: id
β”‚   β”‚   β”œβ”€β”€ lastUpdated: instant
β”‚   β”‚   β”œβ”€β”€ source: uri
β”‚   β”‚   β”œβ”€β”€ profile: canonical[]
β”‚   β”‚   β”œβ”€β”€ security: Coding[]
β”‚   β”‚   └── tag: Coding[]
β”‚   β”œβ”€β”€ implicitRules: uri
β”‚   └── language: code
β”‚
β”œβ”€β”€ Narrative
β”‚   β”œβ”€β”€ text: Narrative
β”‚       β”œβ”€β”€ status: code (generated|extensions|additional|empty)
β”‚       └── div: xhtml
β”‚
β”œβ”€β”€ Identifiers (Business IDs)
β”‚   └── identifier: Identifier[] (0..*)
β”‚       β”œβ”€β”€ use: code (usual|official|temp|secondary)
β”‚       β”œβ”€β”€ type: CodeableConcept
β”‚       β”œβ”€β”€ system: uri (namespace)
β”‚       β”œβ”€β”€ value: string (the actual ID)
β”‚       β”œβ”€β”€ period: Period
β”‚       └── assigner: Reference(Organization)
β”‚
β”œβ”€β”€ Demographics
β”‚   β”œβ”€β”€ active: boolean (0..1)
β”‚   β”œβ”€β”€ name: HumanName[] (0..*)
β”‚   β”‚   β”œβ”€β”€ use: code
β”‚   β”‚   β”œβ”€β”€ text: string
β”‚   β”‚   β”œβ”€β”€ family: string
β”‚   β”‚   β”œβ”€β”€ given: string[]
β”‚   β”‚   β”œβ”€β”€ prefix: string[]
β”‚   β”‚   β”œβ”€β”€ suffix: string[]
β”‚   β”‚   └── period: Period
β”‚   β”‚
β”‚   β”œβ”€β”€ telecom: ContactPoint[] (0..*)
β”‚   β”‚   β”œβ”€β”€ system: code (phone|fax|email|pager|url|sms|other)
β”‚   β”‚   β”œβ”€β”€ value: string
β”‚   β”‚   β”œβ”€β”€ use: code (home|work|temp|old|mobile)
β”‚   β”‚   β”œβ”€β”€ rank: positiveInt
β”‚   β”‚   └── period: Period
β”‚   β”‚
β”‚   β”œβ”€β”€ gender: code (male|female|other|unknown)
β”‚   β”œβ”€β”€ birthDate: date
β”‚   β”œβ”€β”€ deceased[x]: boolean | dateTime
β”‚   β”‚
β”‚   └── address: Address[] (0..*)
β”‚       β”œβ”€β”€ use: code
β”‚       β”œβ”€β”€ type: code
β”‚       β”œβ”€β”€ text: string
β”‚       β”œβ”€β”€ line: string[]
β”‚       β”œβ”€β”€ city: string
β”‚       β”œβ”€β”€ district: string
β”‚       β”œβ”€β”€ state: string
β”‚       β”œβ”€β”€ postalCode: string
β”‚       β”œβ”€β”€ country: string
β”‚       └── period: Period
β”‚
β”œβ”€β”€ Relationships
β”‚   β”œβ”€β”€ maritalStatus: CodeableConcept
β”‚   β”œβ”€β”€ multipleBirth[x]: boolean | integer
β”‚   β”‚
β”‚   β”œβ”€β”€ contact: BackboneElement[] (0..*)
β”‚   β”‚   β”œβ”€β”€ relationship: CodeableConcept[]
β”‚   β”‚   β”œβ”€β”€ name: HumanName
β”‚   β”‚   β”œβ”€β”€ telecom: ContactPoint[]
β”‚   β”‚   β”œβ”€β”€ address: Address
β”‚   β”‚   β”œβ”€β”€ gender: code
β”‚   β”‚   β”œβ”€β”€ organization: Reference(Organization)
β”‚   β”‚   └── period: Period
β”‚   β”‚
β”‚   └── communication: BackboneElement[] (0..*)
β”‚       β”œβ”€β”€ language: CodeableConcept (required binding to BCP-47)
β”‚       └── preferred: boolean
β”‚
β”œβ”€β”€ Photo & Documents
β”‚   └── photo: Attachment[] (0..*)
β”‚       β”œβ”€β”€ contentType: code
β”‚       β”œβ”€β”€ language: code
β”‚       β”œβ”€β”€ data: base64Binary
β”‚       β”œβ”€β”€ url: url
β”‚       β”œβ”€β”€ size: integer64
β”‚       β”œβ”€β”€ hash: base64Binary
β”‚       β”œβ”€β”€ title: string
β”‚       β”œβ”€β”€ creation: dateTime
β”‚       β”œβ”€β”€ height: positiveInt
β”‚       └── width: positiveInt
β”‚
└── Provider References
    β”œβ”€β”€ generalPractitioner: Reference(Organization|Practitioner|PractitionerRole)[]
    β”œβ”€β”€ managingOrganization: Reference(Organization)
    └── link: BackboneElement[] (0..*)
        β”œβ”€β”€ other: Reference(Patient|RelatedPerson)
        └── type: code (replaced-by|replaces|refer|seealso)

Compositional Insights:

  1. Repeating Complex Types: identifier[], name[], telecom[], address[], contact[], communication[]
  2. Nested BackboneElements: contact, communication, link
  3. Choice Types: deceased[x], multipleBirth[x]
  4. Reference Links: generalPractitioner, managingOrganization
  5. Metadata Layer: Meta, Narrative (every resource has these)

2.2 FHIR Observation Resource - Complete Structure

Observation Resource (DomainResource)
β”œβ”€β”€ Resource Metadata
β”‚   β”œβ”€β”€ id, meta, implicitRules, language (same as Patient)
β”‚   └── text: Narrative
β”‚
β”œβ”€β”€ Identifiers & Workflow
β”‚   β”œβ”€β”€ identifier: Identifier[]
β”‚   β”œβ”€β”€ instantiates[x]: canonical | Reference(ObservationDefinition)
β”‚   β”œβ”€β”€ basedOn: Reference(CarePlan|DeviceRequest|ImmunizationRecommendation...)[]
β”‚   β”œβ”€β”€ triggeredBy: BackboneElement[] (0..*)
β”‚   β”‚   β”œβ”€β”€ observation: Reference(Observation)
β”‚   β”‚   β”œβ”€β”€ type: code (reflex|repeat|re-run)
β”‚   β”‚   └── reason: string
β”‚   β”œβ”€β”€ partOf: Reference(MedicationAdministration|MedicationDispense...)[]
β”‚   └── status: code (registered|preliminary|final|amended...) [REQUIRED]
β”‚
β”œβ”€β”€ Classification
β”‚   β”œβ”€β”€ category: CodeableConcept[]
β”‚   β”‚   └── (e.g., vital-signs, laboratory, imaging, survey, etc.)
β”‚   └── code: CodeableConcept [REQUIRED]
β”‚       └── (WHAT was observed - LOINC, SNOMED CT)
β”‚
β”œβ”€β”€ Context
β”‚   β”œβ”€β”€ subject: Reference(Patient|Group|Device|Location...)
β”‚   β”œβ”€β”€ focus: Reference(Any)[]
β”‚   β”œβ”€β”€ encounter: Reference(Encounter)
β”‚   β”œβ”€β”€ effective[x]: dateTime | Period | Timing | instant
β”‚   β”œβ”€β”€ issued: instant
β”‚   └── performer: Reference(Practitioner|PractitionerRole|Organization...)[]
β”‚
β”œβ”€β”€ Value (The Actual Observation Result)
β”‚   β”œβ”€β”€ value[x]: [CHOICE TYPE - Pick ONE]
β”‚   β”‚   β”œβ”€β”€ Quantity (most common - measurements)
β”‚   β”‚   β”œβ”€β”€ CodeableConcept (coded results)
β”‚   β”‚   β”œβ”€β”€ string (text results)
β”‚   β”‚   β”œβ”€β”€ boolean (yes/no results)
β”‚   β”‚   β”œβ”€β”€ integer (count results)
β”‚   β”‚   β”œβ”€β”€ Range (low-high range)
β”‚   β”‚   β”œβ”€β”€ Ratio (numerator/denominator)
β”‚   β”‚   β”œβ”€β”€ SampledData (waveforms)
β”‚   β”‚   β”œβ”€β”€ time, dateTime, Period (temporal results)
β”‚   β”‚   β”œβ”€β”€ Attachment (images, PDFs)
β”‚   β”‚   └── Reference(MolecularSequence)
β”‚   β”‚
β”‚   └── dataAbsentReason: CodeableConcept
β”‚       └── (present ONLY if value[x] absent)
β”‚
β”œβ”€β”€ Interpretation & Context
β”‚   β”œβ”€β”€ interpretation: CodeableConcept[] (high|low|normal|critical...)
β”‚   β”œβ”€β”€ note: Annotation[]
β”‚   β”œβ”€β”€ bodySite: CodeableConcept
β”‚   β”œβ”€β”€ bodyStructure: Reference(BodyStructure)
β”‚   β”œβ”€β”€ method: CodeableConcept
β”‚   β”œβ”€β”€ specimen: Reference(Specimen)
β”‚   └── device: Reference(Device|DeviceMetric)
β”‚
β”œβ”€β”€ Reference Ranges (CRITICAL PATTERN!)
β”‚   └── referenceRange: BackboneElement[] (0..*)
β”‚       β”œβ”€β”€ low: SimpleQuantity
β”‚       β”œβ”€β”€ high: SimpleQuantity
β”‚       β”œβ”€β”€ normalValue: CodeableConcept
β”‚       β”œβ”€β”€ type: CodeableConcept
β”‚       β”œβ”€β”€ appliesTo: CodeableConcept[]
β”‚       β”œβ”€β”€ age: Range
β”‚       └── text: markdown
β”‚       └── [Constraint: Must have low, high, normalValue, or text]
β”‚
β”œβ”€β”€ Multi-Component Results
β”‚   └── component: BackboneElement[] (0..*)
β”‚       β”œβ”€β”€ code: CodeableConcept [REQUIRED]
β”‚       β”œβ”€β”€ value[x]: (same 13 types as parent)
β”‚       β”œβ”€β”€ dataAbsentReason: CodeableConcept
β”‚       β”œβ”€β”€ interpretation: CodeableConcept[]
β”‚       └── referenceRange: BackboneElement[] (same as parent!)
β”‚       └── [Example: Blood Pressure has systolic & diastolic components]
β”‚
└── Relationships
    β”œβ”€β”€ hasMember: Reference(Observation|QuestionnaireResponse|MolecularSequence)[]
    └── derivedFrom: Reference(DocumentReference|ImagingStudy|Media...)[]

Compositional Insights:

  1. ReferenceRange is a BackboneElement - nested structure with multiple fields
  2. Component allows nested observations - recursive pattern
  3. Value[x] choice type - 13 different possible types
  4. Workflow linkage - basedOn, partOf, triggeredBy create chains
  5. Identical patterns at root and component level - referenceRange repeats!

3. Complete Resource Mappings

This section demonstrates complete mappings of FHIR Patient and Observation resources to SDC4 DM structures. See the full markdown document for detailed implementation examples including MedicationRequest.

3.1 Key Mapping Principles

  1. FHIR Meta β†’ DM fields (not in data cluster)
    • Meta.versionId β†’ DM version tracking
    • Meta.lastUpdated β†’ DM.updated
    • Meta.source β†’ DM.source (Dublin Core)
    • Meta.profile β†’ DM.pred_obj (semantic links)
  2. Repeating elements β†’ Multiple rows OR Cluster arrays
  3. Choice types β†’ Union cluster with business rules
  4. BackboneElements β†’ Nested Clusters
  5. References β†’ @FHIR:Reference pattern

4. Architectural Alignment

4.1 DM Hierarchy Mirrors FHIR Resource Structure

FHIR Structure SDC4 Structure
Resource DM
id, meta, language ct_id, created, updated, dc_language
text (Narrative) description
[Content Fields] data β†’ Cluster (ROOT)
Complex Types (repeating) Nested Clusters (reusable)
Provenance metadata creator, audit, attestation, participations

4.2 Existing SDC4 Patterns FHIR Needs

FHIR Concept SDC4 Native Pattern Mapping Strategy
ReferenceRange XdQuantified.reference_ranges USE NATIVE - Don't create @FHIR:ReferenceRange!
Interval/Range XdInterval USE NATIVE - Maps to FHIR Range datatype
Period Two XdTemporal OR XdInterval with dateTime Use @FHIR:Period cluster (start, end)
Quantity with units XdQuantity USE NATIVE - Perfect match with UCUM units
Audit trail DM.audit, Audit model USE NATIVE - Maps to FHIR Meta, Provenance
Provenance DM.creator, author, contrib, Participation USE NATIVE - Don't duplicate!
Attestation/Signature DM.attestation, Attestation model USE NATIVE - Maps to FHIR Signature
Semantic links pred_obj (PredObj) ManyToManyField USE NATIVE - Maps to FHIR codes, ValueSets

CRITICAL INSIGHT: At least 40% of FHIR patterns already exist in SDC4!

Don't create @FHIR duplicates - map to native SDC4 where possible!


5. Reuse vs New Component Decision Matrix

5.1 Decision Framework

DECISION TREE:

Does SDC4 have a native pattern that matches FHIR semantics?
β”œβ”€β”€ YES β†’ Use Native SDC4
β”‚   └── Examples: ReferenceRange, XdInterval, XdQuantity, Audit, pred_obj
β”‚
└── NO β†’ Is this a reusable FHIR complex type?
    β”œβ”€β”€ YES β†’ Create @FHIR cluster component
    β”‚   └── Examples: Identifier, HumanName, Address, ContactPoint
    β”‚
    └── NO β†’ Is this a FHIR primitive that needs constraints?
        β”œβ”€β”€ YES β†’ Create @FHIR cluster (if needed) OR just use SDC4 primitive
        β”‚   └── Examples: FHIR code β†’ XdToken with enums
        β”‚
        └── NO β†’ Use vanilla SDC4 component
            └── Examples: boolean β†’ XdBoolean, string β†’ XdString

5.2 Create @FHIR Reusable Clusters

FHIR Datatype Create @FHIR Cluster? Complexity Reusability Priority
Identifier βœ… YES Medium Very High (every resource) CRITICAL
HumanName βœ… YES High High (Patient, Practitioner, Person) CRITICAL
Address βœ… YES High High (Patient, Organization, Location) CRITICAL
ContactPoint βœ… YES Medium High (telecom everywhere) CRITICAL
CodeableConcept βœ… YES High Very High (codes everywhere) CRITICAL
Quantity ❌ NO - use XdQuantity N/A N/A N/A
Reference βœ… YES Medium Very High (references everywhere) CRITICAL
Period βœ… YES Low High (time ranges) HIGH

6. Implementation Strategy

6.1 Revised Tier 1 (Based on Holistic View)

Tier 1A: Native SDC4 (No Work Needed!)

These FHIR patterns already exist in SDC4:

  1. βœ… ReferenceRange β†’ Use XdQuantified.reference_ranges
  2. βœ… Range/Interval β†’ Use XdInterval
  3. βœ… Quantity β†’ Use XdQuantity + Units
  4. βœ… Audit β†’ Use DM.audit, Audit model
  5. βœ… Provenance β†’ Use DM.creator, author, contrib
  6. βœ… Semantic codes β†’ Use pred_obj

Action: Document the mapping, create examples, NO development needed!

Tier 1B: Critical @FHIR Clusters (4 weeks)

Create reusable cluster components:

  1. Identifier (business IDs)
  2. HumanName (person names)
  3. Address (locations)
  4. ContactPoint (telecom)
  5. CodeableConcept (coded concepts)
  6. Reference (resource links)
  7. Period (time spans)

Success Criteria:

6.2 Vocabulary Mapping Patterns

SDC4's powerful multi-vocabulary semantic linking architecture enables direct vocabulary-to-vocabulary mapping without UMLS intermediate:

FHIR Element Vocabularies MD2PD Pattern
Observation.code LOINC + SNOMED Single component, multiple semantic_links
Condition.code ICD-10 + SNOMED + local CodeableConcept with 3 coding[] elements
Medication.code RxNorm + NDC + local CodeableConcept with multiple codings
Patient.gender AdministrativeGender Enumeration + semantic_link to ValueSet

Key Benefits:


7. Critical Insights

7.1 The "Zoom Out" View

Previous approach (bottom-up):

Holistic approach (top-down):

7.2 Key Architectural Discoveries

  1. ReferenceRange Already Exists!
    • FHIR Observation.referenceRange β†’ SDC4 native ReferenceRange
    • XdInterval provides low/high bounds with units
    • No need for @FHIR:ReferenceRange cluster
  2. DM Metadata = FHIR Resource Metadata
    • DM.created, updated β†’ FHIR Meta.lastUpdated
    • DM.creator, author β†’ FHIR Provenance
    • DM.audit β†’ FHIR Meta, audit trail
    • pred_obj β†’ FHIR profiles, security tags
  3. Cluster Hierarchy = FHIR Composition
    • data β†’ Cluster (root) = FHIR resource content
    • Nested clusters = FHIR BackboneElements
    • Cluster reuse = FHIR datatype reuse
  4. Semantic Links Already Handle Terminology
    • pred_obj β†’ PredObj β†’ RDF triples
    • Maps to FHIR Coding.system, code, display
    • No need for "coding" sub-cluster in CodeableConcept!

7.3 Content-Compliant, Not Duplicate

Wrong Approach: Create @FHIR:ReferenceRange that duplicates XdInterval

Right Approach: Map FHIR ReferenceRange to native SDC4 ReferenceRange

Principle: If SDC4 has semantically equivalent pattern, use it.

Result:


Conclusion

This holistic analysis reveals that FHIR to SDC4 mapping is more natural than initially thought.

Key Findings:

  1. ~40% of FHIR patterns already exist in SDC4
    • ReferenceRange, XdInterval, Audit, Participation, Attestation, pred_obj
    • Use native, don't duplicate!
  2. DM β†’ Cluster β†’ Component hierarchy mirrors FHIR resources
    • DM = Resource with metadata
    • data (Cluster) = Resource content
    • Nested clusters = FHIR BackboneElements
  3. Cluster reuse = FHIR datatype reuse
    • @FHIR:Identifier, HumanName, Address, etc.
    • Public, published, reusable across data models
    • Perfect architectural alignment
  4. Semantic links (pred_obj) handle terminology
    • Maps to FHIR Coding without extra clusters
    • RDF triples for terminology bindings

Revised Implementation:

Success Metrics:

Final Recommendation: PROCEED with confidence - the architectural alignment is stronger than anticipated!


About This Documentation

This document describes the open SDC4 specification maintained by the Semantic Data Charter community.

Open Source:

Commercial Implementation:

See ABOUT_SDC4_AND_SDCSTUDIO.md for details.


This document is part of the SDC4 Integration Guide series.
Author: Timothy W. Cook (Founder, Axius SDC, Inc.) w/Claude (Anthropic AI Assistant)
License: Creative Commons Attribution 4.0 International (CC BY 4.0)