Property shapes
opda:Shapes Property shapes
Six SHACL shapes (4 identity-key + 1 IC-breach + 1 INSPIRE rule) plus 1 UPRN succession SHACL-AF rule, emitted into opda-property-shapes.ttl.
Header
<https://opda.org.uk/pdtf/graph/property-shapes>
rdf:type owl:Ontology ;
dct:title "OPDA Property Shapes"@en ;
opda:targetsClassGraph <https://opda.org.uk/pdtf/harness/release/1.0.0/> .
opda:AddressIdentityKeyShape
opda:AddressIdentityKeyShape
rdf:type sh:NodeShape ;
dct:source <https://opda.org.uk/pdtf/harness/odr/ODR-0015/section-Rule-6> ;
sh:property _:b89b6f844e401 ;
sh:targetClass opda:Address .
_:b89b6f844e401
sh:datatype xsd:string ;
sh:maxCount "1"^^xsd:integer ;
sh:message "Address addressVariant MUST be a single xsd:string value (one of 'title' | 'marketing' | 'inspire') per ODR-0015 §Rule 6. Distinguishes the authority lifecycle borne by the Address instance."@en ;
sh:path opda:addressVariant ;
sh:severity sh:Violation .
Severity tier
sh:Violation (Cat 1 — identity-key missing/wrong-type)
Target
sh:targetClass opda:Address; property opda:addressVariant
Validation behaviour
For every opda:Address instance, pyshacl checks that opda:addressVariant is at most one xsd:string value. Multi-value or non-string violations produce the message above. Exemplar listed-building-divergent-addresses demonstrates valid multi-address-instance pattern (three separate Address instances, each with one variant).
Source ODR + ADR
opda:LegalEstateIdentityKeyShape
opda:LegalEstateIdentityKeyShape
rdf:type sh:NodeShape ;
dct:source <https://opda.org.uk/pdtf/harness/odr/ODR-0005/section-3b> ;
sh:property _:bdd41e84ee3f5 ;
sh:targetClass opda:LegalEstate .
_:bdd41e84ee3f5
sh:datatype xsd:string ;
sh:maxCount "1"^^xsd:integer ;
sh:message "LegalEstate identity surface: tenureKind (Freehold / Leasehold / Commonhold) MUST be a single xsd:string value when present. The full rights-bundle IC per ODR-0005 §3b is enforced by the registered-title binding via opda:recordsEstate."@en ;
sh:path opda:tenureKind ;
sh:severity sh:Violation .
Severity tier
sh:Violation (Cat 1 — identity-key)
Target
sh:targetClass opda:LegalEstate; property opda:tenureKind
Validation behaviour
For every opda:LegalEstate instance, opda:tenureKind MUST be at most one xsd:string. The full rights-bundle IC is enforced via the registered-title binding (opda:recordsEstate), not at this shape. Exemplar registered-freehold-house demonstrates conforming usage.
Source ODR + ADR
opda:PropertyIdentityKeyShape
opda:PropertyIdentityKeyShape
rdf:type sh:NodeShape ;
dct:source <https://opda.org.uk/pdtf/harness/odr/ODR-0005/section-6a> ;
sh:property _:ba17cdd559a14 ;
sh:targetClass opda:Property .
_:ba17cdd559a14
sh:datatype xsd:string ;
sh:maxCount "1"^^xsd:integer ;
sh:message "Property hasUPRN, when present, MUST be a single xsd:string value. Absence is admissible (UPRN is a contingent administrative identifier per ODR-0005 §6a); succession is tracked by the UPRNSuccessionRule SHACL-AF rule below."@en ;
sh:path opda:hasUPRN ;
sh:severity sh:Violation .
Severity tier
sh:Violation (Cat 1 — identity-key)
Target
sh:targetClass opda:Property; property opda:hasUPRN
Validation behaviour
For every opda:Property instance, opda:hasUPRN MUST be at most one xsd:string. Absence is admissible (UPRN is contingent per ODR-0005 §6a). Multi-UPRN cases violate; succession across re-numbering is tracked by opda:UPRNSuccessionRule (Info severity). Exemplars unregistered-pre-first-registration-house (UPRN absent) and flat-with-split-uprn (succession event) both demonstrate conforming usage.
Source ODR + ADR
opda:PropertyICBreachShape
opda:PropertyICBreachShape
rdf:type sh:NodeShape ;
dct:source <https://opda.org.uk/pdtf/harness/odr/ODR-0005/section-Rule-5> ;
sh:property _:b6a1eb5c7e44d ;
sh:targetClass opda:Property .
_:b6a1eb5c7e44d
sh:message "Property co-reference MUST use opda:identifiesSameProperty (an IRI-valued ObjectProperty); owl:sameAs is forbidden per ODR-0005 Rule 5 because it propagates identity-collapse across contexts under reasoning."@en ;
sh:nodeKind sh:IRI ;
sh:path opda:identifiesSameProperty ;
sh:severity sh:Violation .
Severity tier
sh:Violation (Cat 2 — IC breach / anti-pattern)
Target
sh:targetClass opda:Property; property opda:identifiesSameProperty
Validation behaviour
For every opda:Property instance, opda:identifiesSameProperty MUST be IRI-valued (not a literal). This is the gentle reminder that co-reference uses the OPDA-specific predicate; the harder anti-pattern (using owl:sameAs) is rejected upstream by CI (Rule 5). Exemplar registered-freehold-house uses opda:identifiesSameProperty correctly between title, estate, and property.
Source ODR + ADR
opda:UPRNSuccessionRule
opda:UPRNSuccessionRule
rdf:type sh:NodeShape ;
rdfs:comment "UPRN succession rule (ODR-0005 §6a; SHACL-AF citing site #1). Materialises opda:hasUPRNSuccessionStatus on every Property with a UPRN: 'succession-tracked' when prov:wasDerivedFrom names a predecessor with a different UPRN; 'primary-uprn' otherwise. Per ODR-0017 §1a non-blocking-quality-rule pattern."@en ;
dct:source <https://opda.org.uk/pdtf/harness/odr/ODR-0005/section-6a> ;
sh:rule _:b16e82da2b31c ;
sh:severity sh:Info ;
sh:targetClass opda:Property .
_:b16e82da2b31c
rdf:type sh:SPARQLRule ;
sh:construct "PREFIX opda: <https://opda.org.uk/pdtf/>\nPREFIX prov: <http://www.w3.org/ns/prov#>\nCONSTRUCT {\n ?property opda:hasUPRNSuccessionStatus ?status .\n}\nWHERE {\n ?property a opda:Property ;\n opda:hasUPRN ?currentUPRN .\n OPTIONAL { ?property prov:wasDerivedFrom ?predecessor .\n ?predecessor opda:hasUPRN ?priorUPRN .\n FILTER (?currentUPRN != ?priorUPRN) }\n BIND (IF(BOUND(?priorUPRN), \"succession-tracked\", \"primary-uprn\") AS ?status)\n}" .
Derives
opda:hasUPRNSuccessionStatus (“succession-tracked” | “primary-uprn”)
Citing site
ODR-0005 §6a — UPRN as contingent identifier (citing site #1)
Severity
sh:Info
Source ODR + ADR
opda:INSPIRESuccessionRule
opda:INSPIRESuccessionRule
rdf:type sh:NodeShape ;
rdfs:comment "INSPIRE Identifier / OS AddressBase succession rule (ODR-0015 §4a; SHACL-AF citing site #3). Materialises opda:hasINSPIRESuccessionStatus on inspire-variant Address instances. Per ODR-0017 §1a."@en ;
dct:source <https://opda.org.uk/pdtf/harness/odr/ODR-0015/section-4a> ;
sh:rule _:becbeff0baa17 ;
sh:severity sh:Info ;
sh:targetClass opda:Address .
_:becbeff0baa17
rdf:type sh:SPARQLRule ;
sh:construct "PREFIX opda: <https://opda.org.uk/pdtf/>\nPREFIX prov: <http://www.w3.org/ns/prov#>\nCONSTRUCT {\n ?address opda:hasINSPIRESuccessionStatus ?status .\n}\nWHERE {\n ?address a opda:Address ;\n opda:addressVariant \"inspire\" .\n OPTIONAL { ?address prov:wasDerivedFrom ?prior .\n ?prior opda:addressVariant \"inspire\" }\n BIND (IF(BOUND(?prior), \"inspire-re-issued\", \"inspire-primary\") AS ?status)\n}" .
Derives
opda:hasINSPIRESuccessionStatus (“inspire-re-issued” | “inspire-primary”)
Citing site
ODR-0015 §4a — INSPIRE Identifier succession (citing site #3)
Severity
sh:Info
Comments