rdfs:domain doesn’t check a subject — it converts it — cheatsheet

rebuts design-choices §2.6 · analysis F4 · F20
A signature is documentation; an allowed-subject rule is validation; rdfs:domain is neither — it is an inference rule. Default: schema:domainIncludes / rangeIncludes for tools + SHACL (sh:targetSubjectsOf + sh:class) for enforcement. Exception: rdfs:domain/range only where the type inference is wanted, on trusted data.

Scope of the dispute

Agreed — keepEvery property declares what it applies to; tools can read it; cross-cutting properties must not carry domains (§2.6's exception is right). SHACL owns validation (§4.2).
Contested — changeEncoding the signature as an inference axiom mandated on every property, and hiding the excepted signatures in free-text rdfs:comments.
The tellIf the justification for the axiom is "documentation" or "validation," it must not be an axiom. A domain earns its place only where you want its inference to fire.

§2.6's three supports, answered

§2.6 saysCounterRemember it by
"Declaring domain/range makes the type inferences available to reasoners." "Available" is not "useful." The only thing a domain does with data is re-type its subjects. The rule the modeler meant — "only policies should carry this" — is a data check: a shape, not an axiom. §2.6's own "critical nuance" says so ("the reasoner does not reject the assertion… For validation, use SHACL"). The reasoner doesn't reject the bad triple — it believes it.
"…and helps map generators understand the property's signature." Tools need metadata, not logic. schema:domainIncludes/rangeIncludes (already in §1.1's stack) are machine-readable, can list several classes, and carry no inference. And §2.6's own exception moves signatures into free-text comments — the least machine-readable option (F20). If generators really depended on domains, every excepted property would break them. A DL axiom as tool documentation is a comment with side effects.
"A union domain would infer subjects into the union type — omitting it and documenting in a comment is safer." That inference is correct — it's what a union domain means (F20). The real defect (it validates nothing) applies even more to single-class domains: they re-type a wrong subject into one class, not a broad union. §2.6 fears the weaker axiom and mandates the stronger. Real unions: SHACL sh:or (enforced) + repeated domainIncludes (documented). The exception is §2.6 behaving correctly, once — generalize it.

The trap in the §2.6 pattern (F4)

# domain on every property (§2.6) + disjointness (§2.3) ins:policyNumber rdfs:domain ins:Policy ; rdfs:range xsd:string . # one glitched triple from a source feed: pandc:building-77 ins:policyNumber "P-88112-A" . # → inferred: building-77 a ins:Policy (domain fires) # → Building disjoint with Policy (§2.3 fires) # → ontology INCONSISTENT → entails everything

One bad record doesn't fail — the whole model does. Silent re-typing when there's no clash; a model-wide failure when there is. Neither tells you which record is wrong.

The default pattern — copy this

# signature as metadata — machine-readable, zero inference ins:policyNumber a owl:DatatypeProperty ; schema:domainIncludes ins:Policy ; rdfs:range xsd:string . # datatype range: keep # the enforceable rule — closed-world, stated as such ins:PolicyNumberSubjectShape a sh:NodeShape ; sh:targetSubjectsOf ins:policyNumber ; sh:class ins:Policy ; sh:message "Only a Policy may carry policyNumber." . # validator output — one record, one clear error: # building-77 → sh:class: not an ins:Policy. One record. Loud.

Decision rule (proposed §2.6)

NeedUse
Tool-readable property signature — the defaultschema:domainIncludes / rangeIncludes
Enforce "only X may carry this property"sh:targetSubjectsOf + sh:class
Cross-cutting subjects (Policy ∪ Location ∪ …)sh:or + repeated domainIncludes
Enforce a literal's typesh:datatype (+ rdfs:range xsd:* as convention)
Type inference you actually want, on trusted datardfs:domain/range — documented, disjointness-audited

Why it matters — one glitched triple

  • §2.6: the wrong subject is silently re-typed → clashes with §2.3 disjointness → the whole model goes inconsistent under §4.1's OWL checks → the error surfaces far from the record that caused it.
  • SHACL: one named violation on one record, with a message. The check the modeler actually meant, performed in the layer (§4.2) built to perform it.

The design doc already agrees — everywhere but the decision line

  • §2.6's "critical nuance" — "inferential, not validating… the reasoner does not reject the assertion. For validation, use SHACL." The decision two paragraphs later mandates the non-validating construct everywhere.
  • §2.6's cross-reference — "§4.2: SHACL validates domain constraints that OWL only infers." The doc names the layer that does the real job.
  • §2.6's own example — its showcase property ra:hasRiskObservation ships without a domain: the best-behaved property in the document breaks the rule.
  • §2.5 — already teaches "characteristics are inference rules, not constraints" (Functional doesn't reject; it infers identity). Same logic, forgotten one section later.
  • §2.3 — wants "a loud inconsistency report" over silent nonsense; domain + disjointness delivers silent retyping or global explosion, never a local report.
  • F4 (High) — flags the live §2.6 + §2.3 + §4.1 interaction; recommends: the reasoner checks the schema (T-Box), SHACL checks the data (A-Box). F20 (Minor) — the union rationale misreads a sound construct.

Bottom line

Swap the default and the exception. Every property keeps a signature — as schema:domainIncludes metadata plus a SHACL shape, not as a retyping axiom. rdfs:domain/range survive as the documented exception for inference you deliberately chose, on data you trust, checked against §2.3's disjointness. Everything §2.6 got right — signatures everywhere, the cross-cutting exception, SHACL as validator — is kept.

Condensed from the full rebuttal · rebuts Ontology Design Choices §2.6 · companion findings F4, F20 · sibling: code-list cheatsheet. Standards: RDFS, OWL 2 DL, SHACL, schema.org meta-terms.