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 meets the requirement, common in public-sector procurement, that an ontology declare its place under BFO, the baseline formal ontology standardized as ISO/IEC 21838-2.
Why a Separate Mapping File
The alignment is implemented as sdc4-bfo.owl / sdc4-bfo.ttl rather than modifying sdc4.owl directly:
- The reference model is unchanged --
sdc4.owlis published in several places, including every generated application; a separate file leaves all of them as they are. - Zero
owl:importsin sdc4.owl -- Adding an import would break offline and air-gapped deployments. - Optional by deployment -- load it where a reviewer asks for BFO; skip it where nobody does.
- 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 reviewer requires CCO as well, a sdc4-cco.owl can be added with 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 the generated application's Fuseki dataset. Fuseki is published on the host at port ${FUSEKI_PORT:-13030}, the dataset is <project_slug>_rdf, and writes take the admin user and the FUSEKI_PASSWORD from the application's .env:
# Load BFO first, then the alignment
curl -u admin:$FUSEKI_PASSWORD -X POST http://localhost:13030/<project_slug>_rdf/data \
-H "Content-Type: application/rdf+xml" \
--data-binary @ontologies/bfo-2020.owl
curl -u admin:$FUSEKI_PASSWORD -X POST http://localhost:13030/<project_slug>_rdf/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