diff --git a/ontologies/223p.ttl b/ontologies/223p.ttl index a6975cc..30c6843 100644 --- a/ontologies/223p.ttl +++ b/ontologies/223p.ttl @@ -99,27 +99,27 @@ s223:SymmetricProperty a rdfs:Class, sh:path s223:hasProperty ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:QuantifiableActuatableProperty ; - sh:node [ sh:property [ sh:hasValue s223:EnumerationKind-Position ; + sh:node [ sh:property [ sh:hasValue ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:hasAspect ], - [ sh:hasValue ; + sh:path ns1:hasQuantityKind ], + [ sh:hasValue s223:EnumerationKind-Position ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path ns1:hasQuantityKind ] ] ] ; + sh:path s223:hasAspect ] ] ] ; sh:severity s223:g36 ] ] [ sh:property [ rdfs:comment "A damper shall have at least one analog damper command property or at least two binary damper command properties using the relation hasProperty."^^xsd:string ; sh:minCount 2 ; sh:path s223:hasProperty ; sh:qualifiedMinCount 2 ; sh:qualifiedValueShape [ sh:class s223:EnumeratedActuatableProperty ; - sh:node [ sh:property [ sh:hasValue s223:EnumerationKind-Position ; + sh:node [ sh:property [ sh:hasValue s223:EnumerationKind-Binary ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:hasAspect ], - [ sh:hasValue s223:EnumerationKind-Binary ; + sh:path s223:hasEnumerationKind ], + [ sh:hasValue s223:EnumerationKind-Position ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:hasEnumerationKind ] ] ] ; + sh:path s223:hasAspect ] ] ] ; sh:severity s223:g36 ] ] ) ; sh:severity s223:g36 ; sh:targetClass . @@ -255,14 +255,14 @@ s223:SymmetricProperty a rdfs:Class, sh:path s223:hasProperty ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:EnumeratedActuatableProperty ; - sh:node [ sh:property [ sh:class s223:EnumerationKind-Binary ; + sh:node [ sh:property [ sh:hasValue s223:EnumerationKind-Position ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:hasEnumerationKind ], - [ sh:hasValue s223:EnumerationKind-Position ; + sh:path s223:hasAspect ], + [ sh:class s223:EnumerationKind-Binary ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:hasAspect ] ] ] ; + sh:path s223:hasEnumerationKind ] ] ] ; sh:severity s223:g36 ] ; sh:severity s223:g36 . @@ -283,22 +283,33 @@ s223:SymmetricProperty a rdfs:Class, sh:minCount 1 ; sh:path s223:hasEnumerationKind ] ] ] ; sh:severity sh:Info ], - [ rdfs:comment "A Zone shall have a zone temperature setpoint adjustment property using the relation hasProperty, if applicable."^^xsd:string ; - sh:message "g36: A Zone shall have a zone temperature setpoint adjustment property using the relation hasProperty, if applicable."^^xsd:string ; + [ rdfs:comment "A Zone shall have at least a zone CO2 concentration property using the relation hasProperty, if applicable control is used."^^xsd:string ; + sh:message "g36: A Zone shall have at least a zone CO2 concentration property using the relation hasProperty, if applicable control is used."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasProperty ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:QuantifiableObservableProperty ; - sh:node [ sh:property [ sh:hasValue ; + sh:node [ sh:property [ sh:hasValue ; sh:maxCount 1 ; sh:minCount 1 ; sh:path ns1:hasQuantityKind ], - [ sh:hasValue s223:Dimensioned-Delta ; + [ sh:hasValue s223:Constituent-CO2 ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:hasAspect ] ] ] ; - sh:qualifiedValueShapesDisjoint true ; + sh:path s223:ofConstituent ] ] ] ; sh:severity sh:Info ], + [ rdfs:comment "A Zone shall have at least one zone temperature property using the relation hasProperty. "^^xsd:string ; + sh:message "g36: A Zone shall have at least one zone temperature property using the relation hasProperty. "^^xsd:string ; + sh:minCount 1 ; + sh:path s223:hasProperty ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:QuantifiableObservableProperty ; + sh:node [ sh:property [ sh:hasValue ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path ns1:hasQuantityKind ] ] ] ; + sh:qualifiedValueShapesDisjoint true ; + sh:severity s223:g36 ], [ rdfs:comment "A Zone shall have at least one zone thermostat override switch property using the relation hasProperty."^^xsd:string ; sh:message "g36: A Zone shall have at least one zone thermostat override switch property using the relation hasProperty."^^xsd:string ; sh:minCount 1 ; @@ -316,21 +327,6 @@ s223:SymmetricProperty a rdfs:Class, sh:minCount 1 ; sh:path s223:hasDomain ; sh:severity s223:g36 ], - [ rdfs:comment "A Zone shall have at least a zone CO2 concentration property using the relation hasProperty, if applicable control is used."^^xsd:string ; - sh:message "g36: A Zone shall have at least a zone CO2 concentration property using the relation hasProperty, if applicable control is used."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasProperty ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:QuantifiableObservableProperty ; - sh:node [ sh:property [ sh:hasValue s223:Constituent-CO2 ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:path s223:ofConstituent ], - [ sh:hasValue ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:path ns1:hasQuantityKind ] ] ] ; - sh:severity sh:Info ], [ rdfs:comment "A Zone shall have at least one window switch on-off property using the relation hasProperty."^^xsd:string ; sh:message "g36: A Zone shall have at least one window switch on-off property using the relation hasProperty."^^xsd:string ; sh:minCount 1 ; @@ -345,8 +341,8 @@ s223:SymmetricProperty a rdfs:Class, sh:class s223:Window ; sh:path [ sh:alternativePath ( ( [ sh:inversePath s223:observes ] s223:hasMeasurementLocation ) [ sh:inversePath s223:hasProperty ] ) ] ] ] ] ; sh:severity sh:Info ], - [ rdfs:comment "A Zone shall have at least one zone temperature property using the relation hasProperty. "^^xsd:string ; - sh:message "g36: A Zone shall have at least one zone temperature property using the relation hasProperty. "^^xsd:string ; + [ rdfs:comment "A Zone shall have a zone temperature setpoint adjustment property using the relation hasProperty, if applicable."^^xsd:string ; + sh:message "g36: A Zone shall have a zone temperature setpoint adjustment property using the relation hasProperty, if applicable."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasProperty ; sh:qualifiedMinCount 1 ; @@ -354,9 +350,13 @@ s223:SymmetricProperty a rdfs:Class, sh:node [ sh:property [ sh:hasValue ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path ns1:hasQuantityKind ] ] ] ; + sh:path ns1:hasQuantityKind ], + [ sh:hasValue s223:Dimensioned-Delta ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasAspect ] ] ] ; sh:qualifiedValueShapesDisjoint true ; - sh:severity s223:g36 ] ; + sh:severity sh:Info ] ; sh:severity s223:g36 . a s223:Class, @@ -365,17 +365,17 @@ s223:SymmetricProperty a rdfs:Class, rdfs:label "Zone Group"^^xsd:string ; rdfs:comment "A ZoneGroup is a grouping of zones that may be scheduled together. Zone groupings must be assigned based on rules in section 3.1.3 of Guideline 36."^^xsd:string ; rdfs:subClassOf s223:ZoneGroup ; - sh:property [ rdfs:comment "A ZoneGroup shall contain at least one Zone using the relation contains."^^xsd:string ; - sh:class ; - sh:message "g36: A ZoneGroup shall contain at least one Zone using the relation contains."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:contains ; - sh:severity s223:g36 ], - [ rdfs:comment "A ZoneGroup shall have the Domain HVAC using the relation hasDomain."^^xsd:string ; + sh:property [ rdfs:comment "A ZoneGroup shall have the Domain HVAC using the relation hasDomain."^^xsd:string ; sh:hasValue s223:Domain-HVAC ; sh:message "g36: A ZoneGroup shall have the Domain HVAC using the relation hasDomain."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasDomain ; + sh:severity s223:g36 ], + [ rdfs:comment "A ZoneGroup shall contain at least one Zone using the relation contains."^^xsd:string ; + sh:class ; + sh:message "g36: A ZoneGroup shall contain at least one Zone using the relation contains."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:contains ; sh:severity s223:g36 ] ; sh:severity s223:g36 . @@ -1244,23 +1244,11 @@ s223:BACnetExternalReference a s223:Class, rdfs:comment "BACnetExternalReference is a subclass of ExternalReference that contains BACnet protocol parameter values necessary to associate a property with a value."^^xsd:string ; rdfs:subClassOf s223:ExternalReference ; sh:property [ a sh:PropertyShape ; - rdfs:comment "If the relation object-name is present it associates the external reference with the BACnet object having the specific object name."^^xsd:string ; - sh:datatype xsd:string ; - sh:maxCount 1 ; - sh:minCount 0 ; - sh:path ], - [ a sh:PropertyShape ; - rdfs:comment "If the relation device-name is present it associates the external reference with a BACnet device having the specific device name."^^xsd:string ; - sh:datatype xsd:string ; - sh:maxCount 1 ; - sh:minCount 0 ; - sh:path ], - [ a sh:PropertyShape ; - rdfs:comment "If the relation device-identifier is present it associates the external reference with a BACnet device having the specific device identifier."^^xsd:string ; + rdfs:comment "If the relation object-identifier is present it associates the external reference with the BACnet object having the specific object identifier."^^xsd:string ; sh:datatype xsd:string ; sh:maxCount 1 ; sh:minCount 0 ; - sh:path ; + sh:path ; sh:pattern "^[A-Za-z0-9-]+,[1-9][0-9]*$"^^xsd:string ], [ a sh:PropertyShape ; rdfs:comment "If the relation priority-for-writing is present it provides the priority for writing values to the object."^^xsd:string ; @@ -1268,6 +1256,12 @@ s223:BACnetExternalReference a s223:Class, sh:maxCount 1 ; sh:minCount 0 ; sh:path ], + [ a sh:PropertyShape ; + rdfs:comment "If the relation device-name is present it associates the external reference with a BACnet device having the specific device name."^^xsd:string ; + sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:path ], [ a sh:PropertyShape ; rdfs:comment "If the relation property-identifier is present it is either a decimal number or exactly equal to the ASHRAE 135-2020 Clause 21 identifier text of BACnetPropertyIdentifier. If it is omitted, it defaults to \"present-value\" except for BACnet File objects, where absence of property-identifier refers to the entire content of the file accessed with Stream Access."^^xsd:string ; sh:datatype xsd:string ; @@ -1281,12 +1275,18 @@ s223:BACnetExternalReference a s223:Class, sh:minCount 0 ; sh:path ], [ a sh:PropertyShape ; - rdfs:comment "If the relation object-identifier is present it associates the external reference with the BACnet object having the specific object identifier."^^xsd:string ; + rdfs:comment "If the relation device-identifier is present it associates the external reference with a BACnet device having the specific device identifier."^^xsd:string ; sh:datatype xsd:string ; sh:maxCount 1 ; sh:minCount 0 ; - sh:path ; - sh:pattern "^[A-Za-z0-9-]+,[1-9][0-9]*$"^^xsd:string ] . + sh:path ; + sh:pattern "^[A-Za-z0-9-]+,[1-9][0-9]*$"^^xsd:string ], + [ a sh:PropertyShape ; + rdfs:comment "If the relation object-name is present it associates the external reference with the BACnet object having the specific object name."^^xsd:string ; + sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:path ] . s223:BatteryCPShape a sh:NodeShape ; rdfs:label "Battery CP Shape"^^xsd:string ; @@ -1333,7 +1333,14 @@ s223:ChilledBeam a s223:Class, rdfs:label "Chilled beam"^^xsd:string ; rdfs:comment "A structure with a colder surface temperature where air passes through, and air movement is induced in the room to achieve cooling. Cooling medium is generally water."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A ChilledBeam shall have at least one inlet using the medium Water."^^xsd:string ; + sh:property [ rdfs:comment "A ChilledBeam shall have at least one outlet using the medium Water."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Fluid-Water ; + sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "A ChilledBeam shall have at least one inlet using the medium Water."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; @@ -1344,14 +1351,7 @@ s223:ChilledBeam a s223:Class, sh:minCount 1 ; sh:path s223:hasRole ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Role-Cooling ] ], - [ rdfs:comment "A ChilledBeam shall have at least one outlet using the medium Water."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Fluid-Water ; - sh:path s223:hasMedium ] ] ] ] . + sh:qualifiedValueShape [ sh:class s223:Role-Cooling ] ] . s223:Chiller a s223:Class, sh:NodeShape ; @@ -1375,10 +1375,10 @@ s223:Chiller a s223:Class, s223:ClosedWorldShape a sh:NodeShape ; rdfs:label "Closed World Shape"^^xsd:string ; - rdfs:comment "Ensure that all instances of a class use only the properties defined for that class."^^xsd:string ; - sh:severity sh:Info ; + rdfs:comment "Ensure that all instances of an s223 class use only the properties defined for that class. Note that this only applies to s223 and QUDT properties."^^xsd:string ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Ensure that all instances of a class use only the properties defined for that class."^^xsd:string ; + rdfs:comment """Ensure that all instances of an s223 class use only the properties defined for that class. Note that +properties from other namespaces are not checked by this validation."""^^xsd:string ; sh:message "s223: Predicate {?p} is not defined for instance {$this}."^^xsd:string ; sh:prefixes ; sh:select """ @@ -1419,7 +1419,10 @@ s223:Compressor a s223:Class, s223:ConcentrationSensor a s223:Class, sh:NodeShape ; rdfs:label "Concentration sensor"^^xsd:string ; - rdfs:comment "A ConcentrationSensor is a specialization of a Sensor that observes a QuantifiableObservableProperty that represents the concentration of a substance in a medium."^^xsd:string ; + rdfs:comment """A ConcentrationSensor is a specialization of a Sensor that observes a QuantifiableObservableProperty +that represents the concentration of a miscible Constituent in a medium, in contrast to a ParticulateSensor that observes the amount of a particulate in a medium +(see `s223:ParticulateSensor`). The 223 standard does not constrain the unit or quantity kind reported by a ConcentrationSensor, but possible +quantity kinds include Concentration (moles per volume), Density (mass per volume), MoleFraction, and VolumeFraction."""^^xsd:string ; rdfs:subClassOf s223:Sensor . s223:ConnectionCnxShape a sh:NodeShape ; @@ -1628,19 +1631,19 @@ s223:ElectricOutlet a s223:Class, rdfs:label "Electric outlet"^^xsd:string ; rdfs:comment "A device to which a piece of electrical equipment can be connected in order to provide it with electricity"^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "An ElectricOutlet shall have at least one outlet using the medium Electricity."^^xsd:string ; + sh:property [ rdfs:comment "An ElectricOutlet shall have exactly one inlet using the medium Electricity."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; + sh:qualifiedMaxCount 1 ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Constituent-Electricity ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "An ElectricOutlet shall have exactly one inlet using the medium Electricity."^^xsd:string ; + [ rdfs:comment "An ElectricOutlet shall have at least one outlet using the medium Electricity."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; - sh:qualifiedMaxCount 1 ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Constituent-Electricity ; sh:path s223:hasMedium ] ] ] ] . @@ -1669,50 +1672,50 @@ s223:ElectricWire a s223:Class, rdfs:label "Electric wire"^^xsd:string ; rdfs:comment "An ElectricWire is a subclass of Connection, that represents one or more electrical conductors used to convey electricity."^^xsd:string ; rdfs:subClassOf s223:Connection ; - sh:property [ rdfs:comment "An ElectricWire must be associated with exactly one Constituent-Electricity using the relation hasMedium."^^xsd:string ; + sh:property [ rdfs:comment "If the relation hasElectricalPhase is present it must associate the ElectricWire with an ElectricalPhaseIdentifier or ElectricalVoltagePhases."^^xsd:string ; + sh:or ( [ sh:class s223:Aspect-ElectricalPhaseIdentifier ] [ sh:class s223:Aspect-ElectricalVoltagePhases ] ) ; + sh:path s223:hasElectricalPhase ], + [ rdfs:comment "An ElectricWire must be associated with exactly one Constituent-Electricity using the relation hasMedium."^^xsd:string ; sh:class s223:Constituent-Electricity ; sh:maxCount 1 ; sh:message "s223: An ElectricWire must be associated with exactly one Constituent-Electricity using the relation hasMedium."^^xsd:string ; sh:minCount 1 ; - sh:path s223:hasMedium ], - [ rdfs:comment "If the relation hasElectricalPhase is present it must associate the ElectricWire with an ElectricalPhaseIdentifier or ElectricalVoltagePhases."^^xsd:string ; - sh:or ( [ sh:class s223:Aspect-ElectricalPhaseIdentifier ] [ sh:class s223:Aspect-ElectricalVoltagePhases ] ) ; - sh:path s223:hasElectricalPhase ] . + sh:path s223:hasMedium ] . s223:FanCoilUnit a s223:Class, sh:NodeShape ; rdfs:label "Fan coil unit"^^xsd:string ; rdfs:comment "A device consisting of a heat exchanger (coil) and a fan to regulate the temperature of one or more spaces."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A FanCoilUnit shall have at least one outlet using the medium Air."^^xsd:string ; + sh:property [ rdfs:comment "A FanCoilUnit must be associated with at least 1 Coil using the relation contains."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:contains ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Coil ] ], + [ rdfs:comment "A FanCoilUnit shall have at least one inlet using the medium Air."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A FanCoilUnit must be associated with at least 1 Coil using the relation contains."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:contains ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Coil ] ], - [ rdfs:comment "A FanCoilUnit must at least have the role Role-Heating or Role-Cooling."^^xsd:string ; + [ rdfs:comment "A FanCoilUnit shall have at least one outlet using the medium Air."^^xsd:string ; sh:minCount 1 ; - sh:path s223:hasRole ; + sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:in ( s223:Role-Heating s223:Role-Cooling ) ] ], + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Fluid-Air ; + sh:path s223:hasMedium ] ] ] ], [ rdfs:comment "A FanCoilUnit must be associated with at least 1 Fan using the relation contains."^^xsd:string ; sh:minCount 1 ; sh:path s223:contains ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:Fan ] ], - [ rdfs:comment "A FanCoilUnit shall have at least one inlet using the medium Air."^^xsd:string ; + [ rdfs:comment "A FanCoilUnit must at least have the role Role-Heating or Role-Cooling."^^xsd:string ; sh:minCount 1 ; - sh:path s223:hasConnectionPoint ; + sh:path s223:hasRole ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Fluid-Air ; - sh:path s223:hasMedium ] ] ] ] . + sh:qualifiedValueShape [ sh:in ( s223:Role-Heating s223:Role-Cooling ) ] ] . s223:FanPoweredTerminal a s223:Class, sh:NodeShape ; @@ -1730,7 +1733,17 @@ s223:Filter a s223:Class, rdfs:label "Filter"^^xsd:string ; rdfs:comment "A device that removes contaminants from gases or liquids."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A filter should have one common constituent between the inlet and outlet"^^xsd:string ; + sh:property [ rdfs:comment "A Filter shall have at least one inlet ConnectionPoint."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ], + [ rdfs:comment "A Filter shall have at least one outlet."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ], + [ rdfs:comment "A filter should have one common constituent between the inlet and outlet"^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:severity sh:Warning ; sh:sparql [ a sh:SPARQLConstraint ; @@ -1805,17 +1818,7 @@ FILTER NOT EXISTS {?m2 s223:composedOf ?c2} FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) . FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) . } -"""^^xsd:string ] ], - [ rdfs:comment "A Filter shall have at least one outlet."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ], - [ rdfs:comment "A Filter shall have at least one inlet ConnectionPoint."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ] . +"""^^xsd:string ] ] . s223:FlowSensor a s223:Class, sh:NodeShape ; @@ -1862,18 +1865,18 @@ s223:Furnace a s223:Class, rdfs:label "Furnace"^^xsd:string ; rdfs:comment "An enclosed chamber or structure in which heat is produced, as by burning fuel or by converting electrical energy. "^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A Furnace shall have at least one outlet using the medium Air."^^xsd:string ; + sh:property [ rdfs:comment "A Furnace shall have at least one inlet using the medium Air."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Furnace shall have at least one inlet using the medium Air."^^xsd:string ; + [ rdfs:comment "A Furnace shall have at least one outlet using the medium Air."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Air ; sh:path s223:hasMedium ] ] ] ] . @@ -1897,18 +1900,18 @@ s223:HeatPump a s223:Class, rdfs:label "HeatPump"^^xsd:string ; rdfs:comment "A device that can heat or cool by transferring thermal energy using a reversible refrigeration cycle."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A HeatPump shall have at least one outlet using the medium Air."^^xsd:string ; + sh:property [ rdfs:comment "A HeatPump shall have at least one inlet using the medium Air."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A HeatPump shall have at least one inlet using the medium Air."^^xsd:string ; + [ rdfs:comment "A HeatPump shall have at least one outlet using the medium Air."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Air ; sh:path s223:hasMedium ] ] ] ] . @@ -1969,19 +1972,19 @@ s223:Inverter a s223:Class, rdfs:label "Inverter"^^xsd:string ; rdfs:comment "An electric energy converter that changes direct electric current to alternating current."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "An Inverter shall have at least one outlet using the medium Electricity-AC."^^xsd:string ; + sh:property [ rdfs:comment "An Inverter shall have at least one inlet using the medium Electricity-DC."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Electricity-AC ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Electricity-DC ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "An Inverter shall have at least one inlet using the medium Electricity-DC."^^xsd:string ; + [ rdfs:comment "An Inverter shall have at least one outlet using the medium Electricity-AC."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Electricity-DC ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Electricity-AC ; sh:path s223:hasMedium ] ] ] ] . s223:JunctionCPShape a sh:NodeShape ; @@ -2059,12 +2062,12 @@ s223:OccupantCounter a s223:Class, sh:class s223:QuantifiableObservableProperty ; sh:message "s223: An OccupantCounter must always observe a QuantifiableObservableProperty that has a QuantityKind of Population and a Unit of unit:NUM."^^xsd:string ; sh:minCount 1 ; - sh:node [ sh:property [ sh:hasValue ; + sh:node [ sh:property [ sh:hasValue ; sh:maxCount 1 ; - sh:path ns1:hasQuantityKind ], - [ sh:hasValue ; + sh:path ns1:hasUnit ], + [ sh:hasValue ; sh:maxCount 1 ; - sh:path ns1:hasUnit ] ] ; + sh:path ns1:hasQuantityKind ] ] ; sh:path s223:observes ] . s223:OccupantMotionSensor a s223:Class, @@ -2104,7 +2107,15 @@ s223:OutdoorPhysicalSpace a s223:Class, s223:ParticulateSensor a s223:Class, sh:NodeShape ; rdfs:label "Particulate sensor"^^xsd:string ; - rdfs:comment "A ParticulateSensor is a specialization of a Sensor that observes a QuantifiableObservableProperty that represents a particulate concentration measurement."^^xsd:string ; + rdfs:comment """A ParticulateSensor is a specialization of a Sensor that observes a QuantifiableObservableProperty +that represents the amount of a particulate in a medium, in contrast to a ConcentrationSensor that observes the concentration +of a miscible Constituent in a medium (see `s223:ConcentrationSensor`). The 223 standard does not constrain the unit or +quantity kind reported by a ParticulateSensor, but possible quantity kinds include Density (mass per volume), +ParticleNumberDensity (count per volume) DimensionlessRatio (with units such as PPM or PPB). Some sensors may claim to report +a raw count of particles, for which a quantity kind of Count could be used, but the required context for such a measurement +should be provided in the sensor's documentation to specify if it in fact measures a count per volume, time, or some other combination. +Explicitly declaring the quantity kind of a sensor's output is preferable to relying on implicit assumptions. +"""^^xsd:string ; rdfs:subClassOf s223:Sensor ; sh:property [ rdfs:comment "If the relation ofSubstance is present it must associate the ParticulateSensor with a Substance-Particulate."^^xsd:string ; sh:class s223:Substance-Particulate ; @@ -2143,17 +2154,17 @@ s223:PowerOverEthernetSwitch a s223:Class, rdfs:label "Power Over Ethernet Switch"^^xsd:string ; rdfs:comment "A type of network hardware that connects and is capable of powering cabled devices, such as computers and Wi-Fi access points, in an Ethernet LAN so they can communicate with each other and to the internet."^^xsd:string ; rdfs:subClassOf s223:EthernetSwitch ; - sh:property [ rdfs:comment "A PowerOverEthernetSwitch shall have at least one inlet using the medium Electricity."^^xsd:string ; + sh:property [ rdfs:comment "A PowerOverEthernetSwitch shall have at least one BidirectionalConnectionPoint using the medium PowerAndSignal-PoE."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Constituent-Electricity ; + sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ; + sh:node [ sh:property [ sh:class s223:PowerAndSignal-PoE ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A PowerOverEthernetSwitch shall have at least one BidirectionalConnectionPoint using the medium Electricity-PoE."^^xsd:string ; + [ rdfs:comment "A PowerOverEthernetSwitch shall have at least one inlet using the medium Electricity."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ; - sh:node [ sh:property [ sh:class s223:PowerAndSignal-PoE ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Constituent-Electricity ; sh:path s223:hasMedium ] ] ] ] . s223:PressureSensor a s223:Class, @@ -2233,14 +2244,14 @@ s223:RadiantPanelInletShape a sh:NodeShape ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Water ; sh:path s223:hasMedium ] ] ] ], [ rdfs:comment "A radiant panel shall have at least one inlet using the medium Electricity, NaturalGas, or inlet and outlet of Water."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Water ; sh:path s223:hasMedium ] ] ] ] ] ) ; sh:severity sh:Warning ; @@ -2276,38 +2287,39 @@ s223:RadiatorInletShape a sh:NodeShape ; s223:RequiredCommentsShape a sh:NodeShape ; sh:severity sh:Info ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Ensure that every SPARQLRule must have an rdfs:comment. "^^xsd:string ; - sh:message "s223: Every SPARQLRule for Class {$this} must have an rdfs:comment."^^xsd:string ; + rdfs:comment "Ensure that every TripleRule must have an rdfs:comment. "^^xsd:string ; + sh:message "s223: The TripleRule inferring {?pred} for Class {$this} must have an rdfs:comment."^^xsd:string ; sh:prefixes ; sh:select """ -SELECT $this +SELECT $this ?pred WHERE { $this sh:rule ?rule . -?rule a sh:SPARQLRule . +?rule a sh:TripleRule . +?rule sh:predicate ?pred . FILTER NOT EXISTS {?rule rdfs:comment ?comment} . } """^^xsd:string ], [ a sh:SPARQLConstraint ; - rdfs:comment "Every class of the 223 standard must also be an instance of sh:NodeShape. "^^xsd:string ; - sh:message "s223: Class {$this} must be declared as an instance of sh:NodeShape."^^xsd:string ; + rdfs:comment "Every class of the 223 standard must have an rdfs:comment. "^^xsd:string ; + sh:message "s223: Class {$this} must have an rdfs:comment."^^xsd:string ; sh:prefixes ; sh:select """ SELECT $this WHERE { -FILTER NOT EXISTS {$this a sh:NodeShape} . +FILTER NOT EXISTS {$this rdfs:comment ?comment} . } """^^xsd:string ], [ a sh:SPARQLConstraint ; - rdfs:comment "Ensure that every TripleRule must have an rdfs:comment. "^^xsd:string ; - sh:message "s223: The TripleRule inferring {?pred} for Class {$this} must have an rdfs:comment."^^xsd:string ; + rdfs:comment "Ensure that any property shape must have an rdfs:comment. "^^xsd:string ; + sh:message "s223: The SPARQLConstraint for path {?path} for Class {$this} must have an rdfs:comment."^^xsd:string ; sh:prefixes ; sh:select """ -SELECT $this ?pred +SELECT $this ?path WHERE { -$this sh:rule ?rule . -?rule a sh:TripleRule . -?rule sh:predicate ?pred . -FILTER NOT EXISTS {?rule rdfs:comment ?comment} . +$this sh:property ?propshape . +?propshape sh:sparql ?sparqlconstraint . +?propshape sh:path ?path . +FILTER NOT EXISTS {?sparqlconstraint rdfs:comment ?comment} . } """^^xsd:string ], [ a sh:SPARQLConstraint ; @@ -2322,38 +2334,37 @@ FILTER NOT EXISTS {$this rdfs:subClassOf* s223:Concept} . } """^^xsd:string ], [ a sh:SPARQLConstraint ; - rdfs:comment "Every class of the 223 standard must have an rdfs:comment. "^^xsd:string ; - sh:message "s223: Class {$this} must have an rdfs:comment."^^xsd:string ; + rdfs:comment "Ensure that every SPARQLRule must have an rdfs:comment. "^^xsd:string ; + sh:message "s223: Every SPARQLRule for Class {$this} must have an rdfs:comment."^^xsd:string ; sh:prefixes ; sh:select """ SELECT $this WHERE { -FILTER NOT EXISTS {$this rdfs:comment ?comment} . +$this sh:rule ?rule . +?rule a sh:SPARQLRule . +FILTER NOT EXISTS {?rule rdfs:comment ?comment} . } """^^xsd:string ], [ a sh:SPARQLConstraint ; rdfs:comment "Ensure that any property shape must have an rdfs:comment. "^^xsd:string ; - sh:message "s223: The SPARQLConstraint for path {?path} for Class {$this} must have an rdfs:comment."^^xsd:string ; + sh:message "s223: The property shape with path {?path} for Class {$this} must have an rdfs:comment."^^xsd:string ; sh:prefixes ; sh:select """ SELECT $this ?path WHERE { $this sh:property ?propshape . -?propshape sh:sparql ?sparqlconstraint . ?propshape sh:path ?path . -FILTER NOT EXISTS {?sparqlconstraint rdfs:comment ?comment} . +FILTER NOT EXISTS {?propshape rdfs:comment ?comment} . } """^^xsd:string ], [ a sh:SPARQLConstraint ; - rdfs:comment "Ensure that any property shape must have an rdfs:comment. "^^xsd:string ; - sh:message "s223: The property shape with path {?path} for Class {$this} must have an rdfs:comment."^^xsd:string ; + rdfs:comment "Every class of the 223 standard must also be an instance of sh:NodeShape. "^^xsd:string ; + sh:message "s223: Class {$this} must be declared as an instance of sh:NodeShape."^^xsd:string ; sh:prefixes ; sh:select """ -SELECT $this ?path +SELECT $this WHERE { -$this sh:property ?propshape . -?propshape sh:path ?path . -FILTER NOT EXISTS {?propshape rdfs:comment ?comment} . +FILTER NOT EXISTS {$this a sh:NodeShape} . } """^^xsd:string ] ; sh:targetClass s223:Class . @@ -2374,19 +2385,19 @@ s223:SolarThermalCollector a s223:Class, rdfs:label "Solar thermal collector"^^xsd:string ; rdfs:comment "A device that converts sunlight into thermal energy."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A SolarThermalCollector shall have at least one outlet using the medium Water."^^xsd:string ; + sh:property [ rdfs:comment "A SolarThermalCollector shall have at least one inlet using the medium EM-Light."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Fluid-Water ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:EM-Light ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A SolarThermalCollector shall have at least one inlet using the medium EM-Light."^^xsd:string ; + [ rdfs:comment "A SolarThermalCollector shall have at least one outlet using the medium Water."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:EM-Light ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Fluid-Water ; sh:path s223:hasMedium ] ] ] ] . s223:SymmetricPropertyShape a sh:NodeShape ; @@ -2462,16 +2473,16 @@ s223:TwoWayValve a s223:Class, rdfs:label "Two way valve"^^xsd:string ; rdfs:comment "A Valve that can divert a fluid in one of two directions."^^xsd:string ; rdfs:subClassOf s223:Valve ; - sh:property [ rdfs:comment "A TwoWayValve shall have at least one outlet."^^xsd:string ; + sh:property [ rdfs:comment "A TwoWayValve shall have at least one inlet."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ], - [ rdfs:comment "A TwoWayValve shall have at least one inlet."^^xsd:string ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ], + [ rdfs:comment "A TwoWayValve shall have at least one outlet."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ] . + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ] . s223:ValveCPShape a sh:NodeShape ; rdfs:label "Valve"^^xsd:string ; @@ -2481,13 +2492,13 @@ s223:ValveCPShape a sh:NodeShape ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ; sh:qualifiedValueShapesDisjoint true ], [ rdfs:comment "A Valve shall have at least one inlet and one outlet or two bidirectional connection points."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ; sh:qualifiedValueShapesDisjoint true ] ] [ sh:property [ rdfs:comment "A Valve shall have at least one inlet and one outlet or two bidirectional connection points."^^xsd:string ; sh:minCount 2 ; sh:path s223:hasConnectionPoint ; @@ -2502,10 +2513,7 @@ s223:VariableFrequencyDrive a s223:Class, rdfs:label "VariableFrequencyDrive"^^xsd:string ; rdfs:comment "An electronic device that varies its output frequency to vary the rotating speed of a motor, given a fixed input frequency. Used with fans or pumps to vary the flow in the system as a function of a maintained pressure."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "If the relation connectedTo is present it must associate the VariableFrequencyDrive with a Equipment."^^xsd:string ; - sh:class s223:Equipment ; - sh:path s223:connectedTo ], - [ rdfs:comment "A VariableFrequencyDrive shall have at least one outlet using the medium Electricity."^^xsd:string ; + sh:property [ rdfs:comment "A VariableFrequencyDrive shall have at least one outlet using the medium Electricity."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; @@ -2519,7 +2527,10 @@ s223:VariableFrequencyDrive a s223:Class, sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Constituent-Electricity ; sh:path s223:hasMedium ] ] ] ; - sh:severity sh:Warning ] . + sh:severity sh:Warning ], + [ rdfs:comment "If the relation connectedTo is present it must associate the VariableFrequencyDrive with a Equipment."^^xsd:string ; + sh:class s223:Equipment ; + sh:path s223:connectedTo ] . s223:WindowShade a s223:Class, sh:NodeShape ; @@ -19804,16 +19815,16 @@ s223:GlycolSolution-15Percent a s223:Class, sh:NodeShape ; rdfs:label "GlycolSolution-15Percent"^^xsd:string ; s223:composedOf [ a s223:QuantifiableProperty ; - rdfs:label "Glycol conc"^^xsd:string ; - s223:hasValue 15.0 ; - s223:ofConstituent s223:Constituent-Glycol ; - ns1:hasQuantityKind ; - ns1:hasUnit ], - [ a s223:QuantifiableProperty ; rdfs:label "Water conc"^^xsd:string ; s223:hasValue 85.0 ; s223:ofConstituent s223:Constituent-H2O ; ns1:hasQuantityKind ; + ns1:hasUnit ], + [ a s223:QuantifiableProperty ; + rdfs:label "Glycol conc"^^xsd:string ; + s223:hasValue 15.0 ; + s223:ofConstituent s223:Constituent-Glycol ; + ns1:hasQuantityKind ; ns1:hasUnit ] ; s223:hasFreezingPoint [ a s223:QuantifiableProperty ; rdfs:label "Freezing point"^^xsd:string ; @@ -19918,9 +19929,9 @@ s223:HeatExchanger a s223:Class, rdfs:label "Heat exchanger"^^xsd:string ; rdfs:comment "A component intended to transfer heat from one medium to another while keeping the two media separate."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A heat exchanger shall have at least 4 connection points."^^xsd:string ; - sh:minCount 4 ; - sh:path s223:hasConnectionPoint ], + sh:property [ rdfs:comment "If the relation hasRole is present it must associate the HeatExchanger with a EnumerationKind-Role."^^xsd:string ; + sh:class s223:EnumerationKind-Role ; + sh:path s223:hasRole ], [ rdfs:comment "Heat Exchangers should have the same number of non-electrical inlet and outlet connection points."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:severity sh:Warning ; @@ -19958,9 +19969,9 @@ GROUP BY $this FILTER (?incount != ?outcount) } """^^xsd:string ] ], - [ rdfs:comment "If the relation hasRole is present it must associate the HeatExchanger with a EnumerationKind-Role."^^xsd:string ; - sh:class s223:EnumerationKind-Role ; - sh:path s223:hasRole ] . + [ rdfs:comment "A heat exchanger shall have at least 4 connection points."^^xsd:string ; + sh:minCount 4 ; + sh:path s223:hasConnectionPoint ] . s223:Light-Infrared a s223:Class, s223:Light-Infrared, @@ -20116,37 +20127,6 @@ s223:Position-Unknown a s223:Class, rdfs:comment "Unknown"^^xsd:string ; rdfs:subClassOf s223:EnumerationKind-Position . -s223:PowerAndSignal-PoE a s223:Class, - s223:Electricity-PoE, - sh:NodeShape ; - rdfs:label "Power over Ethernet"^^xsd:string ; - s223:composedOf [ a s223:Property ; - rdfs:label "Unspecified"^^xsd:string ; - s223:ofConstituent s223:Electricity-DC ], - [ a s223:Property ; - rdfs:label "Unspecified"^^xsd:string ; - s223:ofConstituent s223:Signal-Ethernet ] ; - rdfs:comment "This class has enumerated subclasses of Power over Ethernet."^^xsd:string ; - rdfs:subClassOf s223:Mix-PowerAndSignal ; - sh:property [ rdfs:comment "One of the constituents of PoE must be Ethernet."^^xsd:string ; - sh:path s223:composedOf ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Property ; - sh:node [ sh:property [ rdfs:comment "One of the constituents of PoE must be Ethernet."^^xsd:string ; - sh:class s223:Signal-Ethernet ; - sh:path s223:ofConstituent ] ] ] ], - [ rdfs:comment "There must be at least two Properties that characterize the constituents of Power over Ethernet."^^xsd:string ; - sh:class s223:Property ; - sh:minCount 2 ; - sh:path s223:composedOf ], - [ rdfs:comment "One of the constituents of PoE must be DC electrical power."^^xsd:string ; - sh:path s223:composedOf ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Property ; - sh:node [ sh:property [ rdfs:comment "One of the constituents of PoE must be DC electrical power."^^xsd:string ; - sh:class s223:Electricity-DC ; - sh:path s223:ofConstituent ] ] ] ] . - s223:Presence-False a s223:Class, s223:Presence-False, sh:NodeShape ; @@ -20509,18 +20489,18 @@ s223:Window a s223:Class, rdfs:label "Window"^^xsd:string ; rdfs:comment "A daylight opening on a vertical or nearly vertical area of a room envelope."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A Window shall have at least one inlet using the medium Light."^^xsd:string ; + sh:property [ rdfs:comment "A Window shall have at least one outlet using the medium Light."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:EM-Light ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Window shall have at least one outlet using the medium Light."^^xsd:string ; + [ rdfs:comment "A Window shall have at least one inlet using the medium Light."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:EM-Light ; sh:path s223:hasMedium ] ] ] ] . @@ -20562,7 +20542,7 @@ s223:hasNumberOfElectricalPhases a rdf:Property ; s223:hasPhysicalLocation a rdf:Property ; rdfs:label "has Physical Location"^^xsd:string ; - rdfs:comment "The relation hasPhysicalLocation is used to indicate the PhysicalSpace (see `s223:PhysicalSpace`) where a piece of Equipment (see `s223:Equipment`) is located."^^xsd:string . + rdfs:comment "The relation hasPhysicalLocation is used to indicate the PhysicalSpace (see `s223:PhysicalSpace`) where a piece of Equipment (see `s223:Equipment`) is located. The physical location of a piece of equipment is not necessarily the same as the location affected by the operation of the equipment. For example, an air handler may physically be on the roof, but its effect is to provide conditioned air to a Zone or DomainSpace within the building. By following the path of Connections, it can be determined what other equipment or spaces are possibly impacted by the equipment."^^xsd:string . s223:hasSetpoint a rdf:Property ; rdfs:label "has setpoint"^^xsd:string ; @@ -20574,7 +20554,7 @@ s223:hasThermodynamicPhase a rdf:Property ; s223:ofMedium a rdf:Property ; rdfs:label "of medium"^^xsd:string ; - rdfs:comment "The relation ofMedium is used to associate a Property with a specific Medium."^^xsd:string . + rdfs:comment "The relation ofMedium is used to associate a Property with the specific Medium it describes. A property corresponding to the temperature of a medium would be associated with this medium using the relation ofMedium."^^xsd:string . rdfs:comment """This file can be used to control which extensions are to be loaded with the 223 ontology by importing the appropriate graph(s). Options include: For validation of the schema, model, or data - http://data.ashrae.org/standard223/1.0/validation/schema (or model or data). @@ -51515,20 +51495,22 @@ FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) . FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) . } """^^xsd:string ] ], - [ rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the associated Junction."^^xsd:string ; + [ rdfs:comment "Ensure that the Medium identified by all the associated ConnectionPoints via the s223:hasMedium relation are compatible with one another."^^xsd:string ; sh:name "Test for compatible declared Medium"^^xsd:string ; sh:path s223:hasMedium ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 4: Junction with constituents and an associated ConnectionPoint with constituents."^^xsd:string ; - sh:message "s223: Junction {$this} with Medium {?m2} is incompatible with {?cp} with Medium {?m1}."^^xsd:string ; + rdfs:comment "Inconsistent Medium. Case 3: Two ConnectionPoints with mediums with constituents."^^xsd:string ; + sh:message "s223: {?cp1} with Medium {?m1} is incompatible with {?cp2} with Medium {?m2}."^^xsd:string ; sh:prefixes ; sh:select """ -SELECT $this ?m2 ?cp ?m1 +SELECT $this ?cp1 ?m1 ?cp2 ?m2 WHERE { -$this s223:cnx ?cp . -?cp a/rdfs:subClassOf* s223:ConnectionPoint . -?cp s223:hasMedium ?m1 . -$this s223:hasMedium ?m2 . +$this s223:cnx ?cp1 . +?cp1 a/rdfs:subClassOf* s223:ConnectionPoint . +?cp1 s223:hasMedium ?m1 . +$this s223:cnx ?cp2 . +?cp2 a/rdfs:subClassOf* s223:ConnectionPoint . +?cp2 s223:hasMedium ?m2 . ?m1 s223:composedOf/s223:ofConstituent ?s1 . ?m2 s223:composedOf/s223:ofConstituent ?s2 . FILTER NOT EXISTS { @@ -51543,17 +51525,11 @@ $this s223:hasMedium ?m2 . } } """^^xsd:string ] ], - [ rdfs:comment "A Junction must be associated with exactly one EnumerationKind-Medium using the relation hasMedium."^^xsd:string ; - sh:class s223:Substance-Medium ; - sh:maxCount 1 ; - sh:message "s223: A Junction must be associated with exactly one EnumerationKind-Medium using the relation hasMedium."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasMedium ], [ rdfs:comment "Ensure that the Medium identified by all the associated ConnectionPoints via the s223:hasMedium relation are compatible with one another."^^xsd:string ; sh:name "Test for compatible declared Medium"^^xsd:string ; sh:path s223:hasMedium ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 1: Two ConnectionPoints with pure mediums."^^xsd:string ; + rdfs:comment "Inconsistent Medium. Case 2: Two ConnectionPoints with a medium with constituents and a pure Medium."^^xsd:string ; sh:message "s223: {?cp1} with Medium {?m1} is incompatible with {?cp2} with Medium {?m2}."^^xsd:string ; sh:prefixes ; sh:select """ @@ -51564,13 +51540,13 @@ $this s223:cnx ?cp1 . ?cp1 s223:hasMedium ?m1 . $this s223:cnx ?cp2 . ?cp2 a/rdfs:subClassOf* s223:ConnectionPoint . -FILTER (?cp1 != ?cp2 ) . ?cp2 s223:hasMedium ?m2 . -FILTER (?m1 != ?m2 ) . +?m2 s223:composedOf/s223:ofConstituent ?s2 . FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . -FILTER NOT EXISTS {?m2 s223:composedOf ?c2} -FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) . -FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) . +FILTER NOT EXISTS { + ?m2 s223:composedOf/s223:ofConstituent ?s12 . + {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} . +} } """^^xsd:string ] ], [ rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the associated Junction."^^xsd:string ; @@ -51599,7 +51575,7 @@ FILTER NOT EXISTS { sh:name "Test for compatible declared Medium"^^xsd:string ; sh:path s223:hasMedium ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 2: Two ConnectionPoints with a medium with constituents and a pure Medium."^^xsd:string ; + rdfs:comment "Inconsistent Medium. Case 1: Two ConnectionPoints with pure mediums."^^xsd:string ; sh:message "s223: {?cp1} with Medium {?m1} is incompatible with {?cp2} with Medium {?m2}."^^xsd:string ; sh:prefixes ; sh:select """ @@ -51610,7 +51586,35 @@ $this s223:cnx ?cp1 . ?cp1 s223:hasMedium ?m1 . $this s223:cnx ?cp2 . ?cp2 a/rdfs:subClassOf* s223:ConnectionPoint . +FILTER (?cp1 != ?cp2 ) . ?cp2 s223:hasMedium ?m2 . +FILTER (?m1 != ?m2 ) . +FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . +FILTER NOT EXISTS {?m2 s223:composedOf ?c2} +FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) . +FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) . +} +"""^^xsd:string ] ], + [ rdfs:comment "A Junction must be associated with exactly one EnumerationKind-Medium using the relation hasMedium."^^xsd:string ; + sh:class s223:Substance-Medium ; + sh:maxCount 1 ; + sh:message "s223: A Junction must be associated with exactly one EnumerationKind-Medium using the relation hasMedium."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:hasMedium ], + [ rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the associated Connection."^^xsd:string ; + sh:name "Test for compatible declared Medium"^^xsd:string ; + sh:path s223:hasMedium ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Inconsistent Medium. Case 3: Junction with a pure medium and an associated ConnectionPoint with constituents."^^xsd:string ; + sh:message "s223: Junction {$this} with Medium {?m1} is incompatible with {?cp} with Medium {?m2}."^^xsd:string ; + sh:prefixes ; + sh:select """ +SELECT $this ?m2 ?cp ?m1 +WHERE { +$this s223:cnx ?cp . +?cp a/rdfs:subClassOf* s223:ConnectionPoint . +?cp s223:hasMedium ?m2 . +$this s223:hasMedium ?m1 . ?m2 s223:composedOf/s223:ofConstituent ?s2 . FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . FILTER NOT EXISTS { @@ -51619,22 +51623,20 @@ FILTER NOT EXISTS { } } """^^xsd:string ] ], - [ rdfs:comment "Ensure that the Medium identified by all the associated ConnectionPoints via the s223:hasMedium relation are compatible with one another."^^xsd:string ; + [ rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the associated Junction."^^xsd:string ; sh:name "Test for compatible declared Medium"^^xsd:string ; sh:path s223:hasMedium ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 3: Two ConnectionPoints with mediums with constituents."^^xsd:string ; - sh:message "s223: {?cp1} with Medium {?m1} is incompatible with {?cp2} with Medium {?m2}."^^xsd:string ; + rdfs:comment "Inconsistent Medium. Case 4: Junction with constituents and an associated ConnectionPoint with constituents."^^xsd:string ; + sh:message "s223: Junction {$this} with Medium {?m2} is incompatible with {?cp} with Medium {?m1}."^^xsd:string ; sh:prefixes ; sh:select """ -SELECT $this ?cp1 ?m1 ?cp2 ?m2 +SELECT $this ?m2 ?cp ?m1 WHERE { -$this s223:cnx ?cp1 . -?cp1 a/rdfs:subClassOf* s223:ConnectionPoint . -?cp1 s223:hasMedium ?m1 . -$this s223:cnx ?cp2 . -?cp2 a/rdfs:subClassOf* s223:ConnectionPoint . -?cp2 s223:hasMedium ?m2 . +$this s223:cnx ?cp . +?cp a/rdfs:subClassOf* s223:ConnectionPoint . +?cp s223:hasMedium ?m1 . +$this s223:hasMedium ?m2 . ?m1 s223:composedOf/s223:ofConstituent ?s1 . ?m2 s223:composedOf/s223:ofConstituent ?s2 . FILTER NOT EXISTS { @@ -51648,28 +51650,6 @@ $this s223:cnx ?cp2 . {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} . } } -"""^^xsd:string ] ], - [ rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the associated Connection."^^xsd:string ; - sh:name "Test for compatible declared Medium"^^xsd:string ; - sh:path s223:hasMedium ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 3: Junction with a pure medium and an associated ConnectionPoint with constituents."^^xsd:string ; - sh:message "s223: Junction {$this} with Medium {?m1} is incompatible with {?cp} with Medium {?m2}."^^xsd:string ; - sh:prefixes ; - sh:select """ -SELECT $this ?m2 ?cp ?m1 -WHERE { -$this s223:cnx ?cp . -?cp a/rdfs:subClassOf* s223:ConnectionPoint . -?cp s223:hasMedium ?m2 . -$this s223:hasMedium ?m1 . -?m2 s223:composedOf/s223:ofConstituent ?s2 . -FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . -FILTER NOT EXISTS { - ?m2 s223:composedOf/s223:ofConstituent ?s12 . - {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} . -} -} """^^xsd:string ] ] . s223:Mix-PowerAndSignal a s223:Class, @@ -51693,6 +51673,37 @@ s223:Phase-Liquid a s223:Class, rdfs:comment "This class has enumerated subclasses of liquid in various thermodynamic states."^^xsd:string ; rdfs:subClassOf s223:EnumerationKind-Phase . +s223:PowerAndSignal-PoE a s223:Class, + s223:PowerAndSignal-PoE, + sh:NodeShape ; + rdfs:label "Power over Ethernet"^^xsd:string ; + s223:composedOf [ a s223:Property ; + rdfs:label "Unspecified"^^xsd:string ; + s223:ofConstituent s223:Signal-Ethernet ], + [ a s223:Property ; + rdfs:label "Unspecified"^^xsd:string ; + s223:ofConstituent s223:Electricity-DC ] ; + rdfs:comment "This class has enumerated subclasses of Power over Ethernet."^^xsd:string ; + rdfs:subClassOf s223:Mix-PowerAndSignal ; + sh:property [ rdfs:comment "One of the constituents of PoE must be Ethernet."^^xsd:string ; + sh:path s223:composedOf ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Property ; + sh:node [ sh:property [ rdfs:comment "One of the constituents of PoE must be Ethernet."^^xsd:string ; + sh:class s223:Signal-Ethernet ; + sh:path s223:ofConstituent ] ] ] ], + [ rdfs:comment "There must be at least two Properties that characterize the constituents of Power over Ethernet."^^xsd:string ; + sh:class s223:Property ; + sh:minCount 2 ; + sh:path s223:composedOf ], + [ rdfs:comment "One of the constituents of PoE must be DC electrical power."^^xsd:string ; + sh:path s223:composedOf ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Property ; + sh:node [ sh:property [ rdfs:comment "One of the constituents of PoE must be DC electrical power."^^xsd:string ; + sh:class s223:Electricity-DC ; + sh:path s223:ofConstituent ] ] ] ] . + s223:ResistanceHeater a s223:Class, sh:NodeShape ; rdfs:label "Electrical resistance heater"^^xsd:string ; @@ -51976,17 +51987,17 @@ s223:ZoneGroup a s223:Class, rdfs:label "Zone group"^^xsd:string ; rdfs:comment "A ZoneGroup is a logical grouping (collection) of Zones for some functional or system reason, to identify a domain of control, such as a Lighting Zone, or a heating zone."^^xsd:string ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "A ZoneGroup must be associated with exactly one EnumerationKind-Domain using the relation hasDomain."^^xsd:string ; + sh:property [ rdfs:comment "A ZoneGroup must be associated with at least one Zone using the relation hasZone."^^xsd:string ; + sh:class s223:Zone ; + sh:message "s223: A ZoneGroup must be associated with at least one Zone using the relation hasZone."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:hasZone ], + [ rdfs:comment "A ZoneGroup must be associated with exactly one EnumerationKind-Domain using the relation hasDomain."^^xsd:string ; sh:class s223:EnumerationKind-Domain ; sh:maxCount 1 ; sh:message "s223: A ZoneGroup must be associated with exactly one EnumerationKind-Domain using the relation hasDomain."^^xsd:string ; sh:minCount 1 ; - sh:path s223:hasDomain ], - [ rdfs:comment "A ZoneGroup must be associated with at least one Zone using the relation hasZone."^^xsd:string ; - sh:class s223:Zone ; - sh:message "s223: A ZoneGroup must be associated with at least one Zone using the relation hasZone."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasZone ] ; + sh:path s223:hasDomain ] ; sh:rule [ a sh:TripleRule ; rdfs:comment "Infer a hasDomain relation by checking any enclosed Zones to determine the domain."^^xsd:string ; sh:object [ sh:path ( s223:hasZone s223:hasDomain ) ] ; @@ -52017,7 +52028,7 @@ s223:hasInput a rdf:Property ; s223:ofSubstance a rdf:Property ; rdfs:label "of substance"^^xsd:string ; - rdfs:comment "The relation ofSubstance is used to associate a Property with a specific Substance."^^xsd:string . + rdfs:comment "The ofSubstance relation is used on a Property being observed by a sensor. It links the Property to a Substance it characterizes within a specific Medium. For instance, to denote the concentration of a Substance in a Medium, 'ofSubstance' is used. Typically, there's also an ofMedium relation between the observed Property and the Medium. For example, to represent the concentration of CO2 in air, we use ofSubstance to relate to CO2 and ofMedium to relate to air. The term ofSubstance is broad enough to include situations where a sensor is used to detect constituents that should not be present in a medium, such as ammonia in air. Therefore, 'ofSubstance' is used to indicate the substance of interest, while 'ofConstituent' would indicate a constituent that is normally present in the composition of the mix."^^xsd:string . dcterms:source a rdf:Property ; rdfs:label "source"^^xsd:string ; @@ -59132,18 +59143,18 @@ s223:Coil a s223:Class, rdfs:label "Coil"^^xsd:string ; rdfs:comment "A cooling or heating element made of pipe or tube that may or may not be finned and formed into helical or serpentine shape."^^xsd:string ; rdfs:subClassOf s223:HeatExchanger ; - sh:property [ rdfs:comment "A Coil shall have at least one outlet using the medium Air."^^xsd:string ; + sh:property [ rdfs:comment "A Coil shall have at least one inlet using the medium Air."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Coil shall have at least one inlet using the medium Air."^^xsd:string ; + [ rdfs:comment "A Coil shall have at least one outlet using the medium Air."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Air ; sh:path s223:hasMedium ] ] ] ] . @@ -59232,7 +59243,7 @@ s223:Fluid-Oil a s223:Class, s223:LightSensor a s223:Class, sh:NodeShape ; rdfs:label "Light sensor"^^xsd:string ; - rdfs:comment "A LightSensor is a specialization of a Sensor that observes a QuantifiableObservableProperty that represents a luminance measurement."^^xsd:string ; + rdfs:comment "A LightSensor is a specialization of a Sensor that observes a QuantifiableObservableProperty that represents a measurement of some attribute of light, as specified by the quantity kind of the Property being observed."^^xsd:string ; rdfs:subClassOf s223:Sensor . s223:LineNeutralVoltage-24V a s223:Class, @@ -59350,43 +59361,54 @@ s223:Water-GlycolSolution a s223:Class, ns1:hasQuantityKind ] ; rdfs:comment "This class has enumerated subclasses of water-glycol solutions in various concentrations."^^xsd:string ; rdfs:subClassOf s223:Fluid-Water ; - sh:property [ rdfs:comment "If the relation hasFreezingPoint is used, the object must be a QuantifiableProperty with a quantity kind of Temperature."^^xsd:string ; - sh:class s223:QuantifiableProperty ; - sh:message "The object must be a QuantifiableProperty with a quantity kind of Temperature."^^xsd:string ; - sh:node [ sh:property [ sh:hasValue ; - sh:path ns1:hasQuantityKind ] ] ; - sh:path s223:hasFreezingPoint ], - [ rdfs:comment "There must be at least two QuantifiableProperties that characterize the constituents of a Water-GlycolSolution."^^xsd:string ; - sh:class s223:QuantifiableProperty ; - sh:minCount 2 ; - sh:path s223:composedOf ], - [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Constituent-H2O."^^xsd:string ; + sh:property [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Constituent-H2O."^^xsd:string ; sh:path s223:composedOf ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:QuantifiableProperty ; - sh:node [ sh:property [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Constituent-H2O."^^xsd:string ; - sh:hasValue s223:Constituent-H2O ; - sh:path s223:ofConstituent ], - [ rdfs:comment "The quantity kind of the constituent must be VolumeFraction."^^xsd:string ; + sh:node [ sh:property [ rdfs:comment "The quantity kind of the constituent must be VolumeFraction."^^xsd:string ; sh:hasValue ; - sh:path ns1:hasQuantityKind ] ] ] ], + sh:path ns1:hasQuantityKind ], + [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Constituent-H2O."^^xsd:string ; + sh:hasValue s223:Constituent-H2O ; + sh:path s223:ofConstituent ] ] ] ], [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Constituent-Glycol."^^xsd:string ; sh:path s223:composedOf ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:QuantifiableProperty ; - sh:node [ sh:property [ rdfs:comment "The quantity kind of the constituent must be VolumeFraction."^^xsd:string ; - sh:hasValue ; - sh:path ns1:hasQuantityKind ], - [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Constituent-Glycol."^^xsd:string ; + sh:node [ sh:property [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Constituent-Glycol."^^xsd:string ; sh:hasValue s223:Constituent-Glycol ; - sh:path s223:ofConstituent ] ] ] ] . + sh:path s223:ofConstituent ], + [ rdfs:comment "The quantity kind of the constituent must be VolumeFraction."^^xsd:string ; + sh:hasValue ; + sh:path ns1:hasQuantityKind ] ] ] ], + [ rdfs:comment "There must be at least two QuantifiableProperties that characterize the constituents of a Water-GlycolSolution."^^xsd:string ; + sh:class s223:QuantifiableProperty ; + sh:minCount 2 ; + sh:path s223:composedOf ], + [ rdfs:comment "If the relation hasFreezingPoint is used, the object must be a QuantifiableProperty with a quantity kind of Temperature."^^xsd:string ; + sh:class s223:QuantifiableProperty ; + sh:message "The object must be a QuantifiableProperty with a quantity kind of Temperature."^^xsd:string ; + sh:node [ sh:property [ sh:hasValue ; + sh:path ns1:hasQuantityKind ] ] ; + sh:path s223:hasFreezingPoint ] . s223:Zone a s223:Class, sh:NodeShape ; rdfs:label "Zone"^^xsd:string ; rdfs:comment "A Zone is a logical grouping (collection) of domain spaces for some functional or system reason, to identify a domain of control, such as a Lighting Zone, or a heating zone"^^xsd:string ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "The associated Domain of a Zone and the Domain of the DomainSpaces it contains must be the same."^^xsd:string ; + sh:property [ rdfs:comment "A Zone must be associated with exactly one EnumerationKind-Domain using the relation hasDomain."^^xsd:string ; + sh:class s223:EnumerationKind-Domain ; + sh:maxCount 1 ; + sh:message "s223: A Zone must be associated with exactly one EnumerationKind-Domain using the relation hasDomain."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:hasDomain ], + [ rdfs:comment "A Zone must be associated with at least one DomainSpace using the relation hasDomainSpace."^^xsd:string ; + sh:class s223:DomainSpace ; + sh:message "s223: A Zone must be associated with at least one DomainSpace using the relation hasDomainSpace."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:hasDomainSpace ], + [ rdfs:comment "The associated Domain of a Zone and the Domain of the DomainSpaces it contains must be the same."^^xsd:string ; sh:path s223:hasDomain ; sh:sparql [ a sh:SPARQLConstraint ; rdfs:comment "The associated Domain of a Zone and the Domain of the DomainSpaces it contains must be the same."^^xsd:string ; @@ -59401,18 +59423,7 @@ $this s223:contains ?ds . ?ds s223:hasDomain ?dsdomain . FILTER (?domain != ?dsdomain) } -"""^^xsd:string ] ], - [ rdfs:comment "A Zone must be associated with at least one DomainSpace using the relation hasDomainSpace."^^xsd:string ; - sh:class s223:DomainSpace ; - sh:message "s223: A Zone must be associated with at least one DomainSpace using the relation hasDomainSpace."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasDomainSpace ], - [ rdfs:comment "A Zone must be associated with exactly one EnumerationKind-Domain using the relation hasDomain."^^xsd:string ; - sh:class s223:EnumerationKind-Domain ; - sh:maxCount 1 ; - sh:message "s223: A Zone must be associated with exactly one EnumerationKind-Domain using the relation hasDomain."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasDomain ] ; +"""^^xsd:string ] ] ; sh:rule [ a sh:TripleRule ; rdfs:comment "Infer a hasDomain relation by checking any enclosing ZoneGroup to determine the domain."^^xsd:string ; sh:object [ sh:path ( [ sh:inversePath s223:hasZone ] s223:hasDomain ) ] ; @@ -67759,18 +67770,18 @@ s223:TerminalUnit a s223:Class, rdfs:label "Terminal Unit"^^xsd:string ; rdfs:comment "An air terminal that modulates the volume of air delivered to a space."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A TerminalUnit shall have at least one outlet ConnectionPoint using the medium Air."^^xsd:string ; + sh:property [ rdfs:comment "A TerminalUnit shall have at least one inlet ConnectionPoint using the medium Air."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A TerminalUnit shall have at least one inlet ConnectionPoint using the medium Air."^^xsd:string ; + [ rdfs:comment "A TerminalUnit shall have at least one outlet ConnectionPoint using the medium Air."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Air ; sh:path s223:hasMedium ] ] ] ] . @@ -71837,7 +71848,13 @@ s223:EnumerationKind-Substance a s223:Class, rdfs:label "Substance"^^xsd:string ; rdfs:comment "This class has enumerated subclasses of the substances that are consumed, produced, transported, sensed, controlled or otherwise interacted with (e.g. water, air, etc.)."^^xsd:string ; rdfs:subClassOf s223:EnumerationKind ; - sh:property [ rdfs:comment "A substance may only have atomic constituents, it may not have a constituent that also composed ofs."^^xsd:string ; + sh:property [ rdfs:comment """If the relation composedOf is present, it must associate an EnumerationKind-Substance with one or more Properties that +identify and characterize its constituents. The Property identifies the constituent using the relation ofConstituent. If appropriate, a +QuantifiableProperty may be used to also specify the amount of the constituent using the relations qudt:hasQuantityKind, qudt:hasUnit, and s223:hasValue. +For example, see `s223:GlycolSolution-15Percent`."""^^xsd:string ; + sh:class s223:Property ; + sh:path s223:composedOf ], + [ rdfs:comment "A substance may only have atomic constituents, it may not have a constituent that also composed ofs."^^xsd:string ; sh:path s223:composedOf ; sh:sparql [ a sh:SPARQLConstraint ; rdfs:comment "If a substance has a constituent, that constituent may not itself have constituents."^^xsd:string ; @@ -71849,10 +71866,7 @@ WHERE { $this s223:composedOf ?constituent . ?constituent s223:ofConstituent/s223:composedOf ?nextConstituent . } -"""^^xsd:string ] ], - [ rdfs:comment "If the relation composedOf is present, it must associate an EnumerationKind-Substance with one or more Properties that identify and characterize those constituents."^^xsd:string ; - sh:class s223:Property ; - sh:path s223:composedOf ] . +"""^^xsd:string ] ] . s223:Fan a s223:Class, sh:NodeShape ; @@ -73972,7 +73986,7 @@ s223:hasObservationLocation a rdf:Property ; s223:ofConstituent a rdf:Property ; rdfs:label "of constituent"^^xsd:string ; - rdfs:comment "The relation ofConstituent is used to associate a Property that characterizes a medium mixture with one of the constituents of that mixture."^^xsd:string . + rdfs:comment "The relation ofConstituent is used to associate a Property that characterizes a medium mix with one of the constituents of that mix. (ex. Fluid-Water composedOf property ofConstituent Constituent-H2O."^^xsd:string . dcterms:abstract a rdf:Property ; rdfs:label "abstract"^^xsd:string ; @@ -77239,7 +77253,7 @@ UNION s223:composedOf a rdf:Property ; rdfs:label "composed of"^^xsd:string ; - rdfs:comment "The relation composedOf is used to indicate what substances constitute a material. The possible values are defined in Medium-Constituent (see `s223:Medium-Constituent`)."^^xsd:string . + rdfs:comment "The relation composedOf is used to indicate what substances constitute a material. Allowable values are instances of Property that in turn identify constituents defined in Medium-Constituent (see `s223:Medium-Constituent`) via the relation ofConstituent."^^xsd:string . s223:contains a rdf:Property ; rdfs:label "contains"^^xsd:string ; @@ -79125,7 +79139,17 @@ A Connection may contain branches or intersections. These may be modeled using J ![Graphical Depiction of Connection.](figures/Figure_5-3_Connection.svg) """^^xsd:string ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "If the relation connectsTo is present it must associate the Connection with a Connectable."^^xsd:string ; + sh:property [ rdfs:comment "A Connection must be associated with exactly one Substance-Medium using the relation hasMedium."^^xsd:string ; + sh:class s223:Substance-Medium ; + sh:maxCount 1 ; + sh:message "s223: A Connection must be associated with exactly one Substance-Medium using the relation hasMedium."^^xsd:string ; + sh:minCount 1 ; + sh:name "Connection medium"^^xsd:string ; + sh:path s223:hasMedium ], + [ rdfs:comment "If the relation connectsAt is present it must associate the Connection with a ConnectionPoint."^^xsd:string ; + sh:class s223:ConnectionPoint ; + sh:path s223:connectsAt ], + [ rdfs:comment "If the relation connectsTo is present it must associate the Connection with a Connectable."^^xsd:string ; sh:class s223:Connectable ; sh:name "ConnectionToDownstreamConnectableShape"^^xsd:string ; sh:path s223:connectsTo ], @@ -79173,9 +79197,11 @@ FILTER NOT EXISTS { } } """^^xsd:string ] ], - [ rdfs:comment "If the relation connectsAt is present it must associate the Connection with a ConnectionPoint."^^xsd:string ; - sh:class s223:ConnectionPoint ; - sh:path s223:connectsAt ], + [ rdfs:comment "If the relation hasThermodynamicPhase is present it must associate the Connection with at most one EnumerationKind-Phase."^^xsd:string ; + sh:class s223:EnumerationKind-Phase ; + sh:maxCount 1 ; + sh:message "s223: If the relation hasThermodynamicPhase is present it must associate the Connection with at most one EnumerationKind-Phase."^^xsd:string ; + sh:path s223:hasThermodynamicPhase ], [ rdfs:comment "Ensure that the Medium identified by all the associated ConnectionPoints via the s223:hasMedium relation are compatible with one another."^^xsd:string ; sh:name "Test for compatible declared Medium"^^xsd:string ; sh:path s223:hasMedium ; @@ -79207,22 +79233,17 @@ FILTER (?cp1 != ?cp2 ) . } } """^^xsd:string ] ], - [ rdfs:comment "A Connection must be associated with exactly one Substance-Medium using the relation hasMedium."^^xsd:string ; - sh:class s223:Substance-Medium ; - sh:maxCount 1 ; - sh:message "s223: A Connection must be associated with exactly one Substance-Medium using the relation hasMedium."^^xsd:string ; - sh:minCount 1 ; - sh:name "Connection medium"^^xsd:string ; - sh:path s223:hasMedium ], - [ rdfs:comment "If the relation hasThermodynamicPhase is present it must associate the Connection with at most one EnumerationKind-Phase."^^xsd:string ; - sh:class s223:EnumerationKind-Phase ; - sh:maxCount 1 ; - sh:message "s223: If the relation hasThermodynamicPhase is present it must associate the Connection with at most one EnumerationKind-Phase."^^xsd:string ; - sh:path s223:hasThermodynamicPhase ], - [ rdfs:comment "If the relation connectsFrom is present it must associate the Connection with a Connectable."^^xsd:string ; - sh:class s223:Connectable ; - sh:name "ConnectionToUpstreamConnectableShape"^^xsd:string ; - sh:path s223:connectsFrom ], + [ rdfs:comment "A Connection must only have a cnx relation with a ConnectionPoint"^^xsd:string ; + sh:path s223:cnx ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "A Connection must only have a cnx relation with a ConnectionPoint"^^xsd:string ; + sh:message "s223: {$this} cannot have a s223:cnx relation to {?something}, because {?something} is not a ConnectionPoint."^^xsd:string ; + sh:prefixes ; + sh:select """SELECT $this ?something +WHERE { +$this s223:cnx ?something . +FILTER NOT EXISTS {?something a/rdfs:subClassOf* s223:ConnectionPoint} . +}"""^^xsd:string ] ], [ rdfs:comment "If the relation hasRole is present it must associate the Connection with an EnumerationKind-Role."^^xsd:string ; sh:class s223:EnumerationKind-Role ; sh:path s223:hasRole ], @@ -79248,31 +79269,6 @@ FILTER NOT EXISTS {?m2 s223:composedOf ?c2} FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) . FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) . } -"""^^xsd:string ] ], - [ rdfs:comment "Ensure that the Medium identified by all the associated ConnectionPoints via the s223:hasMedium relation are compatible with one another."^^xsd:string ; - sh:name "Test for compatible declared Medium"^^xsd:string ; - sh:path s223:hasMedium ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 2: A medium with constituents and a pure Medium."^^xsd:string ; - sh:message "s223: {?cp1} with Medium {?m1} is incompatible with {?cp2} with Medium {?m2}."^^xsd:string ; - sh:prefixes ; - sh:select """ -SELECT $this ?cp1 ?m1 ?cp2 ?m2 -WHERE { -$this s223:cnx ?cp1 . -?cp1 a/rdfs:subClassOf* s223:ConnectionPoint . -?cp1 s223:hasMedium ?m1 . -$this s223:cnx ?cp2 . -?cp2 a/rdfs:subClassOf* s223:ConnectionPoint . -FILTER (?cp1 != ?cp2 ) . -?cp2 s223:hasMedium ?m2 . -?m2 s223:composedOf/s223:ofConstituent ?s2 . -FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . -FILTER NOT EXISTS { - ?m2 s223:composedOf/s223:ofConstituent ?s12 . - {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} . -} -} """^^xsd:string ] ], [ rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the associated Connection."^^xsd:string ; sh:name "Test for compatible declared Medium"^^xsd:string ; @@ -79295,17 +79291,41 @@ FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) . FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) . } """^^xsd:string ] ], - [ rdfs:comment "A Connection must only have a cnx relation with a ConnectionPoint"^^xsd:string ; + [ rdfs:comment "If the relation connectsFrom is present it must associate the Connection with a Connectable."^^xsd:string ; + sh:class s223:Connectable ; + sh:name "ConnectionToUpstreamConnectableShape"^^xsd:string ; + sh:path s223:connectsFrom ], + [ rdfs:comment "A Connection must have two or more cnx relations to ConnectionPoints"^^xsd:string ; + sh:class s223:ConnectionPoint ; + sh:message "s223: A Connection must have two or more cnx relations to ConnectionPoints"^^xsd:string ; + sh:minCount 2 ; sh:path s223:cnx ; + sh:severity sh:Warning ], + [ rdfs:comment "Ensure that the Medium identified by all the associated ConnectionPoints via the s223:hasMedium relation are compatible with one another."^^xsd:string ; + sh:name "Test for compatible declared Medium"^^xsd:string ; + sh:path s223:hasMedium ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "A Connection must only have a cnx relation with a ConnectionPoint"^^xsd:string ; - sh:message "s223: {$this} cannot have a s223:cnx relation to {?something}, because {?something} is not a ConnectionPoint."^^xsd:string ; + rdfs:comment "Inconsistent Medium. Case 2: A medium with constituents and a pure Medium."^^xsd:string ; + sh:message "s223: {?cp1} with Medium {?m1} is incompatible with {?cp2} with Medium {?m2}."^^xsd:string ; sh:prefixes ; - sh:select """SELECT $this ?something + sh:select """ +SELECT $this ?cp1 ?m1 ?cp2 ?m2 WHERE { -$this s223:cnx ?something . -FILTER NOT EXISTS {?something a/rdfs:subClassOf* s223:ConnectionPoint} . -}"""^^xsd:string ] ], +$this s223:cnx ?cp1 . +?cp1 a/rdfs:subClassOf* s223:ConnectionPoint . +?cp1 s223:hasMedium ?m1 . +$this s223:cnx ?cp2 . +?cp2 a/rdfs:subClassOf* s223:ConnectionPoint . +FILTER (?cp1 != ?cp2 ) . +?cp2 s223:hasMedium ?m2 . +?m2 s223:composedOf/s223:ofConstituent ?s2 . +FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . +FILTER NOT EXISTS { + ?m2 s223:composedOf/s223:ofConstituent ?s12 . + {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} . +} +} +"""^^xsd:string ] ], [ rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the associated Connection."^^xsd:string ; sh:name "Test for compatible declared Medium"^^xsd:string ; sh:path s223:hasMedium ; @@ -79333,25 +79353,19 @@ $this s223:hasMedium ?m1 . {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} . } } -"""^^xsd:string ] ], - [ rdfs:comment "A Connection must have two or more cnx relations to ConnectionPoints"^^xsd:string ; - sh:class s223:ConnectionPoint ; - sh:message "s223: A Connection must have two or more cnx relations to ConnectionPoints"^^xsd:string ; - sh:minCount 2 ; - sh:path s223:cnx ; - sh:severity sh:Warning ] ; +"""^^xsd:string ] ] ; sh:rule [ a sh:TripleRule ; - rdfs:comment "Infer cnx relation using connectsAt"^^xsd:string, - "InferredConnectionToConnectionPointBaseProperty"^^xsd:string ; - sh:object [ sh:path s223:connectsAt ] ; - sh:predicate s223:cnx ; - sh:subject sh:this ], - [ a sh:TripleRule ; rdfs:comment "Infer the connectsAt relation using cnx"^^xsd:string, "InferredConnectionToConnectionPointProperty"^^xsd:string ; sh:object [ sh:path s223:cnx ] ; sh:predicate s223:connectsAt ; sh:subject sh:this ], + [ a sh:TripleRule ; + rdfs:comment "Infer cnx relation using connectsThrough"^^xsd:string, + "InferredConnectionToConnectionPointBasePropertyFromInverse"^^xsd:string ; + sh:object [ sh:path [ sh:inversePath s223:connectsThrough ] ] ; + sh:predicate s223:cnx ; + sh:subject sh:this ], [ a sh:SPARQLRule ; rdfs:comment "Infer the connectsFrom relation using connectsAt"^^xsd:string ; sh:construct """ @@ -79365,9 +79379,9 @@ $this s223:connectsAt ?cp . sh:name "InferredConnectionToUpstreamEquipmentProperty"^^xsd:string ; sh:prefixes ], [ a sh:TripleRule ; - rdfs:comment "Infer cnx relation using connectsThrough"^^xsd:string, - "InferredConnectionToConnectionPointBasePropertyFromInverse"^^xsd:string ; - sh:object [ sh:path [ sh:inversePath s223:connectsThrough ] ] ; + rdfs:comment "Infer cnx relation using connectsAt"^^xsd:string, + "InferredConnectionToConnectionPointBaseProperty"^^xsd:string ; + sh:object [ sh:path s223:connectsAt ] ; sh:predicate s223:cnx ; sh:subject sh:this ], [ a sh:SPARQLRule ; @@ -82222,10 +82236,16 @@ s223:Connectable a s223:Class, s223:abstract true ; rdfs:comment "Connectable is an abstract class representing a thing such as, Equipment (see `s223:Equipment`), DomainSpace (see `s223:DomainSpace`), or Junction (see `s223:Junction`) that can be connected via ConnectionPoints and Connections."^^xsd:string ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "If the relation connected is present it must associate the Connectable with a Connectable."^^xsd:string ; + sh:property [ rdfs:comment "If the relation connectedThrough is present it must associate the Connectable with a Connection."^^xsd:string ; + sh:class s223:Connection ; + sh:name "EquipmentToConnectionShape"^^xsd:string ; + sh:path s223:connectedThrough ], + [ rdfs:comment "If the relation cnx is present it must associate the Connectable with a ConnectionPoint."^^xsd:string ; + sh:class s223:ConnectionPoint ; + sh:path s223:cnx ], + [ rdfs:comment "If the relation connectedFrom is present it must associate the Connectable with a Connectable."^^xsd:string ; sh:class s223:Connectable ; - sh:name "SymmetricConnectableToConnectableShape"^^xsd:string ; - sh:path s223:connected ], + sh:path s223:connectedFrom ], [ rdfs:comment "If a Connectable has s223:connected or s223:connectedTo (i.e. high-level connection specification), it must also have the supporting cnx relations (low-level connection specification)."^^xsd:string ; sh:path s223:cnx ; sh:severity sh:Warning ; @@ -82240,13 +82260,6 @@ $this s223:connected ?otherC . FILTER NOT EXISTS {$this s223:cnx+ ?otherC} } """^^xsd:string ] ], - [ rdfs:comment "If the relation connectedFrom is present it must associate the Connectable with a Connectable."^^xsd:string ; - sh:class s223:Connectable ; - sh:path s223:connectedFrom ], - [ rdfs:comment "If the relation connectedThrough is present it must associate the Connectable with a Connection."^^xsd:string ; - sh:class s223:Connection ; - sh:name "EquipmentToConnectionShape"^^xsd:string ; - sh:path s223:connectedThrough ], [ rdfs:comment "If the relation hasConnectionPoint is present it must associate the Connectable with a ConnectionPoint."^^xsd:string ; sh:class s223:ConnectionPoint ; sh:name "EquipmentToConnectionPointShape"^^xsd:string ; @@ -82255,33 +82268,21 @@ FILTER NOT EXISTS {$this s223:cnx+ ?otherC} sh:class s223:Connectable ; sh:name "ConnectableToConnectableShape"^^xsd:string ; sh:path s223:connectedTo ], - [ rdfs:comment "If the relation cnx is present it must associate the Connectable with a ConnectionPoint."^^xsd:string ; - sh:class s223:ConnectionPoint ; - sh:path s223:cnx ] ; - sh:rule [ a sh:SPARQLRule ; - rdfs:comment "Infer the connected relation for BiDirectional connections"^^xsd:string ; - sh:construct """ -CONSTRUCT {$this s223:connected ?d2 .} -WHERE { -$this s223:connectedThrough/^s223:connectedThrough ?d2 . -FILTER ($this != ?d2) . -FILTER NOT EXISTS {$this s223:contains* ?d2} . -FILTER NOT EXISTS {?d2 s223:contains* $this} . -} -"""^^xsd:string ; - sh:name "InferredEquipmentToDownstreamEquipmentProperty"^^xsd:string ; - sh:prefixes ], - [ a sh:TripleRule ; - rdfs:comment "Infer the connected relation using connectedTo"^^xsd:string ; - sh:name "InferredEquipmentToEquipmentPropertyfromconnectedTo"^^xsd:string ; - sh:object [ sh:path s223:connectedTo ] ; - sh:predicate s223:connected ; + [ rdfs:comment "If the relation connected is present it must associate the Connectable with a Connectable."^^xsd:string ; + sh:class s223:Connectable ; + sh:name "SymmetricConnectableToConnectableShape"^^xsd:string ; + sh:path s223:connected ] ; + sh:rule [ a sh:TripleRule ; + rdfs:comment "Infer the cnx relationship using hasConnectionPoint."^^xsd:string ; + sh:name "InferredEquipmentToConnectionPointCnxProperty"^^xsd:string ; + sh:object [ sh:path s223:hasConnectionPoint ] ; + sh:predicate s223:cnx ; sh:subject sh:this ], [ a sh:TripleRule ; - rdfs:comment "Infer the connected relation using connectedFrom"^^xsd:string ; - sh:name "InferredEquipmentToEquipmentPropertyfromconnectedFrom"^^xsd:string ; - sh:object [ sh:path s223:connectedFrom ] ; - sh:predicate s223:connected ; + rdfs:comment "Infer the connectedThrough relation using hasConnectionPoint and connectsThrough"^^xsd:string ; + sh:name "InferredEquipmentToConnectionProperty"^^xsd:string ; + sh:object [ sh:path ( s223:hasConnectionPoint s223:connectsThrough ) ] ; + sh:predicate s223:connectedThrough ; sh:subject sh:this ], [ a sh:TripleRule ; rdfs:comment "Infer the hasConnectionPoint relation using cnx"^^xsd:string ; @@ -82289,6 +82290,18 @@ FILTER NOT EXISTS {?d2 s223:contains* $this} . sh:object [ sh:path s223:cnx ] ; sh:predicate s223:hasConnectionPoint ; sh:subject sh:this ], + [ a sh:SPARQLRule ; + rdfs:comment "Infer the connectedTo relation using connectsThrough and connectsTo."^^xsd:string ; + sh:construct """ +CONSTRUCT {$this s223:connectedTo ?equipment .} +WHERE { +$this s223:hasConnectionPoint ?cp . +?cp a s223:OutletConnectionPoint . +?cp s223:connectsThrough/s223:connectsTo ?equipment . +} +"""^^xsd:string ; + sh:name "InferredEquipmentToDownstreamEquipmentProperty"^^xsd:string ; + sh:prefixes ], [ a sh:SPARQLRule ; rdfs:comment "Infer the connectedFrom relations using connectsThrough and connectsFrom."^^xsd:string ; sh:construct """ @@ -82301,35 +82314,36 @@ $this s223:hasConnectionPoint ?cp . """^^xsd:string ; sh:name "InferredEquipmentToUpstreamEquipmentProperty"^^xsd:string ; sh:prefixes ], + [ a sh:TripleRule ; + rdfs:comment "Infer the connected relation using connectedFrom"^^xsd:string ; + sh:name "InferredEquipmentToEquipmentPropertyfromconnectedFrom"^^xsd:string ; + sh:object [ sh:path s223:connectedFrom ] ; + sh:predicate s223:connected ; + sh:subject sh:this ], [ a sh:SPARQLRule ; - rdfs:comment "Infer the connectedTo relation using connectsThrough and connectsTo."^^xsd:string ; + rdfs:comment "Infer the connected relation for BiDirectional connections"^^xsd:string ; sh:construct """ -CONSTRUCT {$this s223:connectedTo ?equipment .} +CONSTRUCT {$this s223:connected ?d2 .} WHERE { -$this s223:hasConnectionPoint ?cp . -?cp a s223:OutletConnectionPoint . -?cp s223:connectsThrough/s223:connectsTo ?equipment . +$this s223:connectedThrough/^s223:connectedThrough ?d2 . +FILTER ($this != ?d2) . +FILTER NOT EXISTS {$this s223:contains* ?d2} . +FILTER NOT EXISTS {?d2 s223:contains* $this} . } """^^xsd:string ; sh:name "InferredEquipmentToDownstreamEquipmentProperty"^^xsd:string ; sh:prefixes ], - [ a sh:TripleRule ; - rdfs:comment "Infer the connectedThrough relation using hasConnectionPoint and connectsThrough"^^xsd:string ; - sh:name "InferredEquipmentToConnectionProperty"^^xsd:string ; - sh:object [ sh:path ( s223:hasConnectionPoint s223:connectsThrough ) ] ; - sh:predicate s223:connectedThrough ; - sh:subject sh:this ], - [ a sh:TripleRule ; - rdfs:comment "Infer the cnx relationship using hasConnectionPoint."^^xsd:string ; - sh:name "InferredEquipmentToConnectionPointCnxProperty"^^xsd:string ; - sh:object [ sh:path s223:hasConnectionPoint ] ; - sh:predicate s223:cnx ; - sh:subject sh:this ], [ a sh:TripleRule ; rdfs:comment "Infer the cnx relation using isConnectionPointOf."^^xsd:string ; sh:name "InferredEquipmentToConnectionPointCnxPropertyFromInverse"^^xsd:string ; sh:object [ sh:path [ sh:inversePath s223:isConnectionPointOf ] ] ; sh:predicate s223:cnx ; + sh:subject sh:this ], + [ a sh:TripleRule ; + rdfs:comment "Infer the connected relation using connectedTo"^^xsd:string ; + sh:name "InferredEquipmentToEquipmentPropertyfromconnectedTo"^^xsd:string ; + sh:object [ sh:path s223:connectedTo ] ; + sh:predicate s223:connected ; sh:subject sh:this ] . s223:ConnectionPoint a s223:Class, @@ -82349,23 +82363,32 @@ ConnectionPoints are represented graphically in this standard by a triangle with """^^xsd:string ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "If the relation hasRole is present it must associate the ConnectionPoint with an EnumerationKind-Role."^^xsd:string ; - sh:class s223:EnumerationKind-Role ; - sh:path s223:hasRole ], - [ rdfs:comment "If a ConnectionPoint lacks a connectsThrough and mapsTo relation, but is associated with a Junction or Equipment that is contained by an Equipment, then suggest that the ConnectionPoint might need a mapsTo relation to a ConnectionPoint of the containing Equipment."^^xsd:string ; - sh:path s223:mapsTo ; + sh:property [ rdfs:comment "A ConnectionPoint can be associated with at most one other ConnectionPoint using the inverse of relation mapsTo"^^xsd:string ; + sh:class s223:ConnectionPoint ; + sh:maxCount 1 ; + sh:message "s223: A ConnectionPoint can be associated with at most one other ConnectionPoint using the inverse of relation mapsTo"^^xsd:string ; + sh:path [ sh:inversePath s223:mapsTo ] ], + [ rdfs:comment "A ConnectionPoint must be associated with exactly one Substance-Medium using the relation hasMedium."^^xsd:string ; + sh:class s223:Substance-Medium ; + sh:maxCount 1 ; + sh:message "s223: A ConnectionPoint must be associated with exactly one Substance-Medium using the relation hasMedium."^^xsd:string ; + sh:minCount 1 ; + sh:name "ConnectionPoint medium"^^xsd:string ; + sh:path s223:hasMedium ], + [ rdfs:comment "If a ConnectionPoint lacks a connectsThrough and mapsTo relation, and is not associated with a Junction or Equipment that is contained by an Equipment, then suggest that the ConnectionPoint probably needs an association with a Connection."^^xsd:string ; + sh:path s223:connectsThrough ; sh:severity sh:Info ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "If a ConnectionPoint lacks a connectsThrough and mapsTo relation, but is associated with a Junction or Equipment that is contained by an Equipment, then suggest that the ConnectionPoint might need a mapsTo relation to a ConnectionPoint of the containing Equipment."^^xsd:string ; - sh:message "s223: ConnectionPoint {$this} could be missing a mapsTo relation to a ConnectionPoint of {?containerEquipment} because it is associated with a Junction or Equipment that is contained by {?containerEquipment}."^^xsd:string ; + rdfs:comment "If a ConnectionPoint lacks a connectsThrough and mapsTo relation, and is not associated with a Junction or Equipment that is contained by an Equipment, then suggest that the ConnectionPoint probably needs an association with a Connection."^^xsd:string ; + sh:message "s223: ConnectionPoint {$this} probably needs an association with a Connection."^^xsd:string ; sh:prefixes ; sh:select """ - SELECT $this ?containerEquipment + SELECT $this WHERE { FILTER NOT EXISTS {$this s223:connectsThrough ?anything1} . FILTER NOT EXISTS {$this s223:mapsTo ?anything2} . $this s223:isConnectionPointOf ?equipment . - ?containerEquipment s223:contains ?equipment . + FILTER NOT EXISTS {?containerEquipment s223:contains ?equipment} . } """^^xsd:string ] ], [ rdfs:comment "A ConnectionPoint must be associated with at most one Connection using the relation connectsThrough."^^xsd:string ; @@ -82395,6 +82418,34 @@ FILTER (NOT EXISTS {?b a/rdfs:subClassOf* ?a}) . FILTER (NOT EXISTS {?a a/rdfs:subClassOf* ?b}) . } """^^xsd:string ] ], + [ rdfs:comment "If the relation hasRole is present it must associate the ConnectionPoint with an EnumerationKind-Role."^^xsd:string ; + sh:class s223:EnumerationKind-Role ; + sh:path s223:hasRole ], + [ rdfs:comment "If a ConnectionPoint lacks a connectsThrough and mapsTo relation, but is associated with a Junction or Equipment that is contained by an Equipment, then suggest that the ConnectionPoint might need a mapsTo relation to a ConnectionPoint of the containing Equipment."^^xsd:string ; + sh:path s223:mapsTo ; + sh:severity sh:Info ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "If a ConnectionPoint lacks a connectsThrough and mapsTo relation, but is associated with a Junction or Equipment that is contained by an Equipment, then suggest that the ConnectionPoint might need a mapsTo relation to a ConnectionPoint of the containing Equipment."^^xsd:string ; + sh:message "s223: ConnectionPoint {$this} could be missing a mapsTo relation to a ConnectionPoint of {?containerEquipment} because it is associated with a Junction or Equipment that is contained by {?containerEquipment}."^^xsd:string ; + sh:prefixes ; + sh:select """ + SELECT $this ?containerEquipment + WHERE { + FILTER NOT EXISTS {$this s223:connectsThrough ?anything1} . + FILTER NOT EXISTS {$this s223:mapsTo ?anything2} . + $this s223:isConnectionPointOf ?equipment . + ?containerEquipment s223:contains ?equipment . + } + """^^xsd:string ] ], + [ rdfs:comment "A ConnectionPoint must be associated with at most one Connectable using the cnx relation."^^xsd:string ; + sh:message "s223: A ConnectionPoint must be associated with at most one Connectable using the cnx relation."^^xsd:string ; + sh:path s223:cnx ; + sh:qualifiedMaxCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Connectable ] ; + sh:qualifiedValueShapesDisjoint true ], + [ rdfs:comment "If the relation hasElectricalPhase is present it must associate the ConnectionPoint with an ElectricalPhaseIdentifier or ElectricalVoltagePhases."^^xsd:string ; + sh:or ( [ sh:class s223:Aspect-ElectricalPhaseIdentifier ] [ sh:class s223:Aspect-ElectricalVoltagePhases ] ) ; + sh:path s223:hasElectricalPhase ], [ rdfs:comment "A ConnectionPoint must not have both a mapsTo and a connectsThrough relation."^^xsd:string ; sh:path s223:mapsTo ; sh:sparql [ a sh:SPARQLConstraint ; @@ -82414,31 +82465,12 @@ $this s223:connectsThrough ?connection . sh:maxCount 1 ; sh:message "s223: A ConnectionPoint can be associated with at most one other ConnectionPoint using the relation mapsTo"^^xsd:string ; sh:path s223:mapsTo ], - [ rdfs:comment "If the relation hasElectricalPhase is present it must associate the ConnectionPoint with an ElectricalPhaseIdentifier or ElectricalVoltagePhases."^^xsd:string ; - sh:or ( [ sh:class s223:Aspect-ElectricalPhaseIdentifier ] [ sh:class s223:Aspect-ElectricalVoltagePhases ] ) ; - sh:path s223:hasElectricalPhase ], - [ rdfs:comment "A ConnectionPoint must be associated with at most one Connectable using the cnx relation."^^xsd:string ; - sh:message "s223: A ConnectionPoint must be associated with at most one Connectable using the cnx relation."^^xsd:string ; + [ rdfs:comment "A ConnectionPoint must be associated with at most one Connection using the cnx relation"^^xsd:string ; + sh:message "s223: A ConnectionPoint must be associated with at most one Connection using the cnx relation"^^xsd:string ; sh:path s223:cnx ; sh:qualifiedMaxCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Connectable ] ; + sh:qualifiedValueShape [ sh:class s223:Connection ] ; sh:qualifiedValueShapesDisjoint true ], - [ rdfs:comment "If a ConnectionPoint lacks a connectsThrough and mapsTo relation, and is not associated with a Junction or Equipment that is contained by an Equipment, then suggest that the ConnectionPoint probably needs an association with a Connection."^^xsd:string ; - sh:path s223:connectsThrough ; - sh:severity sh:Info ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "If a ConnectionPoint lacks a connectsThrough and mapsTo relation, and is not associated with a Junction or Equipment that is contained by an Equipment, then suggest that the ConnectionPoint probably needs an association with a Connection."^^xsd:string ; - sh:message "s223: ConnectionPoint {$this} probably needs an association with a Connection."^^xsd:string ; - sh:prefixes ; - sh:select """ - SELECT $this - WHERE { - FILTER NOT EXISTS {$this s223:connectsThrough ?anything1} . - FILTER NOT EXISTS {$this s223:mapsTo ?anything2} . - $this s223:isConnectionPointOf ?equipment . - FILTER NOT EXISTS {?containerEquipment s223:contains ?equipment} . - } - """^^xsd:string ] ], [ rdfs:comment "If a ConnectionPoint mapsTo another ConnectionPoint, the respective Equipment should have a contains relation."^^xsd:string ; sh:path s223:mapsTo ; sh:sparql [ a sh:SPARQLConstraint ; @@ -82454,31 +82486,13 @@ $this s223:mapsTo ?otherCP . FILTER NOT EXISTS {?otherEquipment s223:contains ?equipment} } """^^xsd:string ] ], - [ rdfs:comment "A ConnectionPoint must be associated with at most one Connection using the cnx relation"^^xsd:string ; - sh:message "s223: A ConnectionPoint must be associated with at most one Connection using the cnx relation"^^xsd:string ; - sh:path s223:cnx ; - sh:qualifiedMaxCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Connection ] ; - sh:qualifiedValueShapesDisjoint true ], [ rdfs:comment "A ConnectionPoint must be associated with exactly one Connectable using the relation isConnectionPointOf."^^xsd:string ; sh:class s223:Connectable ; sh:maxCount 1 ; sh:message "s223: A ConnectionPoint must be associated with exactly one Connectable using the relation isConnectionPointOf."^^xsd:string ; sh:minCount 1 ; sh:name "ConnectionPointToEquipmentShape"^^xsd:string ; - sh:path s223:isConnectionPointOf ], - [ rdfs:comment "A ConnectionPoint must be associated with exactly one Substance-Medium using the relation hasMedium."^^xsd:string ; - sh:class s223:Substance-Medium ; - sh:maxCount 1 ; - sh:message "s223: A ConnectionPoint must be associated with exactly one Substance-Medium using the relation hasMedium."^^xsd:string ; - sh:minCount 1 ; - sh:name "ConnectionPoint medium"^^xsd:string ; - sh:path s223:hasMedium ], - [ rdfs:comment "A ConnectionPoint can be associated with at most one other ConnectionPoint using the inverse of relation mapsTo"^^xsd:string ; - sh:class s223:ConnectionPoint ; - sh:maxCount 1 ; - sh:message "s223: A ConnectionPoint can be associated with at most one other ConnectionPoint using the inverse of relation mapsTo"^^xsd:string ; - sh:path [ sh:inversePath s223:mapsTo ] ] . + sh:path s223:isConnectionPointOf ] . s223:DCVoltage-DCZeroVoltage a s223:Class, s223:DCVoltage-DCZeroVoltage, @@ -83660,14 +83674,14 @@ s223:Concept a s223:Class, s223:abstract true ; rdfs:comment "All classes defined in the 223 standard are subclasses of s223:Concept."^^xsd:string ; rdfs:subClassOf rdfs:Resource ; - sh:property [ rdfs:comment "A Concept must be associated with at least one label using the relation label."^^xsd:string ; + sh:property [ rdfs:comment "If the relation hasProperty is present, it must associate the concept with a Property."^^xsd:string ; + sh:class s223:Property ; + sh:path s223:hasProperty ], + [ rdfs:comment "A Concept must be associated with at least one label using the relation label."^^xsd:string ; sh:message "s223: A Concept must be associated with at least one label using the relation label."^^xsd:string ; sh:minCount 1 ; sh:path rdfs:label ; - sh:severity sh:Warning ], - [ rdfs:comment "If the relation hasProperty is present, it must associate the concept with a Property."^^xsd:string ; - sh:class s223:Property ; - sh:path s223:hasProperty ] ; + sh:severity sh:Warning ] ; sh:rule [ a sh:SPARQLRule ; rdfs:comment "Add an rdfs:label if it is missing."^^xsd:string ; sh:construct """ @@ -83682,23 +83696,6 @@ BIND(REPLACE(?localName, "-", " ", "i") AS ?newLabel) sh:name "AddLabelFromLocalName"^^xsd:string ; sh:prefixes ] ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Ensure that any instance that is declared to be an instance of an abstract class must also be declared an instance of at least one subClass of that abstract class"^^xsd:string ; - sh:message "s223: {$this} cannot be declared an instance of only abstract class {?class}."^^xsd:string ; - sh:prefixes ; - sh:select """ -SELECT DISTINCT $this ?class -WHERE { -?class s223:abstract true . -$this a ?class . -OPTIONAL { -?otherClass rdfs:subClassOf+ ?class . -$this a ?otherClass . -FILTER (?class != ?otherClass) . -} -FILTER (!bound (?otherClass)) . -} -"""^^xsd:string ], - [ a sh:SPARQLConstraint ; rdfs:comment "Inconsistent Medium. Case 4: A medium with constituents and an associated property with constituents."^^xsd:string ; sh:message "s223: {$this} hasMedium of {?m1}, but is associated with property {?prop} that has ofMedium of {?m2}."^^xsd:string ; sh:prefixes ; @@ -83724,16 +83721,16 @@ $this ?p ?prop . } """^^xsd:string ], [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 2: A pure medium and an associated property with constituents."^^xsd:string ; - sh:message "s223: {$this} hasMedium of {?m1}, but is associated with property {?prop} that has ofMedium of {?m2}."^^xsd:string ; + rdfs:comment "Inconsistent Medium. Case 3: A medium with constituents and an associated property with a pure medium."^^xsd:string ; + sh:message "s223: {$this} hasMedium of {?m2}, but is associated with property {?prop} that has ofMedium of {?m1}."^^xsd:string ; sh:prefixes ; sh:select """ SELECT $this ?m1 ?prop ?m2 WHERE { -$this s223:hasMedium ?m1 . +$this s223:hasMedium ?m2 . $this ?p ?prop . ?prop a/rdfs:subClassOf* s223:Property . -?prop s223:ofMedium ?m2 . +?prop s223:ofMedium ?m1 . ?m2 s223:composedOf/s223:ofConstituent ?s2 . FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . FILTER NOT EXISTS { @@ -83743,22 +83740,20 @@ FILTER NOT EXISTS { } """^^xsd:string ], [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 3: A medium with constituents and an associated property with a pure medium."^^xsd:string ; - sh:message "s223: {$this} hasMedium of {?m2}, but is associated with property {?prop} that has ofMedium of {?m1}."^^xsd:string ; + rdfs:comment "Ensure that any instance that is declared to be an instance of an abstract class must also be declared an instance of at least one subClass of that abstract class"^^xsd:string ; + sh:message "s223: {$this} cannot be declared an instance of only abstract class {?class}."^^xsd:string ; sh:prefixes ; sh:select """ -SELECT $this ?m1 ?prop ?m2 +SELECT DISTINCT $this ?class WHERE { -$this s223:hasMedium ?m2 . -$this ?p ?prop . -?prop a/rdfs:subClassOf* s223:Property . -?prop s223:ofMedium ?m1 . -?m2 s223:composedOf/s223:ofConstituent ?s2 . -FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . -FILTER NOT EXISTS { - ?m2 s223:composedOf/s223:ofConstituent ?s12 . - {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} . +?class s223:abstract true . +$this a ?class . +OPTIONAL { +?otherClass rdfs:subClassOf+ ?class . +$this a ?otherClass . +FILTER (?class != ?otherClass) . } +FILTER (!bound (?otherClass)) . } """^^xsd:string ], [ a sh:SPARQLConstraint ; @@ -83778,6 +83773,25 @@ FILTER NOT EXISTS {?m2 s223:composedOf ?c2} FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) . FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) . } +"""^^xsd:string ], + [ a sh:SPARQLConstraint ; + rdfs:comment "Inconsistent Medium. Case 2: A pure medium and an associated property with constituents."^^xsd:string ; + sh:message "s223: {$this} hasMedium of {?m1}, but is associated with property {?prop} that has ofMedium of {?m2}."^^xsd:string ; + sh:prefixes ; + sh:select """ +SELECT $this ?m1 ?prop ?m2 +WHERE { +$this s223:hasMedium ?m1 . +$this ?p ?prop . +?prop a/rdfs:subClassOf* s223:Property . +?prop s223:ofMedium ?m2 . +?m2 s223:composedOf/s223:ofConstituent ?s2 . +FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . +FILTER NOT EXISTS { + ?m2 s223:composedOf/s223:ofConstituent ?s12 . + {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} . +} +} """^^xsd:string ] . s223:cnx a s223:SymmetricProperty ; @@ -85769,7 +85783,12 @@ EnumeratedActuatableProperty. A QuantifiableProperty (or subClass thereof) must always be associated with a Unit and a QuantityKind, either explicitly from the Property, or through the associated Value. If the Unit is defined, the SHACL reasoner (if invoked) will figure out and assert the QuantityKind (the most general version). -Enumerable properties must be associated with an EnumerationKind. +Enumerable properties must be associated with an EnumerationKind. Different flavors of properties are shown in Figure 12-1. + +![Different flavors of Properties](figures/Figure_12-1_Flavors_of_Properties.svg) + +A property that is not an instance of one of its subclasses is unconstrained +with respect to its value. """^^xsd:string ; rdfs:subClassOf s223:Concept ; sh:property [ rdfs:comment ""^^xsd:string ; @@ -85785,35 +85804,35 @@ WHERE { FILTER NOT EXISTS {$this s223:ofConstituent ?someSubstance} . } """^^xsd:string ] ], + [ rdfs:comment "If the relation hasAspect is present, it must associate the Property with an EnumerationKind."^^xsd:string ; + sh:class s223:EnumerationKind ; + sh:path s223:hasAspect ], + [ rdfs:comment "A Property can be associated with at most one EnumerationKind-Substance using the relation ofSubstance."^^xsd:string ; + sh:class s223:EnumerationKind-Substance ; + sh:maxCount 1 ; + sh:message "s223: A Property can be associated with at most one EnumerationKind-Substance using the relation ofSubstance."^^xsd:string ; + sh:path s223:ofSubstance ], + [ rdfs:comment "If the relation hasExternalReference is present it must associate the Property with an ExternalReference."^^xsd:string ; + sh:class s223:ExternalReference ; + sh:path s223:hasExternalReference ], [ rdfs:comment "A Property can use at most one relation hasValue if it is required to provide a static value in the model. It is not meant for real-time value (see `s223:hasExternalReference`)."^^xsd:string ; sh:maxCount 1 ; sh:message "s223: A Property can use at most one relation hasValue if it is required to provide a static value in the model. It is not meant for real-time value (see `s223:hasExternalReference`)."^^xsd:string ; sh:path s223:hasValue ], - [ rdfs:comment "An instance of s223:Property must not be observed (set) by more than one entity."^^xsd:string ; - sh:maxCount 1 ; - sh:message "s223: An instance of s223:Property must not be observed (set) by more than one entity."^^xsd:string ; - sh:path [ sh:inversePath s223:observes ] ], - [ rdfs:comment "If the relation hasAspect is present, it must associate the Property with an EnumerationKind."^^xsd:string ; - sh:class s223:EnumerationKind ; - sh:path s223:hasAspect ], [ rdfs:comment "A Property can be associated with at most one EnumerationKind-Medium using the relation ofMedium."^^xsd:string ; sh:class s223:Substance-Medium ; sh:maxCount 1 ; sh:message "s223: A Property can be associated with at most one EnumerationKind-Medium using the relation ofMedium."^^xsd:string ; sh:path s223:ofMedium ], - [ rdfs:comment "If the relation hasExternalReference is present it must associate the Property with an ExternalReference."^^xsd:string ; - sh:class s223:ExternalReference ; - sh:path s223:hasExternalReference ], [ rdfs:comment "A Property can be associated with at most one Function using the inverse relation hasOutput."^^xsd:string ; sh:class s223:Function ; sh:maxCount 1 ; sh:message "s223: A Property can be associated with at most one Function using the inverse relation hasOutput."^^xsd:string ; sh:path [ sh:inversePath s223:hasOutput ] ], - [ rdfs:comment "A Property can be associated with at most one EnumerationKind-Substance using the relation ofSubstance."^^xsd:string ; - sh:class s223:EnumerationKind-Substance ; + [ rdfs:comment "An instance of s223:Property must not be observed (set) by more than one entity."^^xsd:string ; sh:maxCount 1 ; - sh:message "s223: A Property can be associated with at most one EnumerationKind-Substance using the relation ofSubstance."^^xsd:string ; - sh:path s223:ofSubstance ] ; + sh:message "s223: An instance of s223:Property must not be observed (set) by more than one entity."^^xsd:string ; + sh:path [ sh:inversePath s223:observes ] ] ; sh:sparql [ a sh:SPARQLConstraint ; rdfs:comment "A Property instance cannot be declared an instance of both an ActuatableProperty and an ObservableProperty."^^xsd:string ; sh:message "s223: {$this} cannot be declared an instance of both an ActuatableProperty and an ObservableProperty."^^xsd:string ; @@ -86021,7 +86040,18 @@ s223:QuantifiableProperty a s223:Class, rdfs:label "Quantifiable Property"^^xsd:string ; rdfs:comment "This class is for quantifiable values that describe an object (System, Equipment, etc.) that are typically static (hasValue). That is, they are neither measured nor specified in the course of operations."^^xsd:string ; rdfs:subClassOf s223:Property ; - sh:property [ rdfs:comment """Normally, a QuantifiableProperty is associated with a static decimal value using s223:hasValue, along with a single + sh:property [ rdfs:comment "A QuantifiableProperty should use s223:hasValue instead of qudt:value."^^xsd:string ; + sh:maxCount 0 ; + sh:message "A QuantifiableProperty should use s223:hasValue instead of qudt:value."^^xsd:string ; + sh:path ns1:value ], + [ rdfs:comment """A QuantifiableProperty can be associated with an optional Boolean flag using the relation isDeltaQuantity. +If the relation isDeltaQuantity has a value of true, the associated value should be interpreted as a difference reading, such as a +temperature difference. This is needed to distinguish between a temperature reading and a temperature difference reading, which +affects unit conversion calculations."""^^xsd:string ; + sh:datatype xsd:boolean ; + sh:maxCount 1 ; + sh:path ns1:isDeltaQuantity ], + [ rdfs:comment """Normally, a QuantifiableProperty is associated with a static decimal value using s223:hasValue, along with a single unit and quantity kind. However, in some cases, a QuantifiableProperty may instead be associated with a qudt:QuantityValue using the relation qudt:quantityValue. This allows the qudt:QuantityValue to express multiple equivalent combinations of unit and value."""^^xsd:string ; sh:class ns1:QuantityValue ; @@ -86031,19 +86061,20 @@ qudt:quantityValue. This allows the qudt:QuantityValue to express multiple equiv sh:maxCount 1 ; sh:message "s223: A QuantifiableProperty can be associated with at most one Unit using the relation hasUnit."^^xsd:string ; sh:path ns1:hasUnit ], - [ rdfs:comment """A QuantifiableProperty can be associated with an optional Boolean flag using the relation isDeltaQuantity. -If the relation isDeltaQuantity has a value of true, the associated value should be interpreted as a difference reading, such as a -temperature difference. This is needed to distinguish between a temperature reading and a temperature difference reading, which -affects unit conversion calculations."""^^xsd:string ; - sh:datatype xsd:boolean ; - sh:maxCount 1 ; - sh:path ns1:isDeltaQuantity ], - [ rdfs:comment "A QuantifiableProperty must be associated with a QuantityKind using the relation hasQuantityKind."^^xsd:string ; - sh:class ns1:QuantityKind ; - sh:maxCount 1 ; - sh:message "s223: A QuantifiableProperty must be associated with a QuantityKind using the relation hasQuantityKind."^^xsd:string ; - sh:minCount 1 ; - sh:path ns1:hasQuantityKind ], + [ rdfs:comment "This QuantifiableProperty cannot have a value without a Unit."^^xsd:string ; + sh:path s223:hasValue ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "This QuantifiableProperty cannot have a value without a Unit."^^xsd:string ; + sh:message "s223: {$this} referenced by {?subject} has a value of {?v} but does not specify a Unit."^^xsd:string ; + sh:prefixes ; + sh:select """ +SELECT $this ?v ?subject +WHERE { +$this s223:hasValue ?v . +FILTER NOT EXISTS {$this qudt:hasUnit ?u} . +?subject ?p $this . +} +"""^^xsd:string ] ], [ rdfs:comment "This QuantifiableProperty and the associated Setpoint use non-commensurate Units."^^xsd:string ; sh:path ns1:hasUnit ; sh:sparql [ a sh:SPARQLConstraint ; @@ -86062,24 +86093,12 @@ FILTER (?punit != ?sunit) . FILTER (?pdv != ?sdv) . } """^^xsd:string ] ], - [ rdfs:comment "A QuantifiableProperty should use s223:hasValue instead of qudt:value."^^xsd:string ; - sh:maxCount 0 ; - sh:message "A QuantifiableProperty should use s223:hasValue instead of qudt:value."^^xsd:string ; - sh:path ns1:value ], - [ rdfs:comment "This QuantifiableProperty cannot have a value without a Unit."^^xsd:string ; - sh:path s223:hasValue ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "This QuantifiableProperty cannot have a value without a Unit."^^xsd:string ; - sh:message "s223: {$this} referenced by {?subject} has a value of {?v} but does not specify a Unit."^^xsd:string ; - sh:prefixes ; - sh:select """ -SELECT $this ?v ?subject -WHERE { -$this s223:hasValue ?v . -FILTER NOT EXISTS {$this qudt:hasUnit ?u} . -?subject ?p $this . -} -"""^^xsd:string ] ], + [ rdfs:comment "A QuantifiableProperty must be associated with a QuantityKind using the relation hasQuantityKind."^^xsd:string ; + sh:class ns1:QuantityKind ; + sh:maxCount 1 ; + sh:message "s223: A QuantifiableProperty must be associated with a QuantityKind using the relation hasQuantityKind."^^xsd:string ; + sh:minCount 1 ; + sh:path ns1:hasQuantityKind ], [ rdfs:comment "This QuantifiableProperty and the Setpoint associated with it have non-commensurate QuantityKinds."^^xsd:string ; sh:path ns1:hasQuantityKind ; sh:sparql [ a sh:SPARQLConstraint ; @@ -91154,7 +91173,10 @@ s223:InletConnectionPoint a s223:Class, rdfs:label "Inlet Connection Point"^^xsd:string ; rdfs:comment "An InletConnectionPoint indicates that a substance must flow into the equipment or domain space at this connection point and cannot flow the other direction. An IntletConnectionPoint is a subclass of ConnectionPoint."^^xsd:string ; rdfs:subClassOf s223:ConnectionPoint ; - sh:property [ rdfs:comment "Ensure an InletConnectionPoint has a mapsTo relation to its containing Equipment if it has an external Connection"^^xsd:string ; + sh:property [ rdfs:comment "If the relation mapsTo is present it must associate the InletConnectionPoint with an InletConnectionPoint."^^xsd:string ; + sh:class s223:InletConnectionPoint ; + sh:path s223:mapsTo ], + [ rdfs:comment "Ensure an InletConnectionPoint has a mapsTo relation to its containing Equipment if it has an external Connection"^^xsd:string ; sh:path s223:mapsTo ; sh:sparql [ a sh:SPARQLConstraint ; rdfs:comment "Ensure an InletConnectionPoint has a mapsTo relation to its containing Equipment if it has an external Connection"^^xsd:string ; @@ -91169,10 +91191,7 @@ $this s223:connectsThrough/s223:connectsFrom ?sourceEquipment . FILTER NOT EXISTS {?parentEquipment s223:contains ?sourceEquipment} . FILTER NOT EXISTS {$this s223:mapsTo ?anything} . } -"""^^xsd:string ] ], - [ rdfs:comment "If the relation mapsTo is present it must associate the InletConnectionPoint with an InletConnectionPoint."^^xsd:string ; - sh:class s223:InletConnectionPoint ; - sh:path s223:mapsTo ] . +"""^^xsd:string ] ] . a ns1:QuantityKindDimensionVector_ISO, ns1:QuantityKindDimensionVector_Imperial, @@ -91741,16 +91760,39 @@ The graphical depiction of Equipment used in this standard is a rounded cornered ![Graphical Depiction of Equipment.](figures/Figure_5-1Graphical_Depiciton_of_Equipment.svg) """^^xsd:string ; rdfs:subClassOf s223:Connectable ; - sh:property [ rdfs:comment "If the relation hasRole is present it must associate the Equipment with a EnumerationKind-Role."^^xsd:string ; - sh:class s223:EnumerationKind-Role ; - sh:path s223:hasRole ], + sh:property [ rdfs:comment "If the relation hasPhysicalLocation is present it must associate the Equipment with a PhysicalSpace."^^xsd:string ; + sh:class s223:PhysicalSpace ; + sh:path s223:hasPhysicalLocation ], + [ rdfs:comment "Disallow contained equipment from having external outgoing connections."^^xsd:string ; + sh:path s223:connectedTo ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Disallow contained equipment from having external outgoing connections."^^xsd:string ; + sh:message "s223: {$this} should not have a connection to external equipment {?otherDev} because {?container} contains {$this}."^^xsd:string ; + sh:prefixes ; + sh:select """ +SELECT $this ?container ?otherDev +WHERE { +$this s223:connectedTo ?otherDev . +$this ^s223:contains ?container . +?container a/rdfs:subClassOf* s223:Equipment . +FILTER NOT EXISTS {?container s223:contains ?otherDev .} +} +"""^^xsd:string ] ], + [ a sh:PropertyShape ; + rdfs:comment "If the relation contains is present it must associate the Equipment with either Equipment or Junction."^^xsd:string ; + sh:name "device contains shape"^^xsd:string ; + sh:or ( [ sh:class s223:Equipment ] [ sh:class s223:Junction ] ) ; + sh:path s223:contains ], + [ rdfs:comment "If the relation executes is present it must associate the Equipment with a Function."^^xsd:string ; + sh:class s223:Function ; + sh:path s223:executes ], [ rdfs:comment """If the relation actuatedByProperty is present it must associate the Equipment with a ActuatableProperty. Note that any Equipment may use this relation, not just Actuator."""^^xsd:string ; sh:class s223:ActuatableProperty ; sh:path s223:actuatedByProperty ], - [ rdfs:comment "If the relation executes is present it must associate the Equipment with a Function."^^xsd:string ; - sh:class s223:Function ; - sh:path s223:executes ], + [ rdfs:comment "If the relation hasRole is present it must associate the Equipment with a EnumerationKind-Role."^^xsd:string ; + sh:class s223:EnumerationKind-Role ; + sh:path s223:hasRole ], [ rdfs:comment "Warning about a subClass of Equipment of type A containing something that is in the same subClass branch."^^xsd:string ; sh:path s223:contains ; sh:severity sh:Warning ; @@ -91774,21 +91816,6 @@ UNION ?type1 rdfs:subClassOf* ?type2 . } } -"""^^xsd:string ] ], - [ rdfs:comment "Disallow contained equipment from having external outgoing connections."^^xsd:string ; - sh:path s223:connectedTo ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Disallow contained equipment from having external outgoing connections."^^xsd:string ; - sh:message "s223: {$this} should not have a connection to external equipment {?otherDev} because {?container} contains {$this}."^^xsd:string ; - sh:prefixes ; - sh:select """ -SELECT $this ?container ?otherDev -WHERE { -$this s223:connectedTo ?otherDev . -$this ^s223:contains ?container . -?container a/rdfs:subClassOf* s223:Equipment . -FILTER NOT EXISTS {?container s223:contains ?otherDev .} -} """^^xsd:string ] ], [ rdfs:comment "Disallow contained equipment from having external incoming connections."^^xsd:string ; sh:path s223:connectedFrom ; @@ -91804,42 +91831,34 @@ $this ^s223:contains ?container . ?container a/rdfs:subClassOf* s223:Equipment . FILTER NOT EXISTS {?container s223:contains ?otherDev .} } -"""^^xsd:string ] ], - [ a sh:PropertyShape ; - rdfs:comment "If the relation contains is present it must associate the Equipment with either Equipment or Junction."^^xsd:string ; - sh:name "device contains shape"^^xsd:string ; - sh:or ( [ sh:class s223:Equipment ] [ sh:class s223:Junction ] ) ; - sh:path s223:contains ], - [ rdfs:comment "If the relation hasPhysicalLocation is present it must associate the Equipment with a PhysicalSpace."^^xsd:string ; - sh:class s223:PhysicalSpace ; - sh:path s223:hasPhysicalLocation ] ; +"""^^xsd:string ] ] ; sh:rule [ a sh:SPARQLRule ; - rdfs:comment "For equipment contained within another piece of equipment use the mapsTo relation to infer a Medium from the containing equipment."^^xsd:string ; + rdfs:comment "For equipment containing another piece of equipment, use the mapsTo relation to infer a Medium from the contained equipment."^^xsd:string ; sh:construct """ CONSTRUCT { - ?childCp s223:hasMedium ?medium . + ?parentCp s223:hasMedium ?medium . } WHERE { $this s223:hasConnectionPoint ?cp . - ?childCp s223:mapsTo ?cp . + ?cp s223:mapsTo ?parentCp . ?cp s223:connectsThrough ?connection . ?cp s223:hasMedium ?medium . - FILTER NOT EXISTS {?childCp s223:hasMedium ?something} . + FILTER NOT EXISTS {?parentCp s223:hasMedium ?something} . } """^^xsd:string ; sh:prefixes ], [ a sh:SPARQLRule ; - rdfs:comment "For equipment containing another piece of equipment, use the mapsTo relation to infer a Medium from the contained equipment."^^xsd:string ; + rdfs:comment "For equipment contained within another piece of equipment use the mapsTo relation to infer a Medium from the containing equipment."^^xsd:string ; sh:construct """ CONSTRUCT { - ?parentCp s223:hasMedium ?medium . + ?childCp s223:hasMedium ?medium . } WHERE { $this s223:hasConnectionPoint ?cp . - ?cp s223:mapsTo ?parentCp . + ?childCp s223:mapsTo ?cp . ?cp s223:connectsThrough ?connection . ?cp s223:hasMedium ?medium . - FILTER NOT EXISTS {?parentCp s223:hasMedium ?something} . + FILTER NOT EXISTS {?childCp s223:hasMedium ?something} . } """^^xsd:string ; sh:prefixes ] . @@ -93138,108 +93157,108 @@ s223:Frequency-60Hz a s223:Class, sh: ; owl:versionInfo "Created with TopBraid Composer", "Created with TopBraid Composer"^^xsd:string ; - sh:declare [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; - sh:prefix "s223"^^xsd:string ], - [ a sh:PrefixDeclaration ; - sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; - sh:prefix "quantitykind"^^xsd:string ], - [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; - sh:prefix "s223"^^xsd:string ], - [ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ; + sh:declare [ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ; sh:prefix "rdf"^^xsd:string ], - [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; - sh:prefix "s223"^^xsd:string ], + [ a sh:PrefixDeclaration ; + sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; + sh:prefix "qudt"^^xsd:string ], [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; sh:prefix "qudt"^^xsd:string ], [ a sh:PrefixDeclaration ; sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ; sh:prefix "unit"^^xsd:string ], - [ sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ; - sh:prefix "unit"^^xsd:string ], [ a sh:PrefixDeclaration ; - sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; - sh:prefix "qudt"^^xsd:string ], + sh:namespace "http://www.w3.org/2004/02/skos/core#"^^xsd:anyURI ; + sh:prefix "skos"^^xsd:string ], + [ a sh:PrefixDeclaration ; + sh:namespace "http://www.w3.org/ns/shacl#"^^xsd:anyURI ; + sh:prefix "sh"^^xsd:string ], [ sh:namespace "http://www.w3.org/ns/shacl#"^^xsd:anyURI ; sh:prefix "sh"^^xsd:string ], + [ a sh:PrefixDeclaration ; + sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ; + sh:prefix "rdf"^^xsd:string ], + [ a sh:PrefixDeclaration ; + sh:namespace "http://www.w3.org/2002/07/owl#"^^xsd:anyURI ; + sh:prefix "owl"^^xsd:string ], + [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; + sh:prefix "qudt"^^xsd:string ], + [ a sh:PrefixDeclaration ; + sh:namespace "http://www.w3.org/2001/XMLSchema#"^^xsd:anyURI ; + sh:prefix "xsd"^^xsd:string ], + [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; + sh:prefix "s223"^^xsd:string ], + [ a sh:PrefixDeclaration ; + sh:namespace "http://purl.org/dc/terms/"^^xsd:anyURI ; + sh:prefix "dcterms"^^xsd:string ], + [ a sh:PrefixDeclaration ; + sh:namespace "http://www.w3.org/2002/07/owl#"^^xsd:anyURI ; + sh:prefix "owl"^^xsd:string ], + [ sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ; + sh:prefix "unit"^^xsd:string ], + [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; + sh:prefix "rdfs"^^xsd:string ], [ a sh:PrefixDeclaration ; sh:namespace "http://purl.org/dc/terms/"^^xsd:anyURI ; sh:prefix "dcterms"^^xsd:string ], + [ sh:namespace "http://data.ashrae.org/standard223/1.0/vocab/role#"^^xsd:anyURI ; + sh:prefix "role"^^xsd:string ], [ a sh:PrefixDeclaration ; sh:namespace "http://www.w3.org/2004/02/skos/core#"^^xsd:anyURI ; sh:prefix "skos"^^xsd:string ], + [ a sh:PrefixDeclaration ; + sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ; + sh:prefix "rdf"^^xsd:string ], [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; sh:prefix "s223"^^xsd:string ], + [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; + sh:prefix "qudt"^^xsd:string ], + [ a sh:PrefixDeclaration ; + sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; + sh:prefix "rdfs"^^xsd:string ], + [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; + sh:prefix "rdfs"^^xsd:string ], [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; sh:prefix "s223"^^xsd:string ], - [ sh:namespace "http://data.ashrae.org/standard223/1.0/vocab/role#"^^xsd:anyURI ; - sh:prefix "role"^^xsd:string ], - [ a sh:PrefixDeclaration ; - sh:namespace "http://qudt.org/vocab/dimensionvector/"^^xsd:anyURI ; - sh:prefix "qkdv"^^xsd:string ], - [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; - sh:prefix "quantitykind"^^xsd:string ], [ a sh:PrefixDeclaration ; sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; sh:prefix "rdfs"^^xsd:string ], - [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; - sh:prefix "qudt"^^xsd:string ], - [ a sh:PrefixDeclaration ; - sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; - sh:prefix "quantitykind"^^xsd:string ], - [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; - sh:prefix "qudt"^^xsd:string ], [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; sh:prefix "s223"^^xsd:string ], - [ a sh:PrefixDeclaration ; - sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; + [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; sh:prefix "qudt"^^xsd:string ], - [ a sh:PrefixDeclaration ; - sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ; - sh:prefix "rdf"^^xsd:string ], [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; sh:prefix "rdfs"^^xsd:string ], + [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; + sh:prefix "rdfs"^^xsd:string ], + [ a sh:PrefixDeclaration ; + sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; + sh:prefix "quantitykind"^^xsd:string ], + [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; + sh:prefix "quantitykind"^^xsd:string ], [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; sh:prefix "qudtqk"^^xsd:string ], [ a sh:PrefixDeclaration ; - sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; - sh:prefix "rdfs"^^xsd:string ], - [ a sh:PrefixDeclaration ; - sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ; - sh:prefix "rdf"^^xsd:string ], + sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; + sh:prefix "qudt"^^xsd:string ], [ a sh:PrefixDeclaration ; sh:namespace "http://qudt.org/vocab/dimensionvector/"^^xsd:anyURI ; sh:prefix "qkdv"^^xsd:string ], [ a sh:PrefixDeclaration ; - sh:namespace "http://www.w3.org/2002/07/owl#"^^xsd:anyURI ; - sh:prefix "owl"^^xsd:string ], - [ a sh:PrefixDeclaration ; - sh:namespace "http://www.w3.org/2002/07/owl#"^^xsd:anyURI ; - sh:prefix "owl"^^xsd:string ], - [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; - sh:prefix "rdfs"^^xsd:string ], - [ a sh:PrefixDeclaration ; - sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ; - sh:prefix "unit"^^xsd:string ], + sh:namespace "http://qudt.org/vocab/dimensionvector/"^^xsd:anyURI ; + sh:prefix "qkdv"^^xsd:string ], + [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; + sh:prefix "s223"^^xsd:string ], + [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; + sh:prefix "s223"^^xsd:string ], [ sh:namespace "http://www.w3.org/ns/shacl#"^^xsd:anyURI ; sh:prefix "sh"^^xsd:string ], [ a sh:PrefixDeclaration ; - sh:namespace "http://www.w3.org/2001/XMLSchema#"^^xsd:anyURI ; - sh:prefix "xsd"^^xsd:string ], - [ a sh:PrefixDeclaration ; - sh:namespace "http://www.w3.org/ns/shacl#"^^xsd:anyURI ; - sh:prefix "sh"^^xsd:string ], - [ a sh:PrefixDeclaration ; - sh:namespace "http://www.w3.org/2004/02/skos/core#"^^xsd:anyURI ; - sh:prefix "skos"^^xsd:string ], - [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; - sh:prefix "qudt"^^xsd:string ], + sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ; + sh:prefix "unit"^^xsd:string ], [ a sh:PrefixDeclaration ; - sh:namespace "http://purl.org/dc/terms/"^^xsd:anyURI ; - sh:prefix "dcterms"^^xsd:string ], - [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; - sh:prefix "rdfs"^^xsd:string ], - [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; - sh:prefix "rdfs"^^xsd:string ] . + sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; + sh:prefix "quantitykind"^^xsd:string ] . a ns1:QuantityKindDimensionVector_CGS, ns1:QuantityKindDimensionVector_ISO, @@ -93556,14 +93575,14 @@ s223:Electricity-AC a s223:Class, sh:class s223:Numerical-Frequency ; sh:minCount 1 ; sh:path s223:hasFrequency ], - [ rdfs:comment "An electricity AC medium must have a number of electrical phases."^^xsd:string ; - sh:class s223:Numerical-NumberOfElectricalPhases ; - sh:minCount 1 ; - sh:path s223:hasNumberOfElectricalPhases ], [ rdfs:comment "An electricity AC medium must have a voltage."^^xsd:string ; sh:minCount 1 ; sh:or ( [ sh:class s223:Numerical-LineLineVoltage ] [ sh:class s223:Numerical-LineNeutralVoltage ] [ sh:class s223:Numerical-Voltage ] ) ; - sh:path s223:hasVoltage ] . + sh:path s223:hasVoltage ], + [ rdfs:comment "An electricity AC medium must have a number of electrical phases."^^xsd:string ; + sh:class s223:Numerical-NumberOfElectricalPhases ; + sh:minCount 1 ; + sh:path s223:hasNumberOfElectricalPhases ] . s223:hasMedium a rdf:Property ; rdfs:label "has Medium"^^xsd:string ; @@ -94586,30 +94605,30 @@ Unlike the meter and second, which exist as fundamental units in the SI system f rdfs:isDefinedBy . rdf:Property a sh:NodeShape ; - sh:property [ rdfs:comment "This Property must have a comment"^^xsd:string ; - sh:path rdfs:comment ; + sh:property [ rdfs:comment "This Property must have a label"^^xsd:string ; + sh:path rdfs:label ; sh:sparql [ a sh:SPARQLConstraint ; - sh:message "s223: {$this} must have an rdfs:comment"^^xsd:string ; + sh:message "s223: {$this} must have an rdfs:label"^^xsd:string ; sh:prefixes ; sh:select """ SELECT $this WHERE { BIND(REPLACE(STR($this), "^(.*)(/|#)([^#/]*)$", "$1") AS ?prop) . FILTER (?prop = "http://data.ashrae.org/standard223") . -FILTER (NOT EXISTS {$this rdfs:comment ?something}) . +FILTER (NOT EXISTS {$this rdfs:label ?something}) . } """^^xsd:string ] ], - [ rdfs:comment "This Property must have a label"^^xsd:string ; - sh:path rdfs:label ; + [ rdfs:comment "This Property must have a comment"^^xsd:string ; + sh:path rdfs:comment ; sh:sparql [ a sh:SPARQLConstraint ; - sh:message "s223: {$this} must have an rdfs:label"^^xsd:string ; + sh:message "s223: {$this} must have an rdfs:comment"^^xsd:string ; sh:prefixes ; sh:select """ SELECT $this WHERE { BIND(REPLACE(STR($this), "^(.*)(/|#)([^#/]*)$", "$1") AS ?prop) . FILTER (?prop = "http://data.ashrae.org/standard223") . -FILTER (NOT EXISTS {$this rdfs:label ?something}) . +FILTER (NOT EXISTS {$this rdfs:comment ?something}) . } """^^xsd:string ] ] .