| 1 | @prefix pbo: <https://ontology.property.local/pbo#> . |
| 2 | @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . |
| 3 | @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . |
| 4 | @prefix owl: <http://www.w3.org/2002/07/owl#> . |
| 5 | @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . |
| 6 | @prefix skos: <http://www.w3.org/2004/02/skos/core#> . |
| 7 | @prefix sh: <http://www.w3.org/ns/shacl#> . |
| 8 | @prefix dcterms: <http://purl.org/dc/terms/> . |
| 9 | @prefix prov: <http://www.w3.org/ns/prov#> . |
| 10 | |
| 11 | # SHACL 2017 shapes for operational record completeness (DEC-015). |
| 12 | # These constrain data the platform stores; they do not assert domain truths. |
| 13 | # Cardinalities here are SHACL, not OWL cardinality restrictions. |
| 14 | |
| 15 | pbo:ParticipationShape a sh:NodeShape ; |
| 16 | sh:targetClass pbo:Participation ; |
| 17 | sh:property [ sh:path pbo:participant ; sh:class pbo:Party ; sh:minCount 1 ; sh:maxCount 1 ; sh:message "A participation must name exactly one party." ] , |
| 18 | [ sh:path pbo:inRole ; sh:class pbo:Role ; sh:minCount 1 ; sh:maxCount 1 ; sh:message "A participation must name exactly one role." ] , |
| 19 | [ sh:path pbo:participationContext ; sh:minCount 1 ; sh:maxCount 1 ; sh:message "A participation must have exactly one context (agreement, asset, project or business)." ] , |
| 20 | [ sh:path pbo:effectiveFrom ; sh:datatype xsd:date ; sh:maxCount 1 ] , |
| 21 | [ sh:path pbo:effectiveUntil ; sh:datatype xsd:date ; sh:maxCount 1 ] . |
| 22 | |
| 23 | pbo:AgreementShape a sh:NodeShape ; |
| 24 | sh:targetClass pbo:Agreement ; |
| 25 | sh:property [ sh:path pbo:hasParticipation ; sh:class pbo:Participation ; sh:minCount 2 ; sh:message "An agreement needs at least two participations (for example landlord and tenant)." ] , |
| 26 | [ sh:path pbo:concernsAsset ; sh:class pbo:PropertyAsset ; sh:minCount 1 ; sh:message "An agreement must concern at least one property asset or rentable unit." ] , |
| 27 | [ sh:path pbo:weeklyRent ; sh:or ( [ sh:datatype xsd:decimal ] [ sh:datatype xsd:integer ] ) ; sh:maxCount 1 ; sh:minInclusive 0 ] , |
| 28 | [ sh:path pbo:termMonths ; sh:datatype xsd:integer ; sh:maxCount 1 ; sh:minInclusive 0 ] , |
| 29 | [ sh:path pbo:escalationRatePercent ; sh:or ( [ sh:datatype xsd:decimal ] [ sh:datatype xsd:integer ] ) ; sh:maxCount 1 ] , |
| 30 | [ sh:path pbo:fixedRent ; sh:datatype xsd:boolean ; sh:maxCount 1 ] , |
| 31 | [ sh:path pbo:leaseType ; sh:class pbo:LeaseType ; sh:maxCount 1 ] , |
| 32 | [ sh:path pbo:permittedUse ; sh:class pbo:AccommodationType ] , |
| 33 | [ sh:path pbo:hasClause ; sh:class pbo:ContractClause ] . |
| 34 | |
| 35 | pbo:HeadLeaseShape a sh:NodeShape ; |
| 36 | sh:targetClass pbo:HeadLease ; |
| 37 | sh:property [ sh:path pbo:fixedRent ; sh:hasValue true ; sh:minCount 1 ; sh:message "A head/master lease record must state fixedRent true (fixed rent regardless of occupancy)." ] , |
| 38 | [ sh:path pbo:hasClause ; sh:qualifiedValueShape [ sh:class pbo:SublettingPermissionClause ] ; sh:qualifiedMinCount 1 ; |
| 39 | sh:severity sh:Warning ; sh:message "A head lease intended for subletting should record an express subletting permission clause." ] . |
| 40 | |
| 41 | pbo:SubleaseShape a sh:NodeShape ; |
| 42 | sh:targetClass pbo:Sublease ; |
| 43 | sh:property [ sh:path pbo:agreementUnderHeadLease ; sh:class pbo:HeadLease ; sh:minCount 1 ; sh:maxCount 1 ; sh:message "A sublease must reference the head lease it derives from." ] . |
| 44 | |
| 45 | pbo:OutgoingAllocationShape a sh:NodeShape ; |
| 46 | sh:targetClass pbo:OutgoingAllocation ; |
| 47 | sh:property [ sh:path pbo:outgoingCategory ; sh:class pbo:OutgoingCategory ; sh:minCount 1 ; sh:maxCount 1 ] , |
| 48 | [ sh:path pbo:borneByRole ; sh:class pbo:Role ; sh:minCount 1 ; sh:maxCount 1 ] . |
| 49 | |
| 50 | pbo:AuthorisationShape a sh:NodeShape ; |
| 51 | sh:targetClass pbo:Authorisation ; |
| 52 | sh:property [ sh:path pbo:authorisationType ; sh:class pbo:AuthorisationType ; sh:minCount 1 ; sh:maxCount 1 ; sh:message "An authorisation must have exactly one authorisation type." ] , |
| 53 | [ sh:path pbo:authorisationStatus ; sh:datatype xsd:string ; sh:minCount 1 ; sh:maxCount 1 ; |
| 54 | sh:in ( "held" "pending" "expired" "refused" "not_required" "unknown" ) ; sh:message "authorisationStatus must be one of held, pending, expired, refused, not_required, unknown." ] , |
| 55 | [ sh:path pbo:issuedBy ; sh:class pbo:GovernmentBody ; sh:maxCount 1 ] , |
| 56 | [ sh:path pbo:authorisedParty ; sh:class pbo:Party ; sh:maxCount 1 ] , |
| 57 | [ sh:path pbo:underRegime ; sh:class pbo:RegulatoryRegime ; sh:maxCount 1 ] , |
| 58 | [ sh:path pbo:dateIssued ; sh:datatype xsd:date ; sh:maxCount 1 ] , |
| 59 | [ sh:path pbo:effectiveUntil ; sh:datatype xsd:date ; sh:maxCount 1 ] ; |
| 60 | sh:or ( [ sh:property [ sh:path pbo:concernsAsset ; sh:minCount 1 ] ] |
| 61 | [ sh:property [ sh:path pbo:authorisedParty ; sh:minCount 1 ] ] ) ; |
| 62 | sh:message "An authorisation must concern an asset or be granted to a party." . |
| 63 | |
| 64 | pbo:RegulatoryRegimeShape a sh:NodeShape ; |
| 65 | sh:targetClass pbo:RegulatoryRegime ; |
| 66 | sh:property [ sh:path pbo:appliesIn ; sh:class pbo:Jurisdiction ; sh:minCount 1 ; sh:message "A regime must apply in at least one jurisdiction." ] , |
| 67 | [ sh:path pbo:governedBy ; sh:class pbo:Legislation ; sh:minCount 1 ; sh:message "A regime must cite the legislation that establishes it." ] , |
| 68 | [ sh:path pbo:administeredBy ; sh:class pbo:GovernmentBody ] , |
| 69 | [ sh:path pbo:hasThreshold ; sh:class pbo:OccupancyThreshold ] , |
| 70 | [ sh:path pbo:requiresAuthorisationType ; sh:class pbo:AuthorisationType ] , |
| 71 | [ sh:path pbo:hasRule ; sh:class pbo:RegulatoryRule ] . |
| 72 | |
| 73 | pbo:OccupancyThresholdShape a sh:NodeShape ; |
| 74 | sh:targetClass pbo:OccupancyThreshold ; |
| 75 | sh:property [ sh:path pbo:thresholdKind ; sh:class pbo:ThresholdKind ; sh:minCount 1 ; sh:maxCount 1 ] , |
| 76 | [ sh:path pbo:thresholdComparator ; sh:datatype xsd:string ; sh:minCount 1 ; sh:maxCount 1 ; sh:in ( "gte" "lte" "gt" "lt" "eq" "range" ) ] , |
| 77 | [ sh:path pbo:thresholdValue ; sh:or ( [ sh:datatype xsd:decimal ] [ sh:datatype xsd:integer ] ) ; sh:minCount 1 ; sh:maxCount 1 ] , |
| 78 | [ sh:path pbo:thresholdUpperValue ; sh:or ( [ sh:datatype xsd:decimal ] [ sh:datatype xsd:integer ] ) ; sh:maxCount 1 ] , |
| 79 | [ sh:path pbo:thresholdUnit ; sh:datatype xsd:string ; sh:minCount 1 ; sh:maxCount 1 ] , |
| 80 | [ sh:path pbo:occupancyThresholdEffect ; sh:class pbo:ThresholdEffect ; sh:minCount 1 ; sh:maxCount 1 ; sh:message "A threshold must state its regulatory effect." ] . |
| 81 | |
| 82 | pbo:RegulatoryRuleShape a sh:NodeShape ; |
| 83 | sh:targetClass pbo:RegulatoryRule ; |
| 84 | sh:property [ sh:path pbo:underRegime ; sh:class pbo:RegulatoryRegime ; sh:minCount 1 ; sh:maxCount 1 ; sh:message "A rule must sit under exactly one regime." ] , |
| 85 | [ sh:path pbo:effectiveFrom ; sh:datatype xsd:date ; sh:maxCount 1 ] , |
| 86 | [ sh:path pbo:effectiveUntil ; sh:datatype xsd:date ; sh:maxCount 1 ] , |
| 87 | [ sh:path pbo:cutoffDate ; sh:datatype xsd:dateTime ; sh:maxCount 1 ] . |
| 88 | |
| 89 | pbo:TaxRuleShape a sh:NodeShape ; |
| 90 | sh:targetClass pbo:TaxRule ; |
| 91 | sh:property [ sh:path pbo:appliesToPropertyClass ; sh:class pbo:PropertyClass ; sh:minCount 1 ; sh:message "A tax rule must state the property class it applies to." ] . |
| 92 | |
| 93 | pbo:MetricValueShape a sh:NodeShape ; |
| 94 | sh:targetClass pbo:MetricValue ; |
| 95 | sh:property [ sh:path pbo:metric ; sh:class pbo:Metric ; sh:minCount 1 ; sh:maxCount 1 ] , |
| 96 | [ sh:path pbo:numericValue ; sh:or ( [ sh:datatype xsd:decimal ] [ sh:datatype xsd:integer ] ) ; sh:minCount 1 ; sh:maxCount 1 ; sh:message "A metric value must carry one decimal or integer numeric value." ] , |
| 97 | [ sh:path pbo:upperValue ; sh:or ( [ sh:datatype xsd:decimal ] [ sh:datatype xsd:integer ] ) ; sh:maxCount 1 ] , |
| 98 | [ sh:path pbo:unit ; sh:datatype xsd:string ; sh:minCount 1 ; sh:maxCount 1 ] , |
| 99 | [ sh:path pbo:assertedIn ; sh:class pbo:SourceDocument ; sh:maxCount 1 ] , |
| 100 | [ sh:path pbo:claimDate ; sh:datatype xsd:date ; sh:maxCount 1 ] . |
| 101 | |
| 102 | pbo:FinancialScenarioShape a sh:NodeShape ; |
| 103 | sh:targetClass pbo:FinancialScenario ; |
| 104 | sh:property [ sh:path pbo:scenarioName ; sh:datatype xsd:string ; sh:minCount 1 ; sh:maxCount 1 ] , |
| 105 | [ sh:path pbo:assumes ; sh:class pbo:MetricValue ; sh:minCount 3 ; sh:message "A scenario must declare at least three input assumptions (for example rooms, tariff, vacancy)." ] , |
| 106 | [ sh:path pbo:yields ; sh:class pbo:MetricValue ; sh:minCount 1 ; sh:message "A scenario must record at least one result metric." ] , |
| 107 | [ sh:path pbo:scenarioForModel ; sh:class pbo:OperatingModel ; sh:maxCount 1 ] , |
| 108 | [ sh:path pbo:assertedIn ; sh:class pbo:SourceDocument ; sh:maxCount 1 ] . |
| 109 | |
| 110 | pbo:PropertyAssetShape a sh:NodeShape ; |
| 111 | sh:targetClass pbo:PropertyAsset ; |
| 112 | sh:property [ sh:path pbo:locatedIn ; sh:class pbo:Jurisdiction ; sh:minCount 1 ; sh:maxCount 1 ; sh:message "A property asset must be located in exactly one (most specific) jurisdiction." ] , |
| 113 | [ sh:path pbo:hasIdentifier ; sh:class pbo:PropertyIdentifier ] , |
| 114 | [ sh:path pbo:roomCount ; sh:datatype xsd:integer ; sh:maxCount 1 ; sh:minInclusive 0 ] , |
| 115 | [ sh:path pbo:bedroomCount ; sh:datatype xsd:integer ; sh:maxCount 1 ; sh:minInclusive 0 ] , |
| 116 | [ sh:path pbo:floorAreaSqm ; sh:or ( [ sh:datatype xsd:decimal ] [ sh:datatype xsd:integer ] ) ; sh:maxCount 1 ] , |
| 117 | [ sh:path pbo:hasAccommodationType ; sh:class pbo:AccommodationType ] , |
| 118 | [ sh:path pbo:intendedOperatingModel ; sh:class pbo:OperatingModel ] , |
| 119 | [ sh:path pbo:hasBuildingClassification ; sh:class pbo:BuildingClassification ; sh:maxCount 1 ] , |
| 120 | [ sh:path pbo:hasAuthorisation ; sh:class pbo:Authorisation ] . |
| 121 | |
| 122 | pbo:DwellingIdentifierShape a sh:NodeShape ; |
| 123 | sh:targetClass pbo:Dwelling ; |
| 124 | sh:property [ sh:path pbo:hasIdentifier ; sh:minCount 1 ; sh:severity sh:Warning ; sh:message "A dwelling record should carry at least one identifier (address or lot/plan)." ] . |
| 125 | |
| 126 | pbo:PropertyIdentifierShape a sh:NodeShape ; |
| 127 | sh:targetClass pbo:PropertyIdentifier ; |
| 128 | sh:property [ sh:path pbo:identifierValue ; sh:datatype xsd:string ; sh:minCount 1 ; sh:maxCount 1 ] . |
| 129 | |
| 130 | pbo:JurisdictionShape a sh:NodeShape ; |
| 131 | sh:targetClass pbo:Jurisdiction ; |
| 132 | sh:property [ sh:path pbo:jurisdictionCode ; sh:datatype xsd:string ; sh:minCount 1 ; sh:maxCount 1 ] , |
| 133 | [ sh:path pbo:withinJurisdiction ; sh:class pbo:Jurisdiction ] . |
| 134 | |
| 135 | pbo:DataSourceShape a sh:NodeShape ; |
| 136 | sh:targetClass pbo:DataSource ; |
| 137 | sh:property [ sh:path pbo:publishedBy ; sh:class pbo:Organisation ; sh:minCount 1 ; sh:maxCount 1 ] , |
| 138 | [ sh:path pbo:accessTier ; sh:class pbo:DataAccessTier ; sh:minCount 1 ; sh:maxCount 1 ] , |
| 139 | [ sh:path pbo:suppliesAttribute ; sh:class pbo:PropertyAttribute ; sh:minCount 1 ] , |
| 140 | [ sh:path pbo:coversJurisdiction ; sh:class pbo:Jurisdiction ; sh:minCount 1 ] , |
| 141 | [ sh:path pbo:refreshCadence ; sh:datatype xsd:string ; sh:maxCount 1 ] . |
| 142 | |
| 143 | pbo:RiskShape a sh:NodeShape ; |
| 144 | sh:targetClass pbo:Risk ; |
| 145 | sh:property [ sh:path pbo:riskCategory ; sh:class pbo:RiskCategory ; sh:minCount 1 ; sh:maxCount 1 ] , |
| 146 | [ sh:path pbo:mitigatedBy ; sh:class pbo:Mitigation ] . |
| 147 | |
| 148 | pbo:MitigationShape a sh:NodeShape ; |
| 149 | sh:targetClass pbo:Mitigation ; |
| 150 | sh:property [ sh:path pbo:mitigationNote ; sh:datatype xsd:string ; sh:minCount 1 ; sh:maxCount 1 ] . |
| 151 | |
| 152 | pbo:DecisionGateShape a sh:NodeShape ; |
| 153 | sh:targetClass pbo:DecisionGate ; |
| 154 | sh:property [ sh:path pbo:gateCondition ; sh:datatype xsd:string ; sh:minCount 1 ; sh:maxCount 1 ] , |
| 155 | [ sh:path pbo:gateRequiresAuthorisationType ; sh:class pbo:AuthorisationType ] . |
| 156 | |
| 157 | pbo:ServiceShape a sh:NodeShape ; |
| 158 | sh:targetClass pbo:Service ; |
| 159 | sh:property [ sh:path pbo:hasFeeModel ; sh:class pbo:FeeModel ; sh:minCount 1 ] , |
| 160 | [ sh:path pbo:feePercentOfRent ; sh:or ( [ sh:datatype xsd:decimal ] [ sh:datatype xsd:integer ] ) ; sh:maxCount 1 ; sh:minInclusive 0 ; sh:maxInclusive 100 ] . |
| 161 | |
| 162 | pbo:SourceDocumentShape a sh:NodeShape ; |
| 163 | sh:targetClass pbo:SourceDocument ; |
| 164 | sh:property [ sh:path pbo:authorityLevel ; sh:datatype xsd:string ; sh:minCount 1 ; sh:maxCount 1 ; |
| 165 | sh:in ( "normative" "authoritative" "primary" "secondary" "expert" "reference" "illustrative" ) ] , |
| 166 | [ sh:path pbo:sourceUrl ; sh:datatype xsd:anyURI ; sh:maxCount 1 ] , |
| 167 | [ sh:path pbo:publicationDate ; sh:datatype xsd:date ; sh:maxCount 1 ] . |
| 168 | |
| 169 | pbo:StructureCharacteristicShape a sh:NodeShape ; |
| 170 | sh:targetClass pbo:StructureCharacteristic ; |
| 171 | sh:property [ sh:path pbo:characteristicNote ; sh:datatype xsd:string ; sh:minCount 1 ; sh:maxCount 1 ] , |
| 172 | [ sh:path pbo:assertedIn ; sh:class pbo:SourceDocument ; sh:minCount 1 ; sh:message "A structure characteristic must cite the source document that states it." ] . |
| 173 | |
| 174 | pbo:ProjectPhaseShape a sh:NodeShape ; |
| 175 | sh:targetClass pbo:ProjectPhase ; |
| 176 | sh:property [ sh:path pbo:phaseOrder ; sh:datatype xsd:integer ; sh:maxCount 1 ] . |
| 177 | |
| 178 | pbo:DevelopmentProjectShape a sh:NodeShape ; |
| 179 | sh:targetClass pbo:DevelopmentProject ; |
| 180 | sh:property [ sh:path pbo:hasPhase ; sh:class pbo:ProjectPhase ; sh:minCount 1 ] , |
| 181 | [ sh:path pbo:concernsAsset ; sh:class pbo:PropertyAsset ; sh:minCount 1 ] . |