SDC4 Alignment to BFO 2020 (ISO/IEC 21838-2:2021)
Overview
SDC4's ontologies (sdc4.owl, sdc4-meta.owl) are aligned to the Basic Formal Ontology (BFO) 2020 via a separate mapping ontology (sdc4-bfo.owl). This alignment satisfies the DoD/ODNI/CDAO requirement for BFO + CCO as baseline formal ontology standards (January 2024 mandate).
Why a Separate Mapping File
The alignment is implemented as sdc4-bfo.owl / sdc4-bfo.ttl rather than modifying sdc4.owl directly:
- No propagation needed --
sdc4.owlexists in 14+ copies across 4 repositories and cookiecutter templates. A separate file avoids touching any of them. - Zero
owl:importsin sdc4.owl -- Adding an import would break offline and air-gapped deployments. - Optional by deployment -- Government customers load it; commercial customers skip it.
- No version bump --
sdc4.owlstays at 4.0.0. The mapping ontology has its own version (1.0.0). - Reversible -- Removing the file breaks nothing.
Why BFO Directly, Not Through CCO
The Common Core Ontologies (CCO) add 11 mid-level ontologies with hundreds of classes. Since SDC4 maps almost entirely to a single BFO class (GenericallyDependentContinuant), CCO adds bulk without value. The mapping is BFO-compatible, so SDC4 interoperates with CCO-based ontologies without importing them.
If a government reviewer demands CCO, a sdc4-cco.owl can be added later using the same separate-file pattern.
Class Mapping
SDC4 is a meta-level ontology about data structures and information artifacts, not a domain ontology about real-world entities. Every SDC4 class is an information artifact specification, which maps to BFO's GenericallyDependentContinuant (BFO_0000031).
Axioms (4 total)
| SDC4 Class | Current Parent | BFO Target | Notes |
|---|---|---|---|
sdc4:CMC |
owl:Thing |
obo:BFO_0000031 (GenericallyDependentContinuant) |
Root of the SDC4 hierarchy; covers ~45 subclasses via transitivity |
sdc4:InvlType |
owl:Thing |
obo:BFO_0000031 |
Interval type enumeration |
sdc4:InvlUnits |
owl:Thing |
obo:BFO_0000031 |
Interval units enumeration |
sdc4:MagnitudeStatus |
owl:Thing |
obo:BFO_0000031 |
Magnitude status enumeration |
The CMC axiom is the critical one. Because all SDC4 data-modeling classes (Cluster, XdString, XdQuantity, XdTemporal, etc.) are subclasses of CMC, the reasoner infers they are all GenericallyDependentContinuant instances via transitivity. The three non-CMC classes need explicit axioms because they sit outside the CMC hierarchy.
Files
| File | Purpose |
|---|---|
sdc4-bfo.owl |
RDF/XML mapping ontology (4 axioms) |
sdc4-bfo.ttl |
Turtle serialization for triplestore loading |
bfo-2020.owl |
Local copy of BFO 2020 (avoids network dependency) |
These files exist in:
- src/rm/sdc4/ -- reference model source
- All cookiecutter template ontologies/ directories (lightweight and enterprise)
Enabling BFO Alignment
Enterprise Deployments (GraphDB)
Add to your Django settings:
LOAD_BFO_ALIGNMENT = True
Then run:
python manage.py init_graphdb
This loads bfo-2020.owl and sdc4-bfo.ttl into GraphDB alongside the core ontologies. The OWL 2 RL ruleset will infer all SDC4 classes as BFO GenericallyDependentContinuant subclasses.
Lightweight Deployments (Fuseki)
Load the files manually into your Fuseki dataset:
# Load BFO first, then the alignment
curl -X POST http://localhost:3030/dataset/data \
-H "Content-Type: application/rdf+xml" \
--data-binary @ontologies/bfo-2020.owl
curl -X POST http://localhost:3030/dataset/data \
-H "Content-Type: text/turtle" \
--data-binary @ontologies/sdc4-bfo.ttl
Note: Fuseki without a reasoning configuration will store the explicit axioms but will not infer transitive subclass relationships. This is sufficient for SPARQL queries that directly reference the 4 axioms.
Disabling
Omit LOAD_BFO_ALIGNMENT = True (or set it to False). The system behaves identically to before the alignment was introduced.
Verification
Protege
Open sdc4-bfo.owl, run the HermiT reasoner. Confirm:
- Zero unsatisfiable classes
- No disjointness violations
- All SDC4 classes inferred as GenericallyDependentContinuant subclasses
GraphDB SPARQL
After loading with LOAD_BFO_ALIGNMENT = True:
SELECT ?class WHERE {
?class rdfs:subClassOf <http://purl.obolibrary.org/obo/BFO_0000031> .
}
All SDC4 classes should appear in the results.
Negative Test
Confirm that omitting sdc4-bfo.ttl produces identical behavior to the pre-alignment state (no BFO types inferred).
BFO Version
Pinned to BFO 2020, which corresponds to ISO/IEC 21838-2:2021. The local copy (bfo-2020.owl) is bundled to avoid network dependencies. Source: http://purl.obolibrary.org/obo/bfo/2020/bfo.owl