diff --git a/ontologies/223p.ttl b/ontologies/223p.ttl index be2a04e..1e50ec5 100644 --- a/ontologies/223p.ttl +++ b/ontologies/223p.ttl @@ -53,26 +53,26 @@ 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:property [ rdfs:comment "A ChilledWaterValve shall have at least one analog valve command property or at least two binary valve command properties using the relation hasProperty."^^xsd:string ; + sh:path s223:hasAspect ] ] ] ] ] [ sh:property [ rdfs:comment "A ChilledWaterValve shall have at least one analog valve command property or at least two binary valve 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-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:hasValue s223:EnumerationKind-Binary ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:hasAspect ] ] ] ] ] ) ; + sh:path s223:hasEnumerationKind ] ] ] ] ] ) ; sh:targetClass . a s223:Class, @@ -92,14 +92,14 @@ 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: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:path s223:hasAspect ] ] ] ] ] [ 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 ; @@ -199,26 +199,26 @@ s223:SymmetricProperty a rdfs:Class, sh:path s223:hasProperty ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:QuantifiableActuatableProperty ; - sh:node [ sh:property [ sh:hasValue ; + sh:node [ sh:property [ sh:hasValue s223:EnumerationKind-Position ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path ns1:hasQuantityKind ], - [ sh:hasValue s223:EnumerationKind-Position ; + sh:path s223:hasAspect ], + [ sh:hasValue ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:hasAspect ] ] ] ] ] [ sh:property [ rdfs:comment "A HotWaterValve shall have at least one analog valve command property or at least two binary valve command properties using the relation hasProperty."^^xsd:string ; + sh:path ns1:hasQuantityKind ] ] ] ] ] [ sh:property [ rdfs:comment "A HotWaterValve shall have at least one analog valve command property or at least two binary valve 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-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:hasValue s223:EnumerationKind-Binary ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:hasAspect ] ] ] ] ] ) ; + sh:path s223:hasEnumerationKind ] ] ] ] ] ) ; sh:targetClass . a s223:Class, @@ -233,14 +233,14 @@ s223:SymmetricProperty a rdfs:Class, sh:path s223:hasProperty ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:EnumeratedActuatableProperty ; - sh:node [ sh:property [ sh:hasValue s223:EnumerationKind-Position ; + sh:node [ sh:property [ sh:class s223:EnumerationKind-Binary ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:hasAspect ], - [ sh:class 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 ] ] ] ] . a s223:Class, rdfs:Class, @@ -262,22 +262,26 @@ 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 s223:Constituent-CO2 ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path ns1:hasQuantityKind ], - [ sh:hasValue s223:Dimensioned-Delta ; + sh:path s223:ofConstituent ], + [ sh:hasValue ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:hasAspect ] ] ] ; - sh:qualifiedValueShapesDisjoint true ; + sh:path ns1:hasQuantityKind ] ] ] ; sh:severity sh:Info ], + [ rdfs:comment "A Zone shall have at least one Domain-HVAC using the relation hasDomain. "^^xsd:string ; + sh:hasValue s223:Domain-HVAC ; + sh:message "g36: A Zone shall have at least one Domain-HVAC using the relation hasDomain. "^^xsd:string ; + sh:minCount 1 ; + sh:path s223:hasDomain ], [ rdfs:comment "A Zone shall have at least one binary zone occupancy property using the relation hasProperty"^^xsd:string ; sh:message "g36: A Zone shall have at least one binary zone occupancy property using the relation hasProperty"^^xsd:string ; sh:minCount 1 ; @@ -289,25 +293,21 @@ s223:SymmetricProperty a rdfs:Class, sh:minCount 1 ; sh:path s223:hasEnumerationKind ] ] ] ; sh:severity sh:Info ], - [ rdfs:comment "A Zone shall have at least one Domain-HVAC using the relation hasDomain. "^^xsd:string ; - sh:hasValue s223:Domain-HVAC ; - sh:message "g36: A Zone shall have at least one Domain-HVAC using the relation hasDomain. "^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasDomain ], - [ 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 ; + [ 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 ; 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:Constituent-CO2 ; + [ sh:hasValue s223:Dimensioned-Delta ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:ofConstituent ] ] ] ; + sh:path s223:hasAspect ] ] ] ; + sh:qualifiedValueShapesDisjoint true ; sh:severity sh:Info ] . a s223:Class, @@ -1154,15 +1154,15 @@ s223:Actuator a s223:Class, rdfs:label "Actuator"^^xsd:string ; rdfs:comment "A piece of equipment, either electrically, pneumatically, or hydraulically operated, that makes a change in the physical world, such as the position of a valve or damper."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "If the relation actuates is present it must associate the Actuator with a Equipment."^^xsd:string ; - sh:class s223:Equipment ; - sh:message "s223: If the relation actuates is present it must associate the Actuator with a Equipment."^^xsd:string ; - sh:path s223:actuates ], - [ rdfs:comment "An Actuator must be associated with at least one ActuatableProperty using the relation actuatedByProperty."^^xsd:string ; + sh:property [ rdfs:comment "An Actuator must be associated with at least one ActuatableProperty using the relation actuatedByProperty."^^xsd:string ; sh:class s223:ActuatableProperty ; sh:message "s223: An Actuator must be associated with at least one ActuatableProperty using the relation actuatedByProperty."^^xsd:string ; sh:minCount 1 ; - sh:path s223:actuatedByProperty ] . + sh:path s223:actuatedByProperty ], + [ rdfs:comment "If the relation actuates is present it must associate the Actuator with a Equipment."^^xsd:string ; + sh:class s223:Equipment ; + sh:message "s223: If the relation actuates is present it must associate the Actuator with a Equipment."^^xsd:string ; + sh:path s223:actuates ] . s223:AirHandlingUnit a s223:Class, sh:NodeShape ; @@ -1214,11 +1214,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 device-name is present it associates the external reference with a BACnet device having the specific device name."^^xsd:string ; + 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 ; sh:maxCount 1 ; sh:minCount 0 ; - sh:path ], + 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 ; sh:datatype xsd:string ; @@ -1227,11 +1227,12 @@ s223:BACnetExternalReference a s223:Class, 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 ; - sh:datatype xsd:nonNegativeInteger ; + 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:path ; + sh:pattern "^[A-Za-z0-9-]+,[1-9][0-9]*$"^^xsd:string ], [ a sh:PropertyShape ; rdfs:comment "If the relation property-array-index is present it provides the index for reading items from a property that is an array."^^xsd:string ; sh:datatype xsd:nonNegativeInteger ; @@ -1239,24 +1240,23 @@ s223:BACnetExternalReference a s223:Class, 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 ; + 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 ], + 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 ; - sh:datatype xsd:string ; + rdfs:comment "If the relation priority-for-writing is present it provides the priority for writing values to the object."^^xsd:string ; + sh:datatype xsd:nonNegativeInteger ; sh:maxCount 1 ; sh:minCount 0 ; - sh:path ; - sh:pattern "^[A-Za-z0-9-]+,[1-9][0-9]*$"^^xsd:string ], + sh:path ], [ 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 ; + 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 ] . + sh:path ] . s223:BatteryCPShape a sh:NodeShape ; rdfs:label "Battery CP Shape"^^xsd:string ; @@ -1305,20 +1305,20 @@ s223:Chiller a s223:Class, rdfs:label "Chiller"^^xsd:string ; rdfs:comment "A refrigerating machine used to transfer heat from fluids."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A Chiller shall have at least one inlet using the medium Water."^^xsd:string ; - sh:message "s223: A Chiller shall have at least one inlet using the medium Water."^^xsd:string ; + sh:property [ rdfs:comment "A Chiller shall have at least one outlet using the medium Water."^^xsd:string ; + sh:message "s223: A Chiller 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:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Water ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Chiller shall have at least one outlet using the medium Water."^^xsd:string ; - sh:message "s223: A Chiller shall have at least one outlet using the medium Water."^^xsd:string ; + [ rdfs:comment "A Chiller shall have at least one inlet using the medium Water."^^xsd:string ; + sh:message "s223: A Chiller shall have at least one inlet using the medium 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 ] ] ] ] . @@ -1354,18 +1354,18 @@ s223:Compressor a s223:Class, rdfs:label "Compressor"^^xsd:string ; rdfs:comment "A device for mechanically increasing the pressure of a gas."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A Compressor shall have at least one outlet."^^xsd:string ; - sh:message "s223: A Compressor shall have at least one outlet."^^xsd:string ; + sh:property [ rdfs:comment "A Compressor shall have at least one inlet."^^xsd:string ; + sh:message "s223: A Compressor 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 Compressor shall have at least one inlet."^^xsd:string ; - sh:message "s223: A Compressor shall have at least one inlet."^^xsd:string ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ], + [ rdfs:comment "A Compressor shall have at least one outlet."^^xsd:string ; + sh:message "s223: A Compressor 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:ConcentrationSensor a s223:Class, sh:NodeShape ; @@ -1384,14 +1384,14 @@ s223:ConnectionCnxShape a sh:NodeShape ; sh:minCount 1 ; sh:path s223:connectsAt ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ; sh:qualifiedValueShapesDisjoint true ; sh:severity sh:Warning ], [ rdfs:comment "A Connection shall have at least two connectsAt relations allowing flow in and out of the Connection."^^xsd:string ; sh:minCount 1 ; sh:path s223:connectsAt ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ; sh:qualifiedValueShapesDisjoint true ; sh:severity sh:Warning ] ] [ sh:property [ rdfs:comment "A Connection shall have at least two connectsAt relations allowing flow in and out of the Connection."^^xsd:string ; sh:minCount 2 ; @@ -1433,20 +1433,20 @@ s223:CoolingTower a s223:Class, rdfs:label "Cooling tower"^^xsd:string ; rdfs:comment "A heat transfer device in which atmospheric air cools warm water, generally by direct contact via evaporation."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A CoolingTower shall have at least one inlet using the medium Water."^^xsd:string ; - sh:message "s223: A CoolingTower shall have at least one inlet using the medium Water."^^xsd:string ; + sh:property [ rdfs:comment "A CoolingTower shall have at least one outlet using the medium Water."^^xsd:string ; + sh:message "s223: A CoolingTower 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:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Water ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A CoolingTower shall have at least one outlet using the medium Water."^^xsd:string ; - sh:message "s223: A CoolingTower shall have at least one outlet using the medium Water."^^xsd:string ; + [ rdfs:comment "A CoolingTower shall have at least one inlet using the medium Water."^^xsd:string ; + sh:message "s223: A CoolingTower shall have at least one inlet using the medium 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 ] ] ] ] . @@ -1581,29 +1581,23 @@ 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 flexible 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:message "s223: 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:message "s223: 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 must at least have the role Role-Heating or Role-Cooling."^^xsd:string ; - sh:message "s223: A FanCoilUnit must at least have the role Role-Heating or Role-Cooling."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasRole ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:in ( s223:Role-Heating s223:Role-Cooling ) ] ], - [ rdfs:comment "A FanCoilUnit shall have at least one inlet using the medium Air."^^xsd:string ; + sh:property [ rdfs:comment "A FanCoilUnit shall have at least one inlet using the medium Air."^^xsd:string ; sh:message "s223: A FanCoilUnit shall have at least one inlet using the medium Air."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; @@ -1611,12 +1605,12 @@ s223:FanCoilUnit a s223:Class, 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:message "s223: A FanCoilUnit must be associated with at least 1 Coil using the relation contains."^^xsd:string ; + [ rdfs:comment "A FanCoilUnit must be associated with at least 1 Fan using the relation contains."^^xsd:string ; + sh:message "s223: 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:Coil ] ], + sh:qualifiedValueShape [ sh:class s223:Fan ] ], [ rdfs:comment "A FanCoilUnit shall have at least one outlet using the medium Air."^^xsd:string ; sh:message "s223: A FanCoilUnit shall have at least one outlet using the medium Air."^^xsd:string ; sh:minCount 1 ; @@ -1625,12 +1619,18 @@ s223:FanCoilUnit a s223:Class, 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:message "s223: A FanCoilUnit must be associated with at least 1 Fan using the relation contains."^^xsd:string ; + [ rdfs:comment "A FanCoilUnit must at least have the role Role-Heating or Role-Cooling."^^xsd:string ; + sh:message "s223: A FanCoilUnit must at least have the role Role-Heating or Role-Cooling."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:hasRole ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:in ( s223:Role-Heating s223:Role-Cooling ) ] ], + [ rdfs:comment "A FanCoilUnit must be associated with at least 1 Coil using the relation contains."^^xsd:string ; + sh:message "s223: 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:Fan ] ] . + sh:qualifiedValueShape [ sh:class s223:Coil ] ] . s223:FanPoweredTerminal a s223:Class, sh:NodeShape ; @@ -1649,12 +1649,12 @@ 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 "Ensure that the filter inlet and outlet have compatible mediums."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:severity sh:Warning ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 2: A medium with constituents and a pure Medium."^^xsd:string ; - sh:message "s223: {$this} has an incompatible medium {?m1} with any constituent of {?m2}."^^xsd:string ; + rdfs:comment "Inconsistent Medium. Case 1: Two pure mediums."^^xsd:string ; + sh:message "s223: {$this} with inlet medium {?m2} is incompatible with outlet medium {?m1}."^^xsd:string ; sh:prefixes ; sh:select """ SELECT $this ?m2 ?m1 @@ -1665,20 +1665,18 @@ $this s223:cnx ?cp1, ?cp2 . FILTER (?cp1 != ?cp2) . ?cp1 s223:hasMedium ?m1 . ?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} . -} +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 filter inlet and outlet have compatible mediums."^^xsd:string ; + [ 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 ; - rdfs:comment "Inconsistent Medium. Case 1: Two pure mediums."^^xsd:string ; - sh:message "s223: {$this} with inlet medium {?m2} is incompatible with outlet medium {?m1}."^^xsd:string ; + rdfs:comment "Inconsistent Medium. Case 2: A medium with constituents and a pure Medium."^^xsd:string ; + sh:message "s223: {$this} has an incompatible medium {?m1} with any constituent of {?m2}."^^xsd:string ; sh:prefixes ; sh:select """ SELECT $this ?m2 ?m1 @@ -1689,10 +1687,12 @@ $this s223:cnx ?cp1, ?cp2 . FILTER (?cp1 != ?cp2) . ?cp1 s223:hasMedium ?m1 . ?cp2 s223:hasMedium ?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 "A filter should have one common constituent between the inlet and outlet"^^xsd:string ; @@ -1725,18 +1725,18 @@ WHERE { } } """^^xsd:string ] ], - [ rdfs:comment "A Filter shall have at least one outlet."^^xsd:string ; - sh:message "s223: A Filter shall have at least one outlet."^^xsd:string ; + [ rdfs:comment "A Filter shall have at least one inlet ConnectionPoint."^^xsd:string ; + sh:message "s223: 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:OutletConnectionPoint ] ], - [ rdfs:comment "A Filter shall have at least one inlet ConnectionPoint."^^xsd:string ; - sh:message "s223: A Filter shall have at least one inlet ConnectionPoint."^^xsd:string ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ], + [ rdfs:comment "A Filter shall have at least one outlet."^^xsd:string ; + sh:message "s223: 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:InletConnectionPoint ] ] . + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ] . s223:FlowSensor a s223:Class, sh:NodeShape ; @@ -1785,20 +1785,20 @@ 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:message "s223: 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:message "s223: 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 ; - sh:message "s223: 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:message "s223: 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 ] ] ] ] . @@ -1943,13 +1943,13 @@ s223:JunctionCPShape a sh:NodeShape ; sh:minCount 2 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ; sh:qualifiedValueShapesDisjoint true ], [ rdfs:comment "A Junction shall have at least two ConnectionPoints including (a) at least one inlet and one outlet, or (b) at least one bidirectional connection point."^^xsd:string ; sh:minCount 2 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ; sh:qualifiedValueShapesDisjoint true ] ] [ sh:property [ rdfs:comment "A Junction shall have at least two ConnectionPoints including (a) at least one inlet and one outlet, or (b) at least one bidirectional connection point."^^xsd:string ; sh:minCount 2 ; sh:path s223:hasConnectionPoint ; @@ -1989,21 +1989,21 @@ s223:Luminaire a s223:Class, rdfs:label "Luminaire"^^xsd:string ; rdfs:comment "A complete lighting unit consisting of a light source(s) and ballast(s) or driver(s) (when applicable), together with the parts designed to distribute the light, to position and protect the light source(s), and to connect the light source(s) to the power supply. Also known as a light fixture."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A Luminaire shall have at least one outlet using the medium EM-Light."^^xsd:string ; - sh:message "s223: A Luminaire shall have at least one outlet using the medium EM-Light."^^xsd:string ; + sh:property [ rdfs:comment "A Luminaire shall have at least one inlet using the medium Electricity."^^xsd:string ; + sh:message "s223: A Luminaire shall have at least one inlet using the medium Electricity."^^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:EM-Light ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Constituent-Electricity ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Luminaire shall have at least one inlet using the medium Electricity."^^xsd:string ; - sh:message "s223: A Luminaire shall have at least one inlet using the medium Electricity."^^xsd:string ; + [ rdfs:comment "A Luminaire shall have at least one outlet using the medium EM-Light."^^xsd:string ; + sh:message "s223: A Luminaire shall have at least one outlet using the medium EM-Light."^^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:Constituent-Electricity ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:EM-Light ; sh:path s223:hasMedium ] ] ] ] . s223:Motor a s223:Class, @@ -2122,19 +2122,19 @@ 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 BidirectionalConnectionPoint using the medium PowerAndSignal-PoE."^^xsd:string ; - sh:message "s223: 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:BidirectionalConnectionPoint ; - sh:node [ sh:property [ sh:class s223:PowerAndSignal-PoE ; - sh:path s223:hasMedium ] ] ] ], - [ 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 inlet using the medium Electricity."^^xsd:string ; sh:message "s223: 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:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Constituent-Electricity ; + sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "A PowerOverEthernetSwitch shall have at least one BidirectionalConnectionPoint using the medium PowerAndSignal-PoE."^^xsd:string ; + sh:message "s223: 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:BidirectionalConnectionPoint ; + sh:node [ sh:property [ sh:class s223:PowerAndSignal-PoE ; sh:path s223:hasMedium ] ] ] ] . s223:Pump a s223:Class, @@ -2142,14 +2142,14 @@ s223:Pump a s223:Class, rdfs:label "Pump"^^xsd:string ; rdfs:comment "A machine for imparting energy to a fluid, drawing a fluid into itself through an entrance port, and forcing the fluid out through an exhaust port."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A Pump shall have at least one outlet using the medium Water, Oil or Refrigerant."^^xsd:string ; - sh:message "s223: A Pump shall have at least one outlet using the medium Water, Oil or Refrigerant."^^xsd:string ; + sh:property [ rdfs:comment "A Pump shall have at least one inlet using the medium Water, Oil or Refrigerant."^^xsd:string ; + sh:message "s223: A Pump shall have at least one inlet using the medium Water, Oil or Refrigerant."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; - sh:node [ rdfs:comment "A Pump shall have at least one outlet using the medium Water, Oil or Refrigerant."^^xsd:string ; - sh:message "s223: A Pump shall have at least one outlet using the medium Water, Oil or Refrigerant."^^xsd:string ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ rdfs:comment "A Pump shall have at least one inlet using the medium Water, Oil or Refrigerant."^^xsd:string ; + sh:message "s223: A Pump shall have at least one inlet using the medium Water, Oil or Refrigerant."^^xsd:string ; sh:or ( [ sh:property [ sh:class s223:Fluid-Water ; sh:path s223:hasMedium ] ] [ sh:property [ sh:class s223:Fluid-Refrigerant ; sh:path s223:hasMedium ] ] [ sh:property [ sh:class s223:Fluid-Oil ; @@ -2176,14 +2176,14 @@ WHERE { FILTER (NOT EXISTS {?mediuma a/rdfs:subClassOf* ?mediumb}) . } """^^xsd:string ] ], - [ rdfs:comment "A Pump shall have at least one inlet using the medium Water, Oil or Refrigerant."^^xsd:string ; - sh:message "s223: A Pump shall have at least one inlet using the medium Water, Oil or Refrigerant."^^xsd:string ; + [ rdfs:comment "A Pump shall have at least one outlet using the medium Water, Oil or Refrigerant."^^xsd:string ; + sh:message "s223: A Pump shall have at least one outlet using the medium Water, Oil or Refrigerant."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ rdfs:comment "A Pump shall have at least one inlet using the medium Water, Oil or Refrigerant."^^xsd:string ; - sh:message "s223: A Pump shall have at least one inlet using the medium Water, Oil or Refrigerant."^^xsd:string ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:node [ rdfs:comment "A Pump shall have at least one outlet using the medium Water, Oil or Refrigerant."^^xsd:string ; + sh:message "s223: A Pump shall have at least one outlet using the medium Water, Oil or Refrigerant."^^xsd:string ; sh:or ( [ sh:property [ sh:class s223:Fluid-Water ; sh:path s223:hasMedium ] ] [ sh:property [ sh:class s223:Fluid-Refrigerant ; sh:path s223:hasMedium ] ] [ sh:property [ sh:class s223:Fluid-Oil ; @@ -2206,14 +2206,14 @@ s223:RadiantHeaterInletShape 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 heater 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 ] ] ] ] ] ) . @@ -2229,18 +2229,18 @@ s223:RadiatorInletShape a sh:NodeShape ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Constituent-Electricity ; - sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "A Radiator shall have at least one inlet using the medium Electricity or Water."^^xsd:string ; + sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "A Radiator 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:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Water ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Radiator shall have at least one outlet using the medium Water."^^xsd:string ; + [ rdfs:comment "A Radiator shall have at least one inlet using the medium Electricity or 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 ] ] ] ] ] ) . @@ -2420,21 +2420,21 @@ 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 inlet using the medium EM-Light."^^xsd:string ; - sh:message "s223: A SolarThermalCollector shall have at least one inlet using the medium EM-Light."^^xsd:string ; + sh:property [ rdfs:comment "A SolarThermalCollector shall have at least one outlet using the medium Water."^^xsd:string ; + sh:message "s223: 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 ] ] ] ], - [ rdfs:comment "A SolarThermalCollector shall have at least one outlet using the medium Water."^^xsd:string ; - sh:message "s223: A SolarThermalCollector shall have at least one outlet using the medium Water."^^xsd:string ; + [ rdfs:comment "A SolarThermalCollector shall have at least one inlet using the medium EM-Light."^^xsd:string ; + sh:message "s223: 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 ] ] ] ] . s223:SymmetricPropertyShape a sh:NodeShape ; @@ -2514,18 +2514,18 @@ 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:message "s223: 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:message "s223: 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:message "s223: 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:message "s223: 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 ; @@ -2565,6 +2565,10 @@ s223:VariableFrequencyDrive a s223:Class, sh:node [ sh:property [ sh:class s223:Constituent-Electricity ; sh:path s223:hasMedium ] ] ] ; 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:message "s223: If the relation connectedTo is present it must associate the VariableFrequencyDrive with a Equipment."^^xsd:string ; + sh:path s223:connectedTo ], [ rdfs:comment "A VariableFrequencyDrive shall have at least one outlet using the medium Electricity."^^xsd:string ; sh:message "s223: A VariableFrequencyDrive shall have at least one outlet using the medium Electricity."^^xsd:string ; sh:minCount 1 ; @@ -2572,11 +2576,7 @@ s223:VariableFrequencyDrive a s223:Class, sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Constituent-Electricity ; - sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "If the relation connectedTo is present it must associate the VariableFrequencyDrive with a Equipment."^^xsd:string ; - sh:class s223:Equipment ; - sh:message "s223: If the relation connectedTo is present it must associate the VariableFrequencyDrive with a Equipment."^^xsd:string ; - sh:path s223:connectedTo ] . + sh:path s223:hasMedium ] ] ] ] . s223:WaterSourceHeatPump a s223:Class, sh:NodeShape ; @@ -21581,21 +21581,21 @@ s223:AirHeatExchanger a s223:Class, sh:path s223:pairedConnectionPoint ], [ sh:class s223:Fluid-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "An AirHeatExchanger shall have a role of Role-HeatTransfer."^^xsd:string ; - sh:message "s223: An AirHeatExchanger shall have a role of Role-HeatTransfer."^^xsd:string ; - sh:path s223:hasRole ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Role-HeatTransfer ] ], [ rdfs:comment "An AirHeatExchanger shall have at least two air inlets, each paired with an outlet."^^xsd:string ; sh:message "s223: An AirHeatExchanger shall have at least two air inlets, each paired with an outlet."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 2 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Fluid-Air ; - sh:path s223:hasMedium ], - [ sh:class s223:OutletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:OutletConnectionPoint ; sh:minCount 1 ; - sh:path s223:pairedConnectionPoint ] ] ] ], + sh:path s223:pairedConnectionPoint ], + [ sh:class s223:Fluid-Air ; + sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "An AirHeatExchanger shall have a role of Role-HeatTransfer."^^xsd:string ; + sh:message "s223: An AirHeatExchanger shall have a role of Role-HeatTransfer."^^xsd:string ; + sh:path s223:hasRole ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Role-HeatTransfer ] ], [ rdfs:comment "An AirHeatExchanger shall have no BidirectionalConnectionPoints."^^xsd:string ; sh:message "s223: An AirHeatExchanger shall have no BidirectionalConnectionPoints."^^xsd:string ; sh:path s223:hasConnectionPoint ; @@ -21874,6 +21874,12 @@ s223:ChilledBeam a s223:Class, sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Water ; sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "A ChilledBeam must be associated with the Role-Cooling using the relation hasRole"^^xsd:string ; + sh:message "s223: A ChilledBeam must be associated with the Role-Cooling using the relation hasRole"^^xsd:string ; + 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 bidirectional connection point using the medium Air."^^xsd:string ; sh:message "s223: A ChilledBeam shall have at least one bidirectional connection point using the medium Air."^^xsd:string ; sh:minCount 1 ; @@ -21882,12 +21888,6 @@ s223:ChilledBeam a s223:Class, sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A ChilledBeam must be associated with the Role-Cooling using the relation hasRole"^^xsd:string ; - sh:message "s223: A ChilledBeam must be associated with the Role-Cooling using the relation hasRole"^^xsd:string ; - 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 inlet using the medium Water."^^xsd:string ; sh:message "s223: A ChilledBeam shall have at least one inlet using the medium Water."^^xsd:string ; sh:minCount 1 ; @@ -22125,19 +22125,19 @@ s223:EthernetSwitch a s223:Class, rdfs:label "Ethernet switch"^^xsd:string ; rdfs:comment "A type of network hardware that connects 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:Equipment ; - sh:property [ rdfs:comment "An EthernetSwitch shall have at least one inlet using the medium Electricity."^^xsd:string ; - sh:message "s223: An EthernetSwitch shall have at least one inlet using the medium Electricity."^^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:path s223:hasMedium ] ] ] ], - [ rdfs:comment "An EthernetSwitch shall have at least two BidirectionalConnectionPoints using the medium Signal-Ethernet."^^xsd:string ; + sh:property [ rdfs:comment "An EthernetSwitch shall have at least two BidirectionalConnectionPoints using the medium Signal-Ethernet."^^xsd:string ; sh:message "s223: An EthernetSwitch shall have at least two BidirectionalConnectionPoints using the medium Signal-Ethernet."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 2 ; sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ; sh:node [ sh:property [ sh:class s223:Signal-Ethernet ; + sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "An EthernetSwitch shall have at least one inlet using the medium Electricity."^^xsd:string ; + sh:message "s223: An EthernetSwitch shall have at least one inlet using the medium Electricity."^^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:path s223:hasMedium ] ] ] ] . s223:Gas-SuperHeated a s223:Class, @@ -22174,16 +22174,16 @@ s223:GlycolSolution-30Percent a s223:Class, sh:NodeShape ; rdfs:label "GlycolSolution-30Percent"^^xsd:string ; s223:composedOf [ a s223:QuantifiableProperty ; - rdfs:label "Water conc"^^xsd:string ; - s223:hasValue 70.0 ; - s223:ofConstituent s223:Constituent-H2O ; - ns1:hasQuantityKind ; - ns1:hasUnit ], - [ a s223:QuantifiableProperty ; rdfs:label "Glycol conc"^^xsd:string ; s223:hasValue 30.0 ; s223:ofConstituent s223:Constituent-Glycol ; ns1:hasQuantityKind ; + ns1:hasUnit ], + [ a s223:QuantifiableProperty ; + rdfs:label "Water conc"^^xsd:string ; + s223:hasValue 70.0 ; + s223:ofConstituent s223:Constituent-H2O ; + ns1:hasQuantityKind ; ns1:hasUnit ] ; s223:hasFreezingPoint [ a s223:QuantifiableProperty ; rdfs:label "Freezing point"^^xsd:string ; @@ -22273,12 +22273,29 @@ s223:HydronicHeatExchanger a s223:Class, sh:path s223:hasRole ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:Role-HeatTransfer ] ], + [ rdfs:comment "A HydronicHeatExchanger shall have at least two liquid outlets, each paired with an inlet."^^xsd:string ; + sh:message "s223: A HydronicHeatExchanger shall have at least two liquid outlets, each paired with an inlet."^^xsd:string ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 2 ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:InletConnectionPoint ; + sh:minCount 1 ; + sh:path s223:pairedConnectionPoint ], + [ sh:class s223:Mix-Fluid ; + sh:path s223:hasMedium ] ] ] ], [ rdfs:comment "A HydronicHeatExchanger shall have no BidirectionalConnectionPoints."^^xsd:string ; sh:message "s223: A HydronicHeatExchanger shall have no BidirectionalConnectionPoints."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ; sh:message "s223: A HydronicHeatExchanger shall have no BidirectionalConnectionPoints."^^xsd:string ; sh:qualifiedMaxCount 0 ] ], + [ rdfs:comment "A HydronicHeatExchanger shall have no ConnectionPoints using the medium Air."^^xsd:string ; + sh:class s223:ConnectionPoint ; + sh:message "s223: A HydronicHeatExchanger shall have no ConnectionPoints using the medium Air."^^xsd:string ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMaxCount 0 ; + sh:qualifiedValueShape [ sh:property [ sh:class s223:Fluid-Air ; + sh:path s223:hasMedium ] ] ], [ rdfs:comment "A HydronicHeatExchanger shall have at least two liquid inlets, each paired with an outlet."^^xsd:string ; sh:message "s223: A HydronicHeatExchanger shall have at least two liquid inlets, each paired with an outlet."^^xsd:string ; sh:path s223:hasConnectionPoint ; @@ -22288,24 +22305,7 @@ s223:HydronicHeatExchanger a s223:Class, sh:minCount 1 ; sh:path s223:pairedConnectionPoint ], [ sh:class s223:Mix-Fluid ; - sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A HydronicHeatExchanger shall have at least two liquid outlets, each paired with an inlet."^^xsd:string ; - sh:message "s223: A HydronicHeatExchanger shall have at least two liquid outlets, each paired with an inlet."^^xsd:string ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 2 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Mix-Fluid ; - sh:path s223:hasMedium ], - [ sh:class s223:InletConnectionPoint ; - sh:minCount 1 ; - sh:path s223:pairedConnectionPoint ] ] ] ], - [ rdfs:comment "A HydronicHeatExchanger shall have no ConnectionPoints using the medium Air."^^xsd:string ; - sh:class s223:ConnectionPoint ; - sh:message "s223: A HydronicHeatExchanger shall have no ConnectionPoints using the medium Air."^^xsd:string ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMaxCount 0 ; - sh:qualifiedValueShape [ sh:property [ sh:class s223:Fluid-Air ; - sh:path s223:hasMedium ] ] ] . + sh:path s223:hasMedium ] ] ] ] . s223:Light-Ultraviolet a s223:Class, s223:Light-Ultraviolet, @@ -22739,17 +22739,17 @@ s223:System a s223:Class, sh:class s223:ConnectionPoint ; sh:message "s223: A System may be defined with a number of ConnectionPoints that are the \"boundary\" of the equipment. The hasBoundaryConnectionPoint relation is used to reference those connection points of its equipment that must be connected, but in the context of validating the a model with the system by itself, the \"dangling ConnectionPoint\" should not generate a validation error."^^xsd:string ; sh:path s223:hasBoundaryConnectionPoint ], + [ rdfs:comment "If the relation hasRole is present, it must associate the System with an EnumerationKind-Role."^^xsd:string ; + sh:class s223:EnumerationKind-Role ; + sh:message "s223: If the relation hasRole is present, it must associate the System with an EnumerationKind-Role."^^xsd:string ; + sh:path s223:hasRole ], [ a sh:PropertyShape ; rdfs:comment "A System should be associated with at least one instance of Equipment or System using the relation hasMember"^^xsd:string ; sh:message "s223: A System should be associated with at least one instance of Equipment or System using the relation hasMember"^^xsd:string ; sh:minCount 1 ; sh:or ( [ sh:class s223:Equipment ] [ sh:class s223:System ] ) ; sh:path s223:hasMember ; - sh:severity sh:Warning ], - [ rdfs:comment "If the relation hasRole is present, it must associate the System with an EnumerationKind-Role."^^xsd:string ; - sh:class s223:EnumerationKind-Role ; - sh:message "s223: If the relation hasRole is present, it must associate the System with an EnumerationKind-Role."^^xsd:string ; - sh:path s223:hasRole ] ; + sh:severity sh:Warning ] ; sh:rule [ a sh:TripleRule ; rdfs:comment "Infer the hasBoundaryConnectionPoint relation using hasOptionalConnectionPoint."^^xsd:string ; sh:name "InferredSystemToBoundaryConnectionPointFromOptional"^^xsd:string ; @@ -22859,20 +22859,20 @@ 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 outlet using the medium Light."^^xsd:string ; - sh:message "s223: A Window shall have at least one outlet using the medium Light."^^xsd:string ; + sh:property [ rdfs:comment "A Window shall have at least one inlet using the medium Light."^^xsd:string ; + sh:message "s223: 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 ] ] ] ], - [ rdfs:comment "A Window shall have at least one inlet using the medium Light."^^xsd:string ; - sh:message "s223: A Window shall have at least one inlet using the medium Light."^^xsd:string ; + [ rdfs:comment "A Window shall have at least one outlet using the medium Light."^^xsd:string ; + sh:message "s223: 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 ] ] ] ] . @@ -51772,17 +51772,17 @@ s223:DomainSpace a s223:Class, rdfs:label "Domain Space"^^xsd:string ; rdfs:comment "A DomainSpace is a member (or component) of a Zone and is associated with a Domain such as Lighting, HVAC, PhysicalSecurity, etc. Physical spaces enclose Domain spaces."^^xsd:string ; rdfs:subClassOf s223:Connectable ; - sh:property [ rdfs:comment "A DomainSpace must be associated with exactly one EnumerationKind-Domain using the relation hasDomain."^^xsd:string ; + sh:property [ rdfs:comment "A DomainSpace must be enclosed by a PhysicalSpace."^^xsd:string ; + sh:message "s223: A DomainSpace must be enclosed by a PhysicalSpace."^^xsd:string ; + sh:minCount 1 ; + sh:path [ sh:inversePath s223:encloses ] ; + sh:severity sh:Info ], + [ rdfs:comment "A DomainSpace 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 DomainSpace must be associated with exactly one EnumerationKind-Domain using the relation hasDomain."^^xsd:string ; sh:minCount 1 ; - sh:path s223:hasDomain ], - [ rdfs:comment "A DomainSpace must be enclosed by a PhysicalSpace."^^xsd:string ; - sh:message "s223: A DomainSpace must be enclosed by a PhysicalSpace."^^xsd:string ; - sh:minCount 1 ; - sh:path [ sh:inversePath s223:encloses ] ; - sh:severity sh:Info ] ; + sh:path s223:hasDomain ] ; sh:rule [ a sh:TripleRule ; rdfs:comment "Infer a hasDomain relation by checking any enclosing Zone to determine the domain."^^xsd:string ; sh:object [ sh:path ( [ sh:inversePath s223:hasDomainSpace ] s223:hasDomain ) ] ; @@ -51794,7 +51794,13 @@ s223:EnumerableProperty a s223:Class, rdfs:label "Enumerable Property"^^xsd:string ; rdfs:comment "An EnumerableProperty is a property with an enumerated (fixed) set of possible values."^^xsd:string ; rdfs:subClassOf s223:Property ; - sh:property [ rdfs:comment "Checks for valid enumeration value consistent with the stated EnumerationKind."^^xsd:string ; + sh:property [ rdfs:comment "An EnumerableProperty must be associated with exactly one EnumerationKind using the relation hasEnumerationKind."^^xsd:string ; + sh:class s223:EnumerationKind ; + sh:maxCount 1 ; + sh:message "s223: An EnumerableProperty must be associated with exactly one EnumerationKind using the relation hasEnumerationKind."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:hasEnumerationKind ], + [ rdfs:comment "Checks for valid enumeration value consistent with the stated EnumerationKind."^^xsd:string ; sh:path s223:hasValue ; sh:sparql [ a sh:SPARQLConstraint ; rdfs:comment "Checks for valid enumeration value consistent with the stated EnumerationKind."^^xsd:string ; @@ -51807,13 +51813,7 @@ $this s223:hasValue ?value . $this s223:hasEnumerationKind ?kind . FILTER (NOT EXISTS {?value a/rdfs:subClassOf* ?kind}) . } -"""^^xsd:string ] ], - [ rdfs:comment "An EnumerableProperty must be associated with exactly one EnumerationKind using the relation hasEnumerationKind."^^xsd:string ; - sh:class s223:EnumerationKind ; - sh:maxCount 1 ; - sh:message "s223: An EnumerableProperty must be associated with exactly one EnumerationKind using the relation hasEnumerationKind."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasEnumerationKind ] . +"""^^xsd:string ] ] . s223:ExternalReference a s223:Class, sh:NodeShape ; @@ -51885,17 +51885,17 @@ s223:PowerAndSignal-PoE a s223:Class, 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 DC electrical power."^^xsd:string ; + sh:property [ 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 ] ] ] ], - [ 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 Ethernet."^^xsd:string ; sh:path s223:composedOf ; sh:qualifiedMinCount 1 ; @@ -51920,18 +51920,18 @@ s223:RadiantHeater a s223:Class, """^^xsd:string ; rdfs:subClassOf s223:Equipment ; sh:message "s223: A RadiantHeater must conform to exactly one of the two patterns: Pattern 1: Exactly one inlet using the medium Constituent-Electricity or Fluid-NaturalGas. Pattern 2: Exactly one inlet and one outlet using the medium Fluid-Water."^^xsd:string ; - sh:property [ rdfs:comment "A RadiantHeater shall have at least one outlet connection point using the medium Infrared."^^xsd:string ; + sh:property [ rdfs:comment "A radiant heater must hasRole Role-Heating."^^xsd:string ; + sh:message "s223: A radiant heater must hasRole Role-Heating."^^xsd:string ; + sh:path s223:hasRole ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Role-Heating ] ], + [ rdfs:comment "A RadiantHeater shall have at least one outlet connection point using the medium Infrared."^^xsd:string ; sh:message "s223: A RadiantHeater shall have at least one outlet connection point using the medium Infrared."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Light-Infrared ; - sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A radiant heater must hasRole Role-Heating."^^xsd:string ; - sh:message "s223: A radiant heater must hasRole Role-Heating."^^xsd:string ; - sh:path s223:hasRole ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Role-Heating ] ] . + sh:path s223:hasMedium ] ] ] ] . s223:Radiator a s223:Class, sh:NodeShape ; @@ -51939,20 +51939,20 @@ s223:Radiator a s223:Class, rdfs:comment """A radiator provides primarily convective heating to a room using electricity, steam or water (e.g., electric baseboard heaters, heated floors, or traditional radiators)."""^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "Radiators must have the role Role-Heating."^^xsd:string ; - sh:message "s223: Radiators must have the role Role-Heating."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasRole ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Role-Heating ] ], - [ rdfs:comment "A Radiator shall have at least one bidirectional connection point using the medium Air."^^xsd:string ; + sh:property [ rdfs:comment "A Radiator shall have at least one bidirectional connection point using the medium Air."^^xsd:string ; sh:message "s223: A Radiator shall have at least one bidirectional connection point using the medium Air."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Air ; - sh:path s223:hasMedium ] ] ] ] . + sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "Radiators must have the role Role-Heating."^^xsd:string ; + sh:message "s223: Radiators must have the role Role-Heating."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:hasRole ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Role-Heating ] ] . s223:Voltage-0V a s223:Class, s223:Voltage-0V, @@ -59774,18 +59774,18 @@ s223:ElectricResistanceElement a s223:Class, rdfs:comment "Electric resistance elements provide electrical resistance heating, for example an electric heating coil within a Fan Coil Unit. It shall have one electricity InletConnectionPoint, plus fit one of the following two patterns: Pattern 1: An ElectricResistanceElement shall have exactly one Bidirectional ConnectionPoint using the medium Fluid. Pattern 2: An ElectricResistanceElement shall have one inlet and one outlet using the medium Fluid."^^xsd:string ; rdfs:subClassOf s223:Equipment ; sh:message "s223: An ElectricResistanceElement shall have one electricity InletConnectionPoint, plus fit one of the following two patterns: Pattern 1: An ElectricResistanceElement shall have exactly one Bidirectional ConnectionPoint using the medium Fluid. Pattern 2: An ElectricResistanceElement shall have one inlet and one outlet using the medium Fluid."^^xsd:string ; - sh:property [ rdfs:comment "An ElectricResistanceElement shall have at least one inlet using the medium Electricity."^^xsd:string ; + sh:property [ rdfs:comment "An ElectricResistanceElement shall have the role Role-Heating."^^xsd:string ; + sh:message "s223: An ElectricResistanceElement shall have the role Role-Heating."^^xsd:string ; + sh:path s223:hasRole ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Role-Heating ] ], + [ rdfs:comment "An ElectricResistanceElement shall have at least one inlet using the medium Electricity."^^xsd:string ; sh:message "s223: An ElectricResistanceElement shall have at least one inlet using the medium Electricity."^^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:path s223:hasMedium ] ] ] ], - [ rdfs:comment "An ElectricResistanceElement shall have the role Role-Heating."^^xsd:string ; - sh:message "s223: An ElectricResistanceElement shall have the role Role-Heating."^^xsd:string ; - sh:path s223:hasRole ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Role-Heating ] ] ; + sh:path s223:hasMedium ] ] ] ] ; sh:xone ( [ sh:property [ rdfs:comment "Pattern 1: An ElectricResistanceElement shall have exactly one Bidirectional ConnectionPoint using the medium Fluid."^^xsd:string ; sh:message "s223: Pattern 1: An ElectricResistanceElement requires exactly one BidirectionalConnectionPoint using the medium Fluid."^^xsd:string ; sh:path s223:hasConnectionPoint ; @@ -59823,20 +59823,20 @@ 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 inlet using the medium Air."^^xsd:string ; - sh:message "s223: A HeatPump shall have at least one inlet using the medium Air."^^xsd:string ; + sh:property [ rdfs:comment "A HeatPump shall have at least one outlet using the medium Air."^^xsd:string ; + sh:message "s223: 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 ] ] ] ], - [ rdfs:comment "A HeatPump shall have at least one outlet using the medium Air."^^xsd:string ; - sh:message "s223: A HeatPump shall have at least one outlet using the medium Air."^^xsd:string ; + [ rdfs:comment "A HeatPump shall have at least one inlet using the medium Air."^^xsd:string ; + sh:message "s223: 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 ] ] ] ] . @@ -59853,7 +59853,7 @@ it is not allowed to change the Medium that passes through it. This is why Junct 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 ; + 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 """ @@ -59865,48 +59865,20 @@ $this s223:cnx ?cp1 . $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 { - ?m1 s223:composedOf/s223:ofConstituent ?s11 . - ?m2 s223:composedOf/s223:ofConstituent ?s12 . - FILTER (?s11 = ?s12) . - } - FILTER NOT EXISTS { - ?m1 s223:composedOf/s223:ofConstituent ?s21 . - ?m2 s223:composedOf/s223:ofConstituent ?s22 . - {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} . - } +?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 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 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 ?m2 ?cp ?m1 -WHERE { -$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 { - ?m1 s223:composedOf/s223:ofConstituent ?s11 . - ?m2 s223:composedOf/s223:ofConstituent ?s12 . - FILTER (?s11 = ?s12) . - } - FILTER NOT EXISTS { - ?m1 s223:composedOf/s223:ofConstituent ?s21 . - ?m2 s223:composedOf/s223:ofConstituent ?s22 . - {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} . - } } """^^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 ; @@ -59930,79 +59902,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: 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 """ -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 . -?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 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 1: Two pure mediums."^^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 ?m2 ?cp ?m1 -WHERE { -$this s223:cnx ?cp . -?cp a/rdfs:subClassOf* s223:ConnectionPoint . -?cp s223:hasMedium ?m1 . -$this 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 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 2: A Junction with constituents and an associated ConnectionPoint with a pure Medium."^^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 ?m2 ?cp ?m1 -WHERE { -$this s223:cnx ?cp . -?cp a/rdfs:subClassOf* s223:ConnectionPoint . -?cp s223:hasMedium ?m1 . -$this 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 ; @@ -60025,6 +59924,107 @@ FILTER NOT EXISTS { {?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 ; + 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 ; + sh:prefixes ; + sh:select """ +SELECT $this ?m2 ?cp ?m1 +WHERE { +$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 { + ?m1 s223:composedOf/s223:ofConstituent ?s11 . + ?m2 s223:composedOf/s223:ofConstituent ?s12 . + FILTER (?s11 = ?s12) . + } + FILTER NOT EXISTS { + ?m1 s223:composedOf/s223:ofConstituent ?s21 . + ?m2 s223:composedOf/s223:ofConstituent ?s22 . + {?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 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 1: Two pure mediums."^^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 ?m2 ?cp ?m1 +WHERE { +$this s223:cnx ?cp . +?cp a/rdfs:subClassOf* s223:ConnectionPoint . +?cp s223:hasMedium ?m1 . +$this 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 "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 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 ?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 . +?cp2 s223:hasMedium ?m2 . + ?m1 s223:composedOf/s223:ofConstituent ?s1 . + ?m2 s223:composedOf/s223:ofConstituent ?s2 . + FILTER NOT EXISTS { + ?m1 s223:composedOf/s223:ofConstituent ?s11 . + ?m2 s223:composedOf/s223:ofConstituent ?s12 . + FILTER (?s11 = ?s12) . + } + FILTER NOT EXISTS { + ?m1 s223:composedOf/s223:ofConstituent ?s21 . + ?m2 s223:composedOf/s223:ofConstituent ?s22 . + {?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 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 2: A Junction with constituents and an associated ConnectionPoint with a pure Medium."^^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 ?m2 ?cp ?m1 +WHERE { +$this s223:cnx ?cp . +?cp a/rdfs:subClassOf* s223:ConnectionPoint . +?cp s223:hasMedium ?m1 . +$this 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 ] ] . s223:LightSensor a s223:Class, @@ -60075,14 +60075,14 @@ s223:PhysicalSpace a s223:Class, rdfs:label "Physical Space"^^xsd:string ; rdfs:comment "A PhysicalSpace is an architectural concept representing a room, a collection of rooms such as a floor, a part of a room, or any physical space that might not even be thought of as a room, such as a patio space or a roof."^^xsd:string ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "If the relation contains is present it must associate the PhysicalSpace with a PhysicalSpace."^^xsd:string ; - sh:class s223:PhysicalSpace ; - sh:message "s223: If the relation contains is present it must associate the PhysicalSpace with a PhysicalSpace."^^xsd:string ; - sh:path s223:contains ], - [ rdfs:comment "If the relation encloses is present it must associate the PhysicalSpace with a DomainSpace."^^xsd:string ; + sh:property [ rdfs:comment "If the relation encloses is present it must associate the PhysicalSpace with a DomainSpace."^^xsd:string ; sh:class s223:DomainSpace ; sh:message "s223: If the relation encloses is present it must associate the PhysicalSpace with a DomainSpace."^^xsd:string ; - sh:path s223:encloses ] . + sh:path s223:encloses ], + [ rdfs:comment "If the relation contains is present it must associate the PhysicalSpace with a PhysicalSpace."^^xsd:string ; + sh:class s223:PhysicalSpace ; + sh:message "s223: If the relation contains is present it must associate the PhysicalSpace with a PhysicalSpace."^^xsd:string ; + sh:path s223:contains ] . s223:Role-Controller a s223:Class, s223:Role-Controller, @@ -60144,12 +60144,12 @@ s223:Water-GlycolSolution a s223:Class, rdfs:label "Water-GlycolSolution"^^xsd:string ; s223:composedOf [ a s223:QuantifiableProperty ; rdfs:label "Unspecified"^^xsd:string ; - s223:ofConstituent s223:Constituent-H2O ; + s223:ofConstituent s223:Constituent-Glycol ; ns1:hasQuantityKind ; ns1:hasUnit ], [ a s223:QuantifiableProperty ; rdfs:label "Unspecified"^^xsd:string ; - s223:ofConstituent s223:Constituent-Glycol ; + s223:ofConstituent s223:Constituent-H2O ; ns1:hasQuantityKind ; ns1:hasUnit ] ; s223:hasFreezingPoint [ a s223:QuantifiableProperty ; @@ -60167,10 +60167,12 @@ s223:Water-GlycolSolution a s223:Class, [ 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 ; + [ 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:minCount 2 ; - sh:path s223:composedOf ], + 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 "One of the constituents of a Water-GlycolSolution must be Constituent-H2O."^^xsd:string ; sh:path s223:composedOf ; sh:qualifiedMinCount 1 ; @@ -60181,12 +60183,10 @@ s223:Water-GlycolSolution a s223:Class, [ rdfs:comment "The quantity kind of the constituent must be VolumeFraction."^^xsd:string ; sh:hasValue ; sh:path ns1:hasQuantityKind ] ] ] ], - [ rdfs:comment "If the relation hasFreezingPoint is used, the object must be a QuantifiableProperty with a quantity kind of Temperature."^^xsd:string ; + [ rdfs:comment "There must be at least two QuantifiableProperties that characterize the constituents of a Water-GlycolSolution."^^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 ] . + sh:minCount 2 ; + sh:path s223:composedOf ] . s223:Zone a s223:Class, sh:NodeShape ; @@ -60199,11 +60199,6 @@ s223:Zone a s223:Class, 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 ; @@ -60219,15 +60214,20 @@ $this s223:contains ?ds . ?ds s223:hasDomain ?dsdomain . FILTER (?domain != ?dsdomain) } -"""^^xsd:string ] ] ; +"""^^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 ] ; 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 ) ] ; + rdfs:comment "Infer a hasDomain relation by checking any enclosed DomainSpaces to determine the domain."^^xsd:string ; + sh:object [ sh:path ( s223:hasDomainSpace s223:hasDomain ) ] ; sh:predicate s223:hasDomain ; sh:subject sh:this ], [ a sh:TripleRule ; - rdfs:comment "Infer a hasDomain relation by checking any enclosed DomainSpaces to determine the domain."^^xsd:string ; - sh:object [ sh:path ( s223:hasDomainSpace s223:hasDomain ) ] ; + 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 ) ] ; sh:predicate s223:hasDomain ; sh:subject sh:this ] . @@ -67998,38 +67998,31 @@ s223:Coil a s223:Class, sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Mix-Fluid ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "Pattern 1: For one of the two inlets the Fluid is Air."^^xsd:string ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMaxCount 1 ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Fluid-Air ; - sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "Pattern 1: For one of the two outlets the Fluid is Air."^^xsd:string ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMaxCount 1 ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Fluid-Air ; - sh:path s223:hasMedium ] ] ] ], [ rdfs:comment "Pattern 1: A Coil shall have two outlets using the medium Fluid."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:qualifiedMaxCount 2 ; sh:qualifiedMinCount 2 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Mix-Fluid ; - sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "Pattern 2: A Coil shall have one outlet using the medium Fluid."^^xsd:string ; + sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "Pattern 1: For one of the two outlets the Fluid is Air."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:qualifiedMaxCount 1 ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Mix-Fluid ; + sh:node [ sh:property [ sh:class s223:Fluid-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "Pattern 2: A Coil shall have one inlet using the medium Fluid."^^xsd:string ; + [ rdfs:comment "Pattern 1: For one of the two inlets the Fluid is Air."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:qualifiedMaxCount 1 ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Fluid-Air ; + sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "Pattern 2: A Coil shall have one outlet using the medium Fluid."^^xsd:string ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMaxCount 1 ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Mix-Fluid ; sh:path s223:hasMedium ] ] ] ], [ rdfs:comment "Pattern 2: A Coil shall have one or two bidirectionals using the medium Fluid or ThermalContact."^^xsd:string ; @@ -68039,7 +68032,14 @@ s223:Coil a s223:Class, sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ; sh:node [ sh:property [ sh:or ( [ sh:class s223:Mix-Fluid ] [ sh:class s223:Medium-ThermalContact ] ) ; sh:path s223:hasMedium ] ] ] ; - sh:qualifiedValueShapesDisjoint true ] ] [ sh:property [ rdfs:comment "Pattern 3: A Coil shall have three bidirectionals using the medium Fluid or ThermalContact."^^xsd:string ; + sh:qualifiedValueShapesDisjoint true ], + [ rdfs:comment "Pattern 2: A Coil shall have one inlet using the medium Fluid."^^xsd:string ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMaxCount 1 ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Mix-Fluid ; + sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "Pattern 3: A Coil shall have three bidirectionals using the medium Fluid or ThermalContact."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:qualifiedMaxCount 3 ; sh:qualifiedMinCount 3 ; @@ -68128,14 +68128,14 @@ s223:Function a s223:Class, rdfs:label "Function"^^xsd:string ; rdfs:comment "A Function is used to model transfer and/or transformation of information (i.e. Property). It has relations to input Properties and output Properties. The actual algorithms that perform the transformations are described in CDL and are out of scope of the 223 standard."^^xsd:string ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "If the relation hasOutput is present it must associate a Function with a Property."^^xsd:string ; - sh:class s223:Property ; - sh:message "s223: If the relation hasOutput is present it must associate a Function with a Property."^^xsd:string ; - sh:path s223:hasOutput ], - [ rdfs:comment "If the relation hasInput is present it must associate a Function with a Property."^^xsd:string ; + sh:property [ rdfs:comment "If the relation hasInput is present it must associate a Function with a Property."^^xsd:string ; sh:class s223:Property ; sh:message "s223: If the relation hasInput is present it must associate a Function with a Property."^^xsd:string ; - sh:path s223:hasInput ] . + sh:path s223:hasInput ], + [ rdfs:comment "If the relation hasOutput is present it must associate a Function with a Property."^^xsd:string ; + sh:class s223:Property ; + sh:message "s223: If the relation hasOutput is present it must associate a Function with a Property."^^xsd:string ; + sh:path s223:hasOutput ] . s223:LineNeutralVoltage-110V a s223:Class, s223:LineNeutralVoltage-110V, @@ -68320,20 +68320,20 @@ 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:message "s223: 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:message "s223: 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 ; - sh:message "s223: 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:message "s223: 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 ] ] ] ] . @@ -71180,20 +71180,20 @@ s223:Damper a s223:Class, rdfs:label "Damper"^^xsd:string ; rdfs:comment "An element inserted into an air-distribution system or element of an air-distribution system permitting modification of the air resistance of the system and consequently changing the airflow rate or shutting off the airflow."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A Damper shall have at least one inlet using the medium Air."^^xsd:string ; - sh:message "s223: A Damper shall have at least one inlet using the medium Air."^^xsd:string ; + sh:property [ rdfs:comment "A Damper shall have at least one outlet using the medium Air."^^xsd:string ; + sh:message "s223: A Damper 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 ] ] ] ], - [ rdfs:comment "A Damper shall have at least one outlet using the medium Air."^^xsd:string ; - sh:message "s223: A Damper shall have at least one outlet using the medium Air."^^xsd:string ; + [ rdfs:comment "A Damper shall have at least one inlet using the medium Air."^^xsd:string ; + sh:message "s223: A Damper 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 ] ] ] ] . @@ -71217,13 +71217,7 @@ 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 """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:property [ 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 ; @@ -71235,7 +71229,13 @@ WHERE { $this s223:composedOf ?constituent . ?constituent s223:ofConstituent/s223:composedOf ?nextConstituent . } -"""^^xsd:string ] ] . +"""^^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 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 ] . s223:Fan a s223:Class, sh:NodeShape ; @@ -79116,83 +79116,7 @@ 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 hasRole is present it must associate the Connection with an EnumerationKind-Role."^^xsd:string ; - sh:class s223:EnumerationKind-Role ; - sh:message "s223: If the relation hasRole is present it must associate the Connection with an EnumerationKind-Role."^^xsd:string ; - sh:path s223:hasRole ], - [ 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 1: Two pure mediums."^^xsd:string ; - sh:message "s223: Connection {$this} with Medium {?m2} is incompatible with {?cp} with Medium {?m1}."^^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 ?m1 . -$this 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 "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 ; - 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 . -?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 "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 4: A Connection with constituents and an associated ConnectionPoint with constituents."^^xsd:string ; - sh:message "s223: Connection {$this} with Medium {?m2} is incompatible with {?cp} with Medium {?m1}."^^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 . - ?m1 s223:composedOf/s223:ofConstituent ?s1 . - ?m2 s223:composedOf/s223:ofConstituent ?s2 . - FILTER NOT EXISTS { - ?m1 s223:composedOf/s223:ofConstituent ?s11 . - ?m2 s223:composedOf/s223:ofConstituent ?s12 . - FILTER (?s11 = ?s12) . - } - FILTER NOT EXISTS { - ?m1 s223:composedOf/s223:ofConstituent ?s21 . - ?m2 s223:composedOf/s223:ofConstituent ?s22 . - {?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:property [ 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 ; @@ -79214,11 +79138,6 @@ FILTER NOT EXISTS { } } """^^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:message "s223: If the relation connectsFrom is present it must associate the Connection with a Connectable."^^xsd:string ; - 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 ; @@ -79230,17 +79149,6 @@ WHERE { $this s223:cnx ?something . FILTER NOT EXISTS {?something a/rdfs:subClassOf* s223:ConnectionPoint} . }"""^^xsd:string ] ], - [ rdfs:comment "If the relation connectsTo is present it must associate the Connection with a Connectable."^^xsd:string ; - sh:class s223:Connectable ; - sh:message "s223: If the relation connectsTo is present it must associate the Connection with a Connectable."^^xsd:string ; - sh:name "ConnectionToDownstreamConnectableShape"^^xsd:string ; - sh:path s223:connectsTo ], - [ rdfs:comment "A Connection must have two or more connectsAt relations to ConnectionPoints"^^xsd:string ; - sh:class s223:ConnectionPoint ; - sh:message "s223: A Connection must have two or more connectsAt relations to ConnectionPoints"^^xsd:string ; - sh:minCount 2 ; - sh:path s223:connectsAt ; - 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 ; @@ -79266,10 +79174,13 @@ FILTER NOT EXISTS { } } """^^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:path s223:cnx ], + [ 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 "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 ; @@ -79300,12 +79211,85 @@ FILTER (?cp1 != ?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 1: Two pure mediums."^^xsd:string ; + sh:message "s223: Connection {$this} with Medium {?m2} is incompatible with {?cp} with Medium {?m1}."^^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 ?m1 . +$this 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 "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 "A Connection must have two or more connectsAt relations to ConnectionPoints"^^xsd:string ; + sh:class s223:ConnectionPoint ; + sh:message "s223: A Connection must have two or more connectsAt relations to ConnectionPoints"^^xsd:string ; + sh:minCount 2 ; + sh:path s223:connectsAt ; + sh:severity sh:Warning ], + [ rdfs:comment "If the relation connectsFrom is present it must associate the Connection with a Connectable."^^xsd:string ; + sh:class s223:Connectable ; + sh:message "s223: If the relation connectsFrom is present it must associate the Connection with a Connectable."^^xsd:string ; + sh:name "ConnectionToUpstreamConnectableShape"^^xsd:string ; + sh:path s223:connectsFrom ], + [ 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:message "s223: If the relation hasRole is present it must associate the Connection with an EnumerationKind-Role."^^xsd:string ; + sh:path s223:hasRole ], + [ 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 4: A Connection with constituents and an associated ConnectionPoint with constituents."^^xsd:string ; + sh:message "s223: Connection {$this} with Medium {?m2} is incompatible with {?cp} with Medium {?m1}."^^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 . + ?m1 s223:composedOf/s223:ofConstituent ?s1 . + ?m2 s223:composedOf/s223:ofConstituent ?s2 . + FILTER NOT EXISTS { + ?m1 s223:composedOf/s223:ofConstituent ?s11 . + ?m2 s223:composedOf/s223:ofConstituent ?s12 . + FILTER (?s11 = ?s12) . + } + FILTER NOT EXISTS { + ?m1 s223:composedOf/s223:ofConstituent ?s21 . + ?m2 s223:composedOf/s223:ofConstituent ?s22 . + {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} . + } +} +"""^^xsd:string ] ], + [ rdfs:comment "If the relation connectsTo is present it must associate the Connection with a Connectable."^^xsd:string ; + sh:class s223:Connectable ; + sh:message "s223: If the relation connectsTo is present it must associate the Connection with a Connectable."^^xsd:string ; + sh:name "ConnectionToDownstreamConnectableShape"^^xsd:string ; + sh:path s223:connectsTo ], + [ 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:path s223:cnx ], [ 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 ; @@ -79328,54 +79312,70 @@ FILTER NOT EXISTS { } } """^^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 ] ; - 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 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 ; + [ 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 ; + 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 . +?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 ] ] ; + sh:rule [ a sh:SPARQLRule ; + rdfs:comment "Infer the connectsTo relation using connectsAt"^^xsd:string ; sh:construct """ -CONSTRUCT {$this s223:connectsFrom ?equipment .} +CONSTRUCT {$this s223:connectsTo ?equipment .} WHERE { $this s223:connectsAt ?cp . -?cp a s223:OutletConnectionPoint . +?cp a s223:InletConnectionPoint . ?cp s223:isConnectionPointOf ?equipment . } """^^xsd:string ; - sh:name "InferredConnectionToUpstreamEquipmentProperty"^^xsd:string ; + sh:name "InferredConnectionToDownstreamEquipmentProperty"^^xsd:string ; sh:prefixes ], [ a sh:SPARQLRule ; - rdfs:comment "Infer the connectsTo relation using connectsAt"^^xsd:string ; + rdfs:comment "Infer the connectsFrom relation using connectsAt"^^xsd:string ; sh:construct """ -CONSTRUCT {$this s223:connectsTo ?equipment .} +CONSTRUCT {$this s223:connectsFrom ?equipment .} WHERE { $this s223:connectsAt ?cp . -?cp a s223:InletConnectionPoint . +?cp a s223:OutletConnectionPoint . ?cp s223:isConnectionPointOf ?equipment . } """^^xsd:string ; - sh:name "InferredConnectionToDownstreamEquipmentProperty"^^xsd:string ; + sh:name "InferredConnectionToUpstreamEquipmentProperty"^^xsd:string ; sh:prefixes ], + [ 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 ] . s223:Constituent-H2O a s223:Class, @@ -81335,17 +81335,7 @@ s223:Sensor a s223:Class, rdfs:label "Sensor"^^xsd:string ; rdfs:comment "A Sensor observes an ObservableProperty (see `s223:ObservableProperty`) which may be quantifiable (see `s223:QuantifiableObservableProperty`), such as a temperature, flowrate, or concentration, or Enumerable (see `s223:EnumeratedObservableProperty`), such as an alarm state or occupancy state."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "If a Sensor measures a differential property, it must be associated with exactly 1 of Connectable, Connection, or ConnectionPoint using the relation hasReferenceLocation."^^xsd:string ; - sh:maxCount 1 ; - sh:message "s223: If a Sensor measures a differential property, it must be associated with exactly 1 of Connectable, Connection, or ConnectionPoint using the relation hasReferenceLocation."^^xsd:string ; - sh:path s223:hasReferenceLocation ], - [ rdfs:comment "A Sensor must be associated with exactly one ObservableProperty using the relation observes."^^xsd:string ; - sh:class s223:ObservableProperty ; - sh:maxCount 1 ; - sh:message "s223: A Sensor must be associated with exactly one ObservableProperty using the relation observes."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:observes ], - [ rdfs:comment "s223: If the hasReferenceLocation relation exists, the observed Property must have isDeltaQuantity true."^^xsd:string ; + sh:property [ rdfs:comment "s223: If the hasReferenceLocation relation exists, the observed Property must have isDeltaQuantity true."^^xsd:string ; sh:path s223:observes ; sh:sparql [ a sh:SPARQLConstraint ; rdfs:comment "s223: If the hasReferenceLocation relation exists, the observed Property must have isDeltaQuantity true."^^xsd:string ; @@ -81360,6 +81350,16 @@ $this s223:observes ?x . FILTER NOT EXISTS {$this s223:observes/qudt:isDeltaQuantity true} } """^^xsd:string ] ], + [ rdfs:comment "If a Sensor measures a differential property, it must be associated with exactly 1 of Connectable, Connection, or ConnectionPoint using the relation hasReferenceLocation."^^xsd:string ; + sh:maxCount 1 ; + sh:message "s223: If a Sensor measures a differential property, it must be associated with exactly 1 of Connectable, Connection, or ConnectionPoint using the relation hasReferenceLocation."^^xsd:string ; + sh:path s223:hasReferenceLocation ], + [ rdfs:comment "A Sensor must be associated with exactly one ObservableProperty using the relation observes."^^xsd:string ; + sh:class s223:ObservableProperty ; + sh:maxCount 1 ; + sh:message "s223: A Sensor must be associated with exactly one ObservableProperty using the relation observes."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:observes ], [ rdfs:comment "s223: If the observed Property has isDeltaQuantity true, the Sensor must have a hasReferenceLocation relation."^^xsd:string ; sh:path s223:observes ; sh:sparql [ a sh:SPARQLConstraint ; @@ -81375,15 +81375,15 @@ $this s223:observes ?x . FILTER NOT EXISTS {$this s223:hasReferenceLocation ?y} } """^^xsd:string ] ], - [ rdfs:comment "If the relation hasMeasurementResolution is present it must associate a Sensor with a QuantifiableProperty."^^xsd:string ; - sh:class s223:QuantifiableProperty ; - sh:message "s223: If the relation hasMeasurementResolution is present it must associate a Sensor with a QuantifiableProperty."^^xsd:string ; - sh:path s223:hasMeasurementResolution ], [ rdfs:comment "A Sensor must be associated with exactly one location using the relation hasObservationLocation."^^xsd:string ; sh:maxCount 1 ; sh:message "s223: A Sensor must be associated with exactly one location using the relation hasObservationLocation."^^xsd:string ; sh:minCount 1 ; - sh:path s223:hasObservationLocation ] ; + sh:path s223:hasObservationLocation ], + [ rdfs:comment "If the relation hasMeasurementResolution is present it must associate a Sensor with a QuantifiableProperty."^^xsd:string ; + sh:class s223:QuantifiableProperty ; + sh:message "s223: If the relation hasMeasurementResolution is present it must associate a Sensor with a QuantifiableProperty."^^xsd:string ; + sh:path s223:hasMeasurementResolution ] ; sh:rule [ a sh:SPARQLRule ; rdfs:comment "Infer the hasObservationLocation relation for a Sensor from the Property that it is observing, only if that property is associated with a single entity."^^xsd:string ; sh:construct """ @@ -82604,7 +82604,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 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:property [ rdfs:comment "If the relation connected is present it must associate the Connectable with a Connectable."^^xsd:string ; + sh:class s223:Connectable ; + sh:message "s223: If the relation connected is present it must associate the Connectable with a Connectable."^^xsd:string ; + sh:name "SymmetricConnectableToConnectableShape"^^xsd:string ; + sh:path s223:connected ], + [ rdfs:comment "If the relation cnx is present it must associate the Connectable with a ConnectionPoint."^^xsd:string ; + sh:class s223:ConnectionPoint ; + sh:message "s223: If the relation cnx is present it must associate the Connectable with a ConnectionPoint."^^xsd:string ; + sh:path s223:cnx ], + [ 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 ; sh:sparql [ a sh:SPARQLConstraint ; @@ -82618,45 +82627,48 @@ $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:message "s223: If the relation connectedFrom is present it must associate the Connectable with a Connectable."^^xsd:string ; - sh:path s223:connectedFrom ], [ rdfs:comment "If the relation hasConnectionPoint is present it must associate the Connectable with a ConnectionPoint."^^xsd:string ; sh:class s223:ConnectionPoint ; sh:message "s223: If the relation hasConnectionPoint is present it must associate the Connectable with a ConnectionPoint."^^xsd:string ; sh:name "EquipmentToConnectionPointShape"^^xsd:string ; sh:path s223:hasConnectionPoint ], - [ rdfs:comment "If the relation connected is present it must associate the Connectable with a Connectable."^^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:message "s223: If the relation connected is present it must associate the Connectable with a Connectable."^^xsd:string ; - sh:name "SymmetricConnectableToConnectableShape"^^xsd:string ; - sh:path s223:connected ], - [ rdfs:comment "If the relation connectedThrough is present it must associate the Connectable with a Connection."^^xsd:string ; - sh:class s223:Connection ; - sh:message "s223: If the relation connectedThrough is present it must associate the Connectable with a Connection."^^xsd:string ; - sh:name "EquipmentToConnectionShape"^^xsd:string ; - sh:path s223:connectedThrough ], + sh:message "s223: If the relation connectedFrom is present it must associate the Connectable with a Connectable."^^xsd:string ; + sh:path s223:connectedFrom ], [ rdfs:comment "If the relation connectedTo is present it must associate the Connectable with a Connectable."^^xsd:string ; sh:class s223:Connectable ; sh:message "s223: If the relation connectedTo is present it must associate the Connectable with a Connectable."^^xsd:string ; 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:message "s223: If the relation cnx is present it must associate the Connectable with a ConnectionPoint."^^xsd:string ; - sh:path s223:cnx ] ; - sh:rule [ 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 "If the relation connectedThrough is present it must associate the Connectable with a Connection."^^xsd:string ; + sh:class s223:Connection ; + sh:message "s223: If the relation connectedThrough is present it must associate the Connectable with a Connection."^^xsd:string ; + sh:name "EquipmentToConnectionShape"^^xsd:string ; + sh:path s223:connectedThrough ] ; + sh:rule [ a sh:SPARQLRule ; + rdfs:comment "Infer the connectedFrom relations using connectsThrough and connectsFrom."^^xsd:string ; + sh:construct """ +CONSTRUCT {$this s223:connectedFrom ?equipment .} +WHERE { +$this s223:hasConnectionPoint ?cp . +?cp a s223:InletConnectionPoint . +?cp s223:connectsThrough/s223:connectsFrom ?equipment . +} +"""^^xsd:string ; + sh:name "InferredEquipmentToUpstreamEquipmentProperty"^^xsd:string ; + sh:prefixes ], + [ 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 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 ; + 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 hasConnectionPoint relation using cnx"^^xsd:string ; @@ -82664,6 +82676,12 @@ FILTER NOT EXISTS {$this s223:cnx+ ?otherC} sh:object [ sh:path s223:cnx ] ; sh:predicate s223:hasConnectionPoint ; 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 ], [ a sh:SPARQLRule ; rdfs:comment "Infer the connectedTo relation using connectsThrough and connectsTo."^^xsd:string ; sh:construct """ @@ -82676,12 +82694,6 @@ $this s223:hasConnectionPoint ?cp . """^^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 ; - sh:subject sh:this ], [ a sh:SPARQLRule ; rdfs:comment "Infer the connected relation for BiDirectional connections"^^xsd:string ; sh:construct """ @@ -82695,29 +82707,17 @@ FILTER NOT EXISTS {?d2 s223:contains* $this} . """^^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 """ -CONSTRUCT {$this s223:connectedFrom ?equipment .} -WHERE { -$this s223:hasConnectionPoint ?cp . -?cp a s223:InletConnectionPoint . -?cp s223:connectsThrough/s223:connectsFrom ?equipment . -} -"""^^xsd:string ; - sh:name "InferredEquipmentToUpstreamEquipmentProperty"^^xsd:string ; - sh:prefixes ], [ 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 ; + 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: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 ; + 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 ] . s223:cnx a s223:SymmetricProperty ; @@ -83827,15 +83827,15 @@ 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 "If the relation hasProperty is present, it must associate the concept with a Property."^^xsd:string ; - sh:class s223:Property ; - sh:message "s223: If the relation hasProperty is present, it must associate the concept with a Property."^^xsd:string ; - sh:path s223:hasProperty ], - [ rdfs:comment "A Concept must be associated with at least one label using the relation label."^^xsd:string ; + sh:property [ 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 ] ; + 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:message "s223: If the relation hasProperty is present, it must associate the concept with a Property."^^xsd:string ; + sh:path s223:hasProperty ] ; sh:rule [ a sh:SPARQLRule ; rdfs:comment "Add an rdfs:label if it is missing."^^xsd:string ; sh:construct """ @@ -83850,7 +83850,24 @@ BIND(REPLACE(?localName, "-", " ", "i") AS ?newLabel) sh:name "AddLabelFromLocalName"^^xsd:string ; sh:prefixes ] ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 4: A medium with constituents and an associated property with constituents."^^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 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 1: Two pure mediums."^^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 """ @@ -83860,31 +83877,24 @@ $this s223:hasMedium ?m1 . $this ?p ?prop . ?prop a/rdfs:subClassOf* s223:Property . ?prop s223:ofMedium ?m2 . - ?m1 s223:composedOf/s223:ofConstituent ?s1 . - ?m2 s223:composedOf/s223:ofConstituent ?s2 . - FILTER NOT EXISTS { - ?m1 s223:composedOf/s223:ofConstituent ?s11 . - ?m2 s223:composedOf/s223:ofConstituent ?s12 . - FILTER (?s11 = ?s12) . - } - FILTER NOT EXISTS { - ?m1 s223:composedOf/s223:ofConstituent ?s21 . - ?m2 s223:composedOf/s223:ofConstituent ?s22 . - {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} . - } +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 ], [ 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 { @@ -83894,7 +83904,7 @@ FILTER NOT EXISTS { } """^^xsd:string ], [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 1: Two pure mediums."^^xsd:string ; + 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 ; sh:select """ @@ -83904,41 +83914,31 @@ $this s223:hasMedium ?m1 . $this ?p ?prop . ?prop a/rdfs:subClassOf* s223:Property . ?prop s223:ofMedium ?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 ], - [ 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)) . + ?m1 s223:composedOf/s223:ofConstituent ?s1 . + ?m2 s223:composedOf/s223:ofConstituent ?s2 . + FILTER NOT EXISTS { + ?m1 s223:composedOf/s223:ofConstituent ?s11 . + ?m2 s223:composedOf/s223:ofConstituent ?s12 . + FILTER (?s11 = ?s12) . + } + FILTER NOT EXISTS { + ?m1 s223:composedOf/s223:ofConstituent ?s21 . + ?m2 s223:composedOf/s223:ofConstituent ?s22 . + {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} . + } } """^^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 "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 ?m2 . +$this s223:hasMedium ?m1 . $this ?p ?prop . ?prop a/rdfs:subClassOf* s223:Property . -?prop s223:ofMedium ?m1 . +?prop s223:ofMedium ?m2 . ?m2 s223:composedOf/s223:ofConstituent ?s2 . FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . FILTER NOT EXISTS { @@ -84387,42 +84387,56 @@ ConnectionPoints are represented graphically in this standard by a triangle with """^^xsd:string ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the entity identified by the mapsTo+ relation."^^xsd:string ; - sh:name "Test for compatible declared Medium"^^xsd:string ; - sh:path s223:hasMedium ; + sh:property [ 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 ; - rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the entity identified by the mapsTo+ relation."^^xsd:string ; - sh:message "s223: {$this} declares a Medium of {?a}, but the Medium of {?b} is declared by {?target} pointed to by the mapsTo+ relation."^^xsd:string ; + rdfs:comment "If a ConnectionPoint mapsTo another ConnectionPoint, the respective Equipment should have a contains relation."^^xsd:string ; + sh:message "s223: {?otherEquipment} should contain {?equipment} because ConnectionPoint {$this} has a mapsTo relation."^^xsd:string ; sh:prefixes ; sh:select """ -SELECT DISTINCT $this ?a ?b ?target +SELECT $this ?equipment ?otherEquipment WHERE { -$this s223:hasMedium ?a . -$this s223:mapsTo+ ?target . -?target s223:hasMedium ?b . -?a a/rdfs:subClassOf* s223:EnumerationKind-Medium . -?b a/rdfs:subClassOf* s223:EnumerationKind-Medium . -FILTER (?a != ?b ) . -FILTER (NOT EXISTS {?b a/rdfs:subClassOf* ?a}) . -FILTER (NOT EXISTS {?a a/rdfs:subClassOf* ?b}) . +$this s223:mapsTo ?otherCP . +?equipment s223:hasConnectionPoint $this . +?otherEquipment s223:hasConnectionPoint ?otherCP . +FILTER NOT EXISTS {?otherEquipment s223:contains ?equipment} } """^^xsd:string ] ], - [ rdfs:comment "A ConnectionPoint must be associated with at most one Connection using the relation connectsThrough."^^xsd:string ; - sh:class s223:Connection ; - sh:maxCount 1 ; - sh:message "s223: This ConnectionPoint must be associated with at most one Connection."^^xsd:string ; - sh:name "ConnectionPointToConnectionShape"^^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:path s223:connectsThrough ; - sh:severity sh:Info ], + 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, or use of hasOptionalConnectionPoint or hasBoundaryConnectionPoint qualifiers."^^xsd:string ; + sh:prefixes ; + sh:select """ + SELECT $this + WHERE { + FILTER NOT EXISTS {?sys1 s223:hasBoundaryConnectionPoint $this} . + FILTER NOT EXISTS {?sys2 s223:hasOptionalConnectionPoint $this} . + 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 the relation hasElectricalPhase is present it must associate the ConnectionPoint with an ElectricalPhaseIdentifier or ElectricalVoltagePhases."^^xsd:string ; sh:message "s223: 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 can be associated with at most one other ConnectionPoint using the inverse of relation mapsTo"^^xsd:string ; - sh:class s223:ConnectionPoint ; + [ 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 can be associated with at most one other ConnectionPoint using the inverse of relation mapsTo"^^xsd:string ; - sh:path [ sh:inversePath s223:mapsTo ] ], + 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 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 not have both a mapsTo and a connectsThrough relation."^^xsd:string ; sh:path s223:mapsTo ; sh:sparql [ a sh:SPARQLConstraint ; @@ -84437,51 +84451,38 @@ $this s223:connectsThrough ?connection . ?connection a/rdfs:subClassOf* s223:Connection . } """^^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 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} . - FILTER NOT EXISTS {?anything3 s223:hasBoundaryConnectionPoint $this} . - $this s223:isConnectionPointOf ?equipment . - ?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 ; + [ rdfs:comment "A ConnectionPoint must be associated with at most one Connection using the relation connectsThrough."^^xsd:string ; + sh:class s223:Connection ; + sh:maxCount 1 ; + sh:message "s223: This ConnectionPoint must be associated with at most one Connection."^^xsd:string ; + sh:name "ConnectionPointToConnectionShape"^^xsd:string ; + sh:path s223:connectsThrough ; + sh:severity sh:Info ], + [ rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the entity identified by the mapsTo+ relation."^^xsd:string ; + sh:name "Test for compatible declared Medium"^^xsd:string ; + sh:path s223:hasMedium ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "If a ConnectionPoint mapsTo another ConnectionPoint, the respective Equipment should have a contains relation."^^xsd:string ; - sh:message "s223: {?otherEquipment} should contain {?equipment} because ConnectionPoint {$this} has a mapsTo relation."^^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 entity identified by the mapsTo+ relation."^^xsd:string ; + sh:message "s223: {$this} declares a Medium of {?a}, but the Medium of {?b} is declared by {?target} pointed to by the mapsTo+ relation."^^xsd:string ; sh:prefixes ; sh:select """ -SELECT $this ?equipment ?otherEquipment +SELECT DISTINCT $this ?a ?b ?target WHERE { -$this s223:mapsTo ?otherCP . -?equipment s223:hasConnectionPoint $this . -?otherEquipment s223:hasConnectionPoint ?otherCP . -FILTER NOT EXISTS {?otherEquipment s223:contains ?equipment} +$this s223:hasMedium ?a . +$this s223:mapsTo+ ?target . +?target s223:hasMedium ?b . +?a a/rdfs:subClassOf* s223:EnumerationKind-Medium . +?b a/rdfs:subClassOf* s223:EnumerationKind-Medium . +FILTER (?a != ?b ) . +FILTER (NOT EXISTS {?b a/rdfs:subClassOf* ?a}) . +FILTER (NOT EXISTS {?a a/rdfs:subClassOf* ?b}) . } """^^xsd:string ] ], - [ rdfs:comment "A ConnectionPoint must be associated with exactly one Connectable using the relation isConnectionPointOf."^^xsd:string ; - sh:class s223:Connectable ; + [ rdfs:comment "A ConnectionPoint can be associated with at most one other ConnectionPoint using the relation mapsTo"^^xsd:string ; + sh:class s223:ConnectionPoint ; 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 ], + 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 "A ConnectionPoint must be associated with exactly one Substance-Medium using the relation hasMedium."^^xsd:string ; sh:class s223:Substance-Medium ; sh:maxCount 1 ; @@ -84489,39 +84490,38 @@ FILTER NOT EXISTS {?otherEquipment s223:contains ?equipment} 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 ; + [ 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, 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, or use of hasOptionalConnectionPoint or hasBoundaryConnectionPoint qualifiers."^^xsd:string ; + 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 + SELECT $this ?containerEquipment WHERE { - FILTER NOT EXISTS {?sys1 s223:hasBoundaryConnectionPoint $this} . - FILTER NOT EXISTS {?sys2 s223:hasOptionalConnectionPoint $this} . FILTER NOT EXISTS {$this s223:connectsThrough ?anything1} . FILTER NOT EXISTS {$this s223:mapsTo ?anything2} . + FILTER NOT EXISTS {?anything3 s223:hasBoundaryConnectionPoint $this} . $this s223:isConnectionPointOf ?equipment . - FILTER NOT EXISTS {?containerEquipment s223:contains ?equipment} . + ?containerEquipment 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 ; + [ 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:message "s223: If the relation hasRole is present it must associate the ConnectionPoint with an EnumerationKind-Role."^^xsd:string ; + sh:path s223:hasRole ], + [ 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:Connection ] ; + sh:qualifiedValueShape [ sh:class s223:Connectable ] ; sh:qualifiedValueShapesDisjoint true ], - [ rdfs:comment "A ConnectionPoint can be associated with at most one other ConnectionPoint using the relation mapsTo"^^xsd:string ; + [ 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 relation mapsTo"^^xsd:string ; - sh:path s223:mapsTo ], - [ 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:message "s223: If the relation hasRole is present it must associate the ConnectionPoint with an EnumerationKind-Role."^^xsd:string ; - sh:path s223:hasRole ] . + 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 ] ] . a ns1:QuantityKindDimensionVector_ISO, ns1:QuantityKindDimensionVector_Imperial, @@ -86949,42 +86949,28 @@ $this s223:hasExternalReference ?ext . $this s223:hasValue ?val . } """^^xsd:string ] ], - [ rdfs:comment "A Property must not have both a hasInternalReference and a hasExternalReference relation."^^xsd:string ; + [ 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 "A Property must not have both a hasInternalReference and a hasValue relation."^^xsd:string ; sh:path s223:hasInternalReference ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "A Property must not have both a hasInternalReference and a hasExternalReference relation."^^xsd:string ; - sh:message "s223: {$this} cannot have both a hasInternalReference and a hasExternalReference relation."^^xsd:string ; + rdfs:comment "A Property must not have both a hasInternalReference and a hasValue relation."^^xsd:string ; + sh:message "s223: {$this} cannot have both a hasInternalReference and a hasValue relation."^^xsd:string ; sh:prefixes ; sh:select """ SELECT $this WHERE { $this s223:hasInternalReference ?int . -$this s223:hasExternalReference ?ext . +$this s223:hasValue ?val . } """^^xsd:string ] ], - [ 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 hasAspect is present, it must associate the Property with an EnumerationKind."^^xsd:string ; - sh:class s223:EnumerationKind ; - sh:message "s223: If the relation hasAspect is present, it must associate the Property with an EnumerationKind."^^xsd:string ; - sh:path s223:hasAspect ], [ 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 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 "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 ""^^xsd:string ; sh:path s223:ofConstituent ; sh:sparql [ a sh:SPARQLConstraint ; @@ -86998,31 +86984,45 @@ WHERE { FILTER NOT EXISTS {$this s223:ofConstituent ?someSubstance} . } """^^xsd:string ] ], + [ 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:message "s223: If the relation hasExternalReference is present it must associate the Property with an ExternalReference."^^xsd:string ; sh:path s223:hasExternalReference ], - [ rdfs:comment "If the relation hasInternalReference is present it must associate the Property with another Property."^^xsd:string ; - sh:class s223:Property ; - sh:message "s223: If the relation hasInternalReference is present it must associate the Property with another Property."^^xsd:string ; - sh:path s223:hasInternalReference ], - [ rdfs:comment "A Property must not have both a hasInternalReference and a hasValue relation."^^xsd:string ; + [ 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 "A Property must not have both a hasInternalReference and a hasExternalReference relation."^^xsd:string ; sh:path s223:hasInternalReference ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "A Property must not have both a hasInternalReference and a hasValue relation."^^xsd:string ; - sh:message "s223: {$this} cannot have both a hasInternalReference and a hasValue relation."^^xsd:string ; + rdfs:comment "A Property must not have both a hasInternalReference and a hasExternalReference relation."^^xsd:string ; + sh:message "s223: {$this} cannot have both a hasInternalReference and a hasExternalReference relation."^^xsd:string ; sh:prefixes ; sh:select """ SELECT $this WHERE { $this s223:hasInternalReference ?int . -$this s223:hasValue ?val . +$this s223:hasExternalReference ?ext . } """^^xsd:string ] ], + [ rdfs:comment "If the relation hasInternalReference is present it must associate the Property with another Property."^^xsd:string ; + sh:class s223:Property ; + sh:message "s223: If the relation hasInternalReference is present it must associate the Property with another Property."^^xsd:string ; + sh:path s223:hasInternalReference ], [ 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 ] ] ; + 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:message "s223: If the relation hasAspect is present, it must associate the Property with an EnumerationKind."^^xsd:string ; + sh:path s223:hasAspect ] ; 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 ; @@ -87040,12 +87040,25 @@ 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 "This QuantifiableProperty uses a different Unit than the Setpoint associated with it."^^xsd:string ; + sh:property [ 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:severity sh:Info ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "This QuantifiableProperty uses a different Unit than the Setpoint associated with it."^^xsd:string ; - sh:message "s223: {$this} uses Unit {?punit}, while Setpoint {?setpoint} uses Unit {?sunit}. Be careful."^^xsd:string ; + rdfs:comment "This QuantifiableProperty and the associated Setpoint use non-commensurate Units."^^xsd:string ; + sh:message "s223: {$this} uses Unit {?punit}, while Setpoint {?setpoint} uses Unit {?sunit}. These are non-commensurate."^^xsd:string ; sh:prefixes ; sh:select """ SELECT $this ?setpoint ?punit ?sunit @@ -87056,86 +87069,32 @@ $this s223:hasSetpoint ?setpoint . ?punit qudt:hasDimensionVector ?pdv . ?sunit qudt:hasDimensionVector ?sdv . FILTER (?punit != ?sunit) . -FILTER (?pdv = ?sdv) . -} -"""^^xsd:string ] ], - [ 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 ; - rdfs:comment "This QuantifiableProperty and the Setpoint associated with it have non-commensurate QuantityKinds."^^xsd:string ; - sh:message "s223: {$this} uses QuantityKind {?pqk} with DimensionVector {?pdv}, while Setpoint {?setpoint} uses QuantityKind {?sqk} with DimensionVector {?sdv}. These are non-commensurate"^^xsd:string ; - sh:prefixes ; - sh:select """ -SELECT $this ?setpoint ?pqk ?sqk ?pdv ?sdv -WHERE { -$this qudt:hasQuantityKind ?pqk . -$this s223:hasSetpoint ?setpoint . -?setpoint qudt:hasQuantityKind ?sqk . -?pqk qudt:hasDimensionVector ?pdv . -?sqk qudt:hasDimensionVector ?sdv . -FILTER (?pqk != ?sqk) . FILTER (?pdv != ?sdv) . } """^^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 """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:message """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:path ns1:isDeltaQuantity ], - [ rdfs:comment "This QuantifiableProperty with Aspect-Setpoint is not referenced by any Property using hasSetpoint."^^xsd:string ; - sh:path ns1:hasSetpoint ; - sh:severity sh:Info ; + [ rdfs:comment "This QuantifiableProperty uses hasSetpoint to reference a Property that lacks an Aspect of Aspect-Setpoint."^^xsd:string ; + sh:path ns1:hasAspect ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "This QuantifiableProperty with Aspect-Setpoint is not referenced by any Property using hasSetpoint."^^xsd:string ; - sh:message "s223: {$this} has Aspect-Setpoint but is not referenced by any Property using hasSetpoint."^^xsd:string ; + rdfs:comment "This QuantifiableProperty uses hasSetpoint to reference a Property that lacks an Aspect of Aspect-Setpoint."^^xsd:string ; + sh:message "s223: {$this} uses hasSetpoint to reference {?setpoint} that lacks an Aspect of Aspect-Setpoint."^^xsd:string ; sh:prefixes ; sh:select """ -SELECT $this +SELECT $this ?setpoint WHERE { -$this s223:hasAspect s223:Aspect-Setpoint . -FILTER NOT EXISTS {?anything s223:hasSetpoint $this} . +$this s223:hasSetpoint ?setpoint . +FILTER NOT EXISTS {?setpoint s223:hasAspect s223:Aspect-Setpoint} . } """^^xsd:string ] ], [ rdfs:comment "A QuantifiableProperty should use s223:hasValue instead of qudt:value."^^xsd:string ; sh:maxCount 0 ; sh:message "s223: 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 can be associated with at most one Unit using the relation hasUnit."^^xsd:string ; - sh:class ns1:Unit ; - 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 "This QuantifiableProperty and the associated Setpoint use non-commensurate Units."^^xsd:string ; + [ rdfs:comment "This QuantifiableProperty uses a different Unit than the Setpoint associated with it."^^xsd:string ; sh:path ns1:hasUnit ; + sh:severity sh:Info ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "This QuantifiableProperty and the associated Setpoint use non-commensurate Units."^^xsd:string ; - sh:message "s223: {$this} uses Unit {?punit}, while Setpoint {?setpoint} uses Unit {?sunit}. These are non-commensurate."^^xsd:string ; + rdfs:comment "This QuantifiableProperty uses a different Unit than the Setpoint associated with it."^^xsd:string ; + sh:message "s223: {$this} uses Unit {?punit}, while Setpoint {?setpoint} uses Unit {?sunit}. Be careful."^^xsd:string ; sh:prefixes ; sh:select """ SELECT $this ?setpoint ?punit ?sunit @@ -87146,9 +87105,14 @@ $this s223:hasSetpoint ?setpoint . ?punit qudt:hasDimensionVector ?pdv . ?sunit qudt:hasDimensionVector ?sdv . FILTER (?punit != ?sunit) . -FILTER (?pdv != ?sdv) . +FILTER (?pdv = ?sdv) . } """^^xsd:string ] ], + [ rdfs:comment "A QuantifiableProperty can be associated with at most one Unit using the relation hasUnit."^^xsd:string ; + sh:class ns1:Unit ; + 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 """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 ; @@ -87157,17 +87121,22 @@ qudt:quantityValue. This allows the qudt:QuantityValue to express multiple equiv 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:path ns1:quantityValue ], - [ rdfs:comment "This QuantifiableProperty uses hasSetpoint to reference a Property that lacks an Aspect of Aspect-Setpoint."^^xsd:string ; - sh:path ns1:hasAspect ; + [ 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 ; - rdfs:comment "This QuantifiableProperty uses hasSetpoint to reference a Property that lacks an Aspect of Aspect-Setpoint."^^xsd:string ; - sh:message "s223: {$this} uses hasSetpoint to reference {?setpoint} that lacks an Aspect of Aspect-Setpoint."^^xsd:string ; + rdfs:comment "This QuantifiableProperty and the Setpoint associated with it have non-commensurate QuantityKinds."^^xsd:string ; + sh:message "s223: {$this} uses QuantityKind {?pqk} with DimensionVector {?pdv}, while Setpoint {?setpoint} uses QuantityKind {?sqk} with DimensionVector {?sdv}. These are non-commensurate"^^xsd:string ; sh:prefixes ; sh:select """ -SELECT $this ?setpoint +SELECT $this ?setpoint ?pqk ?sqk ?pdv ?sdv WHERE { +$this qudt:hasQuantityKind ?pqk . $this s223:hasSetpoint ?setpoint . -FILTER NOT EXISTS {?setpoint s223:hasAspect s223:Aspect-Setpoint} . +?setpoint qudt:hasQuantityKind ?sqk . +?pqk qudt:hasDimensionVector ?pdv . +?sqk qudt:hasDimensionVector ?sdv . +FILTER (?pqk != ?sqk) . +FILTER (?pdv != ?sdv) . } """^^xsd:string ] ], [ rdfs:comment "This QuantifiableProperty cannot have a value without a Unit."^^xsd:string ; @@ -87187,7 +87156,38 @@ FILTER NOT EXISTS {$this qudt:hasUnit ?u} . [ rdfs:comment "A QuantifiableProperty should use s223:hasValue instead of qudt:value."^^xsd:string ; sh:maxCount 0 ; sh:message "s223: A QuantifiableProperty should use s223:hasValue instead of qudt:value."^^xsd:string ; - sh:path ns1:value ] ; + 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:message """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: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 with Aspect-Setpoint is not referenced by any Property using hasSetpoint."^^xsd:string ; + sh:path ns1:hasSetpoint ; + sh:severity sh:Info ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "This QuantifiableProperty with Aspect-Setpoint is not referenced by any Property using hasSetpoint."^^xsd:string ; + sh:message "s223: {$this} has Aspect-Setpoint but is not referenced by any Property using hasSetpoint."^^xsd:string ; + sh:prefixes ; + sh:select """ +SELECT $this +WHERE { +$this s223:hasAspect s223:Aspect-Setpoint . +FILTER NOT EXISTS {?anything s223:hasSetpoint $this} . +} +"""^^xsd:string ] ] ; sh:rule [ a sh:SPARQLRule ; rdfs:comment "Infer the hasQuantityKind relation if it is unambiguous."^^xsd:string ; sh:construct """ @@ -92339,7 +92339,11 @@ s223:InletConnectionPoint a s223:Class, rdfs:label "Inlet Connection Point"^^xsd:string ; rdfs:comment "An InletConnectionPoint is a ConnectionPoint for which a Medium is expected to flow into the associated Connectable."^^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 pairedConnectionPoint is present it must associate the InletConnectionPoint with an OutletConnectionPoint."^^xsd:string ; + sh:class s223:OutletConnectionPoint ; + sh:message "s223: If the relation pairedConnectionPoint is present it must associate the InletConnectionPoint with an OutletConnectionPoint."^^xsd:string ; + sh:path s223:pairedConnectionPoint ], + [ 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 ; @@ -92358,11 +92362,7 @@ FILTER NOT EXISTS {$this s223:mapsTo ?anything} . [ rdfs:comment "If the relation mapsTo is present it must associate the InletConnectionPoint with an InletConnectionPoint."^^xsd:string ; sh:class s223:InletConnectionPoint ; sh:message "s223: If the relation mapsTo is present it must associate the InletConnectionPoint with an InletConnectionPoint."^^xsd:string ; - sh:path s223:mapsTo ], - [ rdfs:comment "If the relation pairedConnectionPoint is present it must associate the InletConnectionPoint with an OutletConnectionPoint."^^xsd:string ; - sh:class s223:OutletConnectionPoint ; - sh:message "s223: If the relation pairedConnectionPoint is present it must associate the InletConnectionPoint with an OutletConnectionPoint."^^xsd:string ; - sh:path s223:pairedConnectionPoint ] . + sh:path s223:mapsTo ] . a ns1:Unit ; rdfs:label "Unified Atomic Mass Unit"@en ; @@ -92390,12 +92390,12 @@ s223:Numerical-Voltage a s223:Class, ns1:hasUnit ; rdfs:comment "This class has enumerated instances of common voltages."^^xsd:string ; rdfs:subClassOf s223:EnumerationKind-Numerical ; - sh:property [ rdfs:comment "A Numerical-Voltage must have a unit of Volts"^^xsd:string ; - sh:hasValue ; - sh:path ns1:hasUnit ], - [ rdfs:comment "A Numerical-Voltage must have a Quantity Kind of Voltage"^^xsd:string ; + sh:property [ rdfs:comment "A Numerical-Voltage must have a Quantity Kind of Voltage"^^xsd:string ; sh:hasValue ; - sh:path ns1:hasQuantityKind ] . + sh:path ns1:hasQuantityKind ], + [ rdfs:comment "A Numerical-Voltage must have a unit of Volts"^^xsd:string ; + sh:hasValue ; + sh:path ns1:hasUnit ] . s223:Equipment a s223:Class, sh:NodeShape ; @@ -92417,44 +92417,20 @@ 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 "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 ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Warning about a subClass of Equipment of type A containing something that is in the same subClass branch."^^xsd:string ; - sh:message "s223: {$this}, of type {?type1}, contains {?subEquip} of type {?type2}, that could result in double-counting items in the class hierarchy of {?type1}."^^xsd:string ; - sh:prefixes ; - sh:select """ -SELECT $this ?subEquip ?type1 ?type2 -WHERE { - FILTER NOT EXISTS {$this a s223:Equipment} . -$this s223:contains+ ?subEquip . - FILTER NOT EXISTS {?subEquip a s223:Equipment} . -$this a ?type1 . -?subEquip a ?type2 . -{ -?type2 rdfs:subClassOf* ?type1 . -} -UNION -{ -?type1 rdfs:subClassOf* ?type2 . -} -} -"""^^xsd:string ] ], - [ rdfs:comment "If the relation hasPhysicalLocation is present it must associate the Equipment with a PhysicalSpace."^^xsd:string ; - sh:class s223:PhysicalSpace ; - sh:message "s223: If the relation hasPhysicalLocation is present it must associate the Equipment with a PhysicalSpace."^^xsd:string ; - sh:path s223:hasPhysicalLocation ], + sh:property [ a sh:PropertyShape ; + rdfs:comment "If the relation contains is present it must associate the Equipment with either Equipment or Junction."^^xsd:string ; + sh:message "s223: 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 hasRole is present it must associate the Equipment with a EnumerationKind-Role."^^xsd:string ; sh:class s223:EnumerationKind-Role ; sh:message "s223: If the relation hasRole is present it must associate the Equipment with a EnumerationKind-Role."^^xsd:string ; sh:path s223:hasRole ], - [ 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:message """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: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:message "s223: If the relation executes is present it must associate the Equipment with a Function."^^xsd:string ; + sh:path s223:executes ], [ rdfs:comment "Disallow contained equipment from having external incoming connections."^^xsd:string ; sh:path s223:connectedFrom ; sh:sparql [ a sh:SPARQLConstraint ; @@ -92470,16 +92446,6 @@ $this ^s223:contains ?container . FILTER NOT EXISTS {?container s223:contains ?otherDev .} } """^^xsd:string ] ], - [ rdfs:comment "If the relation executes is present it must associate the Equipment with a Function."^^xsd:string ; - sh:class s223:Function ; - sh:message "s223: If the relation executes is present it must associate the Equipment with a Function."^^xsd:string ; - sh:path s223:executes ], - [ a sh:PropertyShape ; - rdfs:comment "If the relation contains is present it must associate the Equipment with either Equipment or Junction."^^xsd:string ; - sh:message "s223: 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 "Disallow contained equipment from having external outgoing connections."^^xsd:string ; sh:path s223:connectedTo ; sh:sparql [ a sh:SPARQLConstraint ; @@ -92494,7 +92460,41 @@ $this ^s223:contains ?container . ?container a/rdfs:subClassOf* s223:Equipment . FILTER NOT EXISTS {?container s223:contains ?otherDev .} } -"""^^xsd:string ] ] ; +"""^^xsd:string ] ], + [ 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 ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Warning about a subClass of Equipment of type A containing something that is in the same subClass branch."^^xsd:string ; + sh:message "s223: {$this}, of type {?type1}, contains {?subEquip} of type {?type2}, that could result in double-counting items in the class hierarchy of {?type1}."^^xsd:string ; + sh:prefixes ; + sh:select """ +SELECT $this ?subEquip ?type1 ?type2 +WHERE { + FILTER NOT EXISTS {$this a s223:Equipment} . +$this s223:contains+ ?subEquip . + FILTER NOT EXISTS {?subEquip a s223:Equipment} . +$this a ?type1 . +?subEquip a ?type2 . +{ +?type2 rdfs:subClassOf* ?type1 . +} +UNION +{ +?type1 rdfs:subClassOf* ?type2 . +} +} +"""^^xsd:string ] ], + [ rdfs:comment "If the relation hasPhysicalLocation is present it must associate the Equipment with a PhysicalSpace."^^xsd:string ; + sh:class s223:PhysicalSpace ; + sh:message "s223: If the relation hasPhysicalLocation is present it must associate the Equipment with a PhysicalSpace."^^xsd:string ; + sh:path s223:hasPhysicalLocation ], + [ 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:message """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:path s223:actuatedByProperty ] ; sh:rule [ 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 ; sh:construct """ @@ -94068,22 +94068,35 @@ s223:Frequency-60Hz a s223:Class, sh: ; owl:versionInfo "Created with TopBraid Composer", "Created with TopBraid Composer"^^xsd:string ; - sh:declare [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; + sh:declare [ 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/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ; + sh:prefix "rdf"^^xsd:string ], + [ a sh:PrefixDeclaration ; + sh:namespace "http://qudt.org/vocab/dimensionvector/"^^xsd:anyURI ; + sh:prefix "qkdv"^^xsd:string ], + [ 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 ], - [ 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://www.w3.org/2002/07/owl#"^^xsd:anyURI ; - sh:prefix "owl"^^xsd:string ], + sh:namespace "http://purl.org/dc/terms/"^^xsd:anyURI ; + sh:prefix "dcterms"^^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/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ; + sh:prefix "rdf"^^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://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:prefix "rdf"^^xsd:string ], + [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; + sh:prefix "s223"^^xsd:string ], + [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; + sh:prefix "qudtqk"^^xsd:string ], [ a sh:PrefixDeclaration ; sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; sh:prefix "quantitykind"^^xsd:string ], @@ -94093,85 +94106,72 @@ s223:Frequency-60Hz a s223:Class, [ 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://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; + sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; sh:prefix "rdfs"^^xsd:string ], - [ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ; - sh:prefix "rdf"^^xsd:string ], - [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; - sh:prefix "qudtqk"^^xsd:string ], - [ a sh:PrefixDeclaration ; - sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ; - sh:prefix "unit"^^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/2004/02/skos/core#"^^xsd:anyURI ; sh:prefix "skos"^^xsd:string ], - [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; - sh:prefix "s223"^^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 ], + [ sh:namespace "http://www.w3.org/ns/shacl#"^^xsd:anyURI ; + sh:prefix "sh"^^xsd:string ], [ a sh:PrefixDeclaration ; - sh:namespace "http://purl.org/dc/terms/"^^xsd:anyURI ; - sh:prefix "dcterms"^^xsd:string ], + sh:namespace "http://qudt.org/vocab/dimensionvector/"^^xsd:anyURI ; + sh:prefix "qkdv"^^xsd:string ], + [ sh:namespace "http://data.ashrae.org/standard223/1.0/vocab/role#"^^xsd:anyURI ; + sh:prefix "role"^^xsd:string ], [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; sh:prefix "quantitykind"^^xsd:string ], [ a sh:PrefixDeclaration ; - sh:namespace "http://qudt.org/vocab/dimensionvector/"^^xsd:anyURI ; - sh:prefix "qkdv"^^xsd:string ], + sh:namespace "http://www.w3.org/2004/02/skos/core#"^^xsd:anyURI ; + sh:prefix "skos"^^xsd:string ], + [ sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ; + sh:prefix "unit"^^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/2001/XMLSchema#"^^xsd:anyURI ; + sh:prefix "xsd"^^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://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 ], [ a sh:PrefixDeclaration ; sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; sh:prefix "qudt"^^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 ], + sh:namespace "http://purl.org/dc/terms/"^^xsd:anyURI ; + sh:prefix "dcterms"^^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://qudt.org/vocab/unit/"^^xsd:anyURI ; + sh:prefix "unit"^^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 ], - [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; - sh:prefix "rdfs"^^xsd:string ], - [ sh:namespace "http://www.w3.org/ns/shacl#"^^xsd:anyURI ; - sh:prefix "sh"^^xsd:string ], [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; sh:prefix "s223"^^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://qudt.org/vocab/unit/"^^xsd:anyURI ; sh:prefix "unit"^^xsd:string ], + [ sh:namespace "http://www.w3.org/ns/shacl#"^^xsd:anyURI ; + sh:prefix "sh"^^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/2004/02/skos/core#"^^xsd:anyURI ; - sh:prefix "skos"^^xsd:string ], + 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 ], [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; sh:prefix "qudt"^^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/quantitykind/"^^xsd:anyURI ; + sh:prefix "quantitykind"^^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/dimensionvector/"^^xsd:anyURI ; - sh:prefix "qkdv"^^xsd:string ], - [ sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ; - sh:prefix "unit"^^xsd:string ], - [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; - sh:prefix "s223"^^xsd:string ] . + sh:namespace "http://www.w3.org/2002/07/owl#"^^xsd:anyURI ; + sh:prefix "owl"^^xsd:string ] . a ns1:SystemOfUnits ; rdfs:label "CGS System of Units ESU"@en ; @@ -94225,14 +94225,14 @@ s223:Electricity-AC a s223:Class, s223:hasVoltage s223:Numerical-Voltage ; rdfs:comment "This class has enumerated instances of all AC forms of electricity."^^xsd:string ; rdfs:subClassOf s223:Constituent-Electricity ; - sh:property [ 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:property [ 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 ], + [ 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 frequency"^^xsd:string ; sh:class s223:Numerical-Frequency ; sh:minCount 1 ; @@ -95261,30 +95261,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 label"^^xsd:string ; - sh:path rdfs:label ; + sh:property [ 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 ] ], - [ rdfs:comment "This Property must have a comment"^^xsd:string ; - sh:path rdfs:comment ; + [ 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 ] ] .