owl:oneOf list inside the schema (T-Box), and the ban: "SKOS for annotation only."sh:in can meet the requirement, owl:oneOf was not needed.| §2.2 says | Counter | Remember it by |
|---|---|---|
| "Named individuals allow OWL reasoning over membership and enable class-level disjointness." | "Is this value allowed?" is a validation question — Appendix A's own row assigns it to sh:in. Disjointness only holds between classes; list members are individuals (the closest statement is owl:differentFrom). And OWL doesn't assume two names mean two different things, so dirty data makes the pattern misbehave (see trap ↓). |
The reasoner doesn't reject a second status — it merges two statuses. |
| "SKOS concepts cannot carry OWL restrictions." | True, but it doesn't matter — a code value has no instances to restrict ("Fire" isn't a class of fire-things). Named individuals can't carry restrictions either. A value that gains real structure (Peril_Flood → storm surge / riverine) becomes an owl:Class per §2.4 — one value at a time. |
Nothing for a restriction to bite on — on either side. |
| "skos:exactMatch can be added later without rearchitecting." | This admits the point: the interoperability plan is SKOS. exactMatch is defined for skos:Concepts; a real crosswalk also needs notation, inScheme, and graded matches (our Windstorm is broader than ACORD's Hurricane = broadMatch). Bonus: exactMatch is weaker than sameAs — it links codes without the property merge §1.2 warns about. |
Banned at the modelling layer, relied on at the interop layer → guaranteed rework. |
SHACL (sh:in + sh:maxCount 1) reports the same record as a loud violation. If oneOf is ever used, owl:AllDifferent is mandatory.
| Need | Use |
|---|---|
| Controlled vocabulary — the default | skos:ConceptScheme + sh:in |
| Small, stable, closed set feeding a required inference (record it in a comment) | owl:oneOf + owl:AllDifferent |
| Value with its own structure / subtypes | promote to owl:Class (§2.4) |
| Cross-system alignment (ACORD, NAICS) | skos:*Match family |
| Opaque code string, no metadata ever | xsd:string + SHACL pattern |
oneOf axiom → new ontology release (§5.5) → all consumers re-import → the reasoner reprocesses the whole list (NAICS = 1,000+ codes).broader), code (notation), and tooling (VocBench, Skosmos) included.sh:in", "open set, will grow → no oneOf". Perils / LOB / NAICS are open, growing sets.skos:prefLabel / definition / example on every term: the required documentation surface is skos:Concept's native property set.skos:exactMatch to point retired terms at successors.skos:notation-bearing identifiers over owl:sameAs to avoid property merges — the same safe-alignment instinct as skos:*Match.Swap the default and the exception. SKOS becomes the code-list data model (not just annotation); owl:oneOf survives as the documented, AllDifferent-paired exception for the rare list whose completeness the reasoner actually needs. Everything §2.2 got right — values not subclasses, closure available, ACORD first-class — is kept.
Condensed from the full rebuttal · rebuts Ontology Design Choices §2.2 + Appendix A · companion finding F7. Standards: SKOS, SHACL, OWL 2 DL, gist, ACORD.