SHACL shapes

    The closed-world contract over the open-world OWL class graph. OWL says what can be inferred; SHACL says what a conforming document must carry. This page indexes the 408 node shapes natively, explains the regulatory-weight severity scheme, the 365 domain/range-as-constraint shapes, and the asserted-vs-entailed / SHACL-AF boundary. Every count is read at build time from the committed shapes TTLs (source/03-standards/ontology/opda-*-shapes.ttl), so it cannot drift from the model. The term-by-term reference — the only one that resolves the blank nodes — is the embedded SHACL Play! rendering.

    1 · Node-shape inventory

    The shapes graph is one cross-cutting file (opda-shapes.ttl) plus a small resource-shape set per module. opda-shapes.ttl carries the per-leaf Category-1/2 constraint shapes and the cross-cutting SHACL-AF rules; the module shape files carry the per-Kind resource shapes that compose with the overlay profiles. Shapes target classes via sh:targetClass / sh:targetNode / sh:targetSubjectsOf — they never owl:imports the class graph (ODR-0004 §3a three-graph separation; ODR-0010 §Q3).

    Shapes fileModule / scopeNode shapes
    opda-shapes.ttl cross-cutting (per-leaf + SHACL-AF rules) 347
    opda-property-shapes.ttl Property / Address / Title 7
    opda-agent-shapes.ttl Agent / Person / Organisation / Roles 17
    opda-transaction-shapes.ttl Transaction / Milestone / LeaseTerm 6
    opda-claim-shapes.ttl Claim / Evidence / Verification 7
    opda-governance-shapes.ttl DPV governance / PII floor 1
    opda-descriptive-shapes.ttl Descriptive (EPC, risk, comparables) 23
    Total node shapes 408

    Live count from sh:NodeShape declarations across the seven committed shapes files. SHACL property shapes (sh:property blocks) are blank nodes nested inside these node shapes and are resolved in the SHACL Play! rendering below — and natively on each shape's own page (the shape index that follows).

    Shape index · 402 shapes, linked

    Every node shape now has its own dereferenceable page at /pdtf/shape/{Name} — with its target and its constraints resolved with no blank nodes (path, datatype/class, cardinality, severity, message), the path linked to the property it constrains. Grouped by bounded-context module:

    property · 7
    agent · 17
    transaction · 6
    claim · 7
    governance · 1
    descriptive · 23
    cross-cutting · 341

    2 · The severity scheme — regulatory weight (ODR-0013)

    Flat pass/fail buries the loudest error under noise. ODR-0013 (Guizzardi) ties the three SHACL severities to regulatory weight, not schema nesting: the rarest, most damaging error (identity loss) must be the loudest; the routine omission must be the quietest. Enforcement is a review rule — every sh:Violation shape must guard a Kind's identity contract or an unprovenanced claim; no optional-attribute gap may carry sh:Violation.

    SeverityWhat it marksExamplesLive count
    sh:Violation Breach of a Kind's identity contract, or an unprovenanced Claim A Property with no resolvable UPRN-or-equivalent key; a RegisteredTitle with no title number; a Role with no founding Relator (a Seller with no Transaction); an opda:Claim with no prov:wasDerivedFrom and no explicit "unverified" marker (Moreau, ODR-0009). 400
    sh:Warning Missing profile / disclosure constraint, or a sensitivity-marker gap An overlay-profile gap; a special-category or personal-data marker absent on a PII-bearing class (Pandit, ODR-0012 sensitivity gate — e.g. the PIIWithoutDPVCoAnnotationRule). 1
    sh:Info Absent optional attribute A non-blocking quality rule's status materialisation (e.g. the UPRN- / lease-term- / milestone-variance succession rules, held at sh:Info per ODR-0017 §1a). 27

    Counts are sh:severity assignments across the committed shapes graph. The dominance of sh:Violation reflects the 365 identity-and-typing shapes in §3; sh:Info/sh:Warning are the quality and sensitivity layers.

    3 · Domain/range as constraint — 365 shapes (ODR-0029 R3)

    ODR-0029 R3 drew the inference/validation boundary sharply: rdfs:domain / rdfs:range on the OWL properties are documentary, never materialised by OPDA's Safe-Group closure (which deliberately excludes the domain/range rules — ODR-0025 §R7, so a naive consumer's EPCCertificate ⊑ Property mis-inference is a consumer-side trap, not a fact in OPDA's graph). The enforceable typing is carried instead as SHACL: sh:targetSubjectsOf a property → sh:class on the subject (domain-as-constraint), and sh:targetObjectsOf → sh:class on the object (range-as-constraint).

    Constraint roleMechanismLive count
    Domain as constraintsh:targetSubjectsOf → sh:class292
    Range as constraintsh:targetObjectsOf → sh:class73
    Total domain/range shapes—365

    This is the same value-keyed enforcement doctrine the classification layer uses (ODR-0027): constraints are keyed to the property in use, not to a class membership a reasoner must first entail. It keeps the closure at zero added triples over the flat schema while the SHACL graph carries every real obligation. ODR-0029 R3 records 273 such shapes; the live count above re-reads them from the committed corpus on every build.

    4 · Asserted vs entailed & SHACL-AF

    A soundness condition binds this layer (Knublauch): asserted is never rendered as entailed, and every shape states the graph it targets plus its validator-capability caveat. Two distinct things must not be confused:

    • Validation (SHACL, closed-world). What the author wants checked — cardinality, datatype, identity-key presence, value-set membership, the domain/range shapes of §3. sh:minCount 1 is not owl:minCardinality 1: the first is a closed-world obligation, the second an open-world entailment licence.
    • Inference (the frozen rule fragment, open-world). What the author wants in the closure — subclass / subproperty / inverse / symmetric / transitive (the 7 sound-but-RL-incomplete rules of config/opda-rdfs-plus.rules; not an OWL 2 RL reasoner, ODR-0029 R5). It materialises into a separate derived graph and adds 0 triples over the flat schema today.

    SHACL-AF (advanced=True) — required for the full contract

    9 sh:rule and 8 sh:sparql constructs in the shapes graph are SHACL Advanced Features: the non-blocking quality-rule status materialisations (UPRN / lease-term / milestone-variance / capacity-authority / identifier succession, ODR-0017), the PII-without-DPV-co-annotation meta-rule, and — critically — the sellersCapacity sh:xone discrimination (ODR-0010 Rule 3). A SHACL-Core-only processor passes the sh:xone-of-property-shapes vacuously (it reads conforms true); the BASPI5 non-conformant exemplar only trips its B1.3.2 violation under a SHACL-AF-capable validator — pyshacl with advanced=True (known-issue ii on the section reference; a conformant-Legal-Owner exemplar guards the vacuous-pass direction).

    5 · SHACL Play! — the SHACL reference rendering

    Of the bake-off tools (ADR-0041), the OWL generators (pyLODE, WIDOCO, Ontospy) all score None on SHACL — they document the class graph and skip the shapes. Sparna's SHACL Play! is the only one that documents SHACL: it resolves all the blank nodes (the nested sh:property shapes that the inventory above counts but cannot name) into a readable per-shape reference. It is the authoritative term-by-term surface for this layer.

    Open the SHACL Play! rendering ↗

    The shapes that overlays add are catalogued on Overlay profiles & gaps; the worked instance graphs each shape is exercised against are on Exemplars. The merged shapes graph download and the 24 per-module TTLs are linked from the artefacts index on the section overview. Governing records: ODR-0013 (severity), ODR-0029 (domain/range-as-constraint + inference boundary), ODR-0017 (SHACL-AF quality rules), ODR-0010 (overlay sh:xone).

    Comments

    Loading comments…