owl:Restriction), doubling it with FunctionalProperty, and freezing all of it at class-creation time.| §2.7 says | Counter | Remember it by |
|---|---|---|
| "Restrictions make 'well-formed class instance' machine-readable and reasoner-enforceable." | A reasoner doesn't enforce; it concludes. OWL is open-world: a missing mandatory value is "unknown," never an error — minCardinality silently passes. Two values aren't rejected — objects get merged, and two different literals make the whole model inconsistent (see trap ↓). "Well-formed" is a closed-world idea; SHACL is the construct that means it. |
The restriction either stays silent or takes the model down — it never files a report. |
| "Mandatory single-valued properties are also typed FunctionalProperty — double-enforcement." | Twice the axioms, twice the hazard, zero validation. §2.5 itself says Functional "does not reject a second value; it infers the two values are identical." F3 (Critical): one party with two source keys collapses consistency checking for the whole graph. Plus §4.2's hand-mirrored shape = the same rule in three places (F14: guaranteed drift). | Two axioms saying the same wrong thing don't make it a check. |
| "All cardinality must be declared at class creation — prevents under-constrained terms." | This freezes day-one guesses into permanent logic. "Exactly one" often turns out to mean "one per source system," and published axioms are effectively permanent (§5.5). The risk is asymmetric: an under-constrained class just infers less; an over-constrained one turns dirty data into model-wide inconsistency. Declare the shape early (adjustable, has sh:severity); add axioms late, when the inference need is proven. |
Under-constrained OWL is harmless. Over-constrained OWL is poison. |
The "mandatory" half never fires; the "at most one" half fires model-wide. Neither tells you which record is wrong.
Inference creating knowledge, not counting values. Document the intended inference in the term's comment.
| Need | Use |
|---|---|
| "Must have at least one" — mandatory | sh:minCount 1 |
| "At most one" — single-valued | sh:maxCount 1 |
| Value must be of a type | sh:datatype / sh:class |
| Identifier unique across all records | SHACL-SPARQL — not InverseFunctional |
| Automatic classification | equivalentClass + someValuesFrom |
| Necessary truth the reasoner uses | owl:Restriction — inference documented |
Shapes count; axioms classify. Every cardinality rule moves to SHACL — with messages, severity levels, and per-record reports — and owl:Restriction survives as the documented exception for logical truths the reasoner actually uses (defined classes, automatic classification). Everything §2.7 wanted — explicit, machine-readable constraints declared early — is kept; they just finally check something.
Condensed from the full rebuttal · rebuts Ontology Design Choices §2.7 · companion findings F3, F14 · siblings: domain/range, code-list cheatsheets. Standards: OWL 2 DL, SHACL, RDFS.