Status: Accepted
Date: 2026-09-25 (proposed), 2026-09-25 (accepted)
Related: ADR-A23 (compiler family completion), ADR-A24 (backend
strategy), ADR-A83 (test-only reasoning engine isolation, reserved), ADR-A87,
ADR-A89, ADR-A91
Unit: applied-ontology-readiness
An applied ontology asks questions about its declared conditions before any instance data exists. Does a revised benefit profile admit anyone the previous revision did not? Do two trial arms admit overlapping patients? Does a profile admit anything at all? These are subsumption and satisfiability questions over classes. A DL reasoner answers them without an A-Box, so the open-world assumption does not distort the answers.
LATTICE has no backend that turns conditions into OWL classes. The SPARQL, SHACL and SWRL backends evaluate candidates. They cannot compare two conditions with each other.
exe:OwlArtefact, with the same provenance links as the
existing artefacts. Each condition is expressed over the domain property
that carries its candidate, as bound under ADR-A91.Hierarchy classes. For a hierarchical dimension property R and each concept c of the resolved scheme edition, a primitive class Within_R(c):
∃R.{c} ⊑ Within_R(c)
Within_R(d) ⊑ Within_R(c) for each d with d skos:broader c
Both axiom forms are in OWL 2 EL.
Condition classes. For subject class S:
Cond ≡ S ⊓ (⊔ᵢ Within_R(rᵢ)) ⊓ ¬(⊔ⱼ Within_R(eⱼ))
A condition with exclusions only uses the scheme’s top concepts in place of the required set (L12). An interval condition becomes a datatype restriction on its value property, one property per unit, with no conversion. A candidate strictly above an excluded concept is neither entailed in nor out of Cond, which is the design-time reading of L11.
AllRequired is intersection and AnySufficient is
union. DimensionConsistent is refused, as in ADR-A89.exe:OwlArtefact and a check-result record, a MINOR bump.reasoning extra provides an OWL RL engine only.Resolved: option B, chosen by the human on 2026-09-25.
This ADR encodes a condition over one dimension property R. ADR-A91 lets a
condition read its candidate through a path of several steps, and a subject
may have several values at its end. The SPARQL reference treats a subject with
no value or several as Undetermined, and one with a single value by the
decision table. Two OWL readings of an exclusion then differ:
¬∃path.Within(e) (no value is excluded) and ∃path.¬Within(e) (some value
is not excluded). Neither reproduces “several values give Undetermined”, and
the same gap affects inclusions.
Options:
owl:FunctionalProperty (inverse steps:
owl:InverseFunctionalProperty). The readings then coincide. This puts an
OWL axiom on the applied ontology’s own properties.elg:singleValued true). The generated classes build the claim in with a
cardinality at each step (≤1 p₁ ⊓ ∃p₁.(≤1 p₂ ⊓ ∃p₂.Within(c))), and a
generated SHACL shape checks the same per-step claim on data, so the classes
and the data agree. The applied ontology’s properties are untouched, and a
path the author does not claim single-valued is refused.∃ reading and document that design-time
answers describe “some value” semantics, which differ from runtime decisions
for subjects with several values.SKOS is not involved in any option. skos:broader is used only inside the
hierarchy classes of item 2, which allow several broader concepts per concept.
The restriction concerns the path from a subject to its candidate, which
belongs to the applied ontology, not to the concept scheme.
tools/mork_compilers/src/mork_compilers/owl_backend.py. Within(c) is a
class of concepts, with {c} ⊑ Within(c). Item 2’s Within_R(c) is
∃R.Within(c) at the path’s last step R, so one hierarchy serves every
property that reads the scheme.owl:AllDifferent), matching the SPARQL reference’s comparison
by IRI.owl:real, on a qnt:Quantity’s numeric
value or on the literal where the binding reads on the condition’s space.≤1 restriction of option
B is outside EL, so no condition class is in EL.sh:maxCount 1 on each prefix of
its path, which is the per-step claim for every node reached from a
subject.check-classes on the package CLI runs one check and prints its
exe:DesignTimeCheck record.