diff --git a/ontologies/223enumerations.ttl b/ontologies/223enumerations.ttl new file mode 100644 index 0000000..7e0da7c --- /dev/null +++ b/ontologies/223enumerations.ttl @@ -0,0 +1,700 @@ +@prefix doc: . +@prefix rdf: . +@prefix rdfs: . +@prefix s223: . + +s223:Aspect-DayOfWeek doc:subclauses ( s223:DayOfWeek-Weekday s223:DayOfWeek-Weekend ) . + +s223:Aspect-Effectiveness rdfs:comment """ +: Effectiveness Enumerations + +| Enumeration | +|:-----------| +| Effectiveness-Active | +""" . + +s223:Aspect-ElectricalPhaseIdentifier rdfs:comment """ +: Electrical Phase Identifier Enumerations + +| Enumeration | +|:-----------| +| ElectricalPhaseIdentifier-A | +| ElectricalPhaseIdentifier-AB | +| ElectricalPhaseIdentifier-ABC | +| ElectricalPhaseIdentifier-B | +| ElectricalPhaseIdentifier-BC | +| ElectricalPhaseIdentifier-C | +| ElectricalPhaseIdentifier-CA | +""" ; + doc:subclauses ( + s223:hasElectricalPhase + ) . + +s223:Aspect-ElectricalVoltagePhases rdfs:comment """ +: Electrical Voltage Phases Enumerations + +| Enumeration | +|:-----------| +| ElectricalVoltagePhases-ABLineLineVoltage | +| ElectricalVoltagePhases-ANLineNeutralVoltage | +| ElectricalVoltagePhases-BCLineLineVoltage | +| ElectricalVoltagePhases-BNLineNeutralVoltage | +| ElectricalVoltagePhases-CALineLineVoltage | +| ElectricalVoltagePhases-CNLineNeutralVoltage | +""" . + +s223:DC-12V rdfs:comment """ +: DC-12V Enumerations + +| Enumeration | +|:-----------| +| 12V-12V-Neg | +| 12V-12V-Pos | +| 12V-6V-Neg-6V-Pos | +""" . + +s223:DC-24V rdfs:comment """ +: DC-24V Enumerations + +| Enumeration | +|:-----------| +| 24V-12V-Neg-12V-Pos | +| 24V-24V-Neg | +| 24V-24V-Pos | +""" . + +s223:DC-380V rdfs:comment """ +: DC-380V Enumerations + +| Enumeration | +|:-----------| +| 380V-190V-Neg-190V-Pos | +| 380V-380V-Neg | +| 380V-380V-Pos | +""" . + +s223:DC-48V rdfs:comment """ +: DC-48V Enumerations + +| Enumeration | +|:-----------| +| 48V-24V-Neg-24V-Pos | +| 48V-48V-Neg | +| 48V-48V-Pos | +""" . + +s223:DC-5V rdfs:comment """ +: DC-5V Enumerations + +| Enumeration | +|:-----------| +| 5V-2.5V-Neg-2.5V-Pos | +| 5V-5V-Neg | +| 5V-5V-Pos | +""" . + +s223:DC-6V rdfs:comment """ +: DC-6V Enumerations + +| Enumeration | +|:-----------| +| 6V-3V-Neg-3V-Pos | +| 6V-6V-Neg | +| 6V-6V-Pos | +""" . + +s223:DayOfWeek-Weekday rdfs:comment """ +: Weekday Enumerations + +| Enumeration | +|:-----------| +| Weekday-Friday | +| Weekday-Monday | +| Weekday-Thursday | +| Weekday-Tuesday | +| Weekday-Wednesday | +""" . + +s223:DayOfWeek-Weekend rdfs:comment """ +: Weekend Enumerations + +| Enumeration | +|:-----------| +| Weekend-Saturday | +| Weekend-Sunday | +""" . + +s223:EM-Light rdfs:comment """ +: Light Enumerations + +| Enumeration | +|:-----------| +| Light-Infrared | +| Light-Ultraviolet | +| Light-Visible | +""" . + +s223:Electricity-AC rdfs:comment """ +: AC Enumerations + +| Enumeration | +|:-----------| +| AC-10000VLL-1Ph-60Hz | +| AC-10000VLL-3Ph-60Hz | +| AC-10000VLL-5770VLN-1Ph-60Hz | +| AC-10000VLL-5770VLN-3Ph-60Hz | +| AC-110VLN-1Ph-50Hz | +| AC-120VLN-1Ph-60Hz | +| AC-127VLN-1Ph-50Hz | +| AC-139VLN-1Ph-50Hz | +| AC-1730VLN-1Ph-60Hz | +| AC-1900VLN-1Ph-60Hz | +| AC-190VLL-110VLN-1Ph-50Hz | +| AC-190VLL-110VLN-3Ph-50Hz | +| AC-190VLL-1Ph-50Hz | +| AC-190VLL-3Ph-50Hz | +| AC-208VLL-120VLN-1Ph-60Hz | +| AC-208VLL-120VLN-3Ph-60Hz | +| AC-208VLL-1Ph-60Hz | +| AC-208VLL-3Ph-60Hz | +| AC-219VLN-1Ph-60Hz | +| AC-220VLL-127VLN-1Ph-50Hz | +| AC-220VLL-127VLN-3Ph-50Hz | +| AC-220VLL-1Ph-50Hz | +| AC-220VLL-3Ph-50Hz | +| AC-231VLN-1Ph-50Hz | +| AC-2400VLN-1Ph-60Hz | +| AC-240VLL-120VLN-1Ph-60Hz | +| AC-240VLL-139VLN-1Ph-50Hz | +| AC-240VLL-139VLN-3Ph-50Hz | +| AC-240VLL-1Ph-50Hz | +| AC-240VLL-1Ph-60Hz | +| AC-240VLL-208VLN-120VLN-1Ph-60Hz | +| AC-240VLL-208VLN-120VLN-3Ph-60Hz | +| AC-240VLL-3Ph-50Hz | +| AC-240VLL-3Ph-60Hz | +| AC-240VLN-1Ph-50Hz | +| AC-24VLN-1Ph-50Hz | +| AC-24VLN-1Ph-60Hz | +| AC-277VLN-1Ph-60Hz | +| AC-3000VLL-1730VLN-1Ph-60Hz | +| AC-3000VLL-1730VLN-3Ph-60Hz | +| AC-3000VLL-1Ph-60Hz | +| AC-3000VLL-3Ph-60Hz | +| AC-3300VLL-1900VLN-1Ph-60Hz | +| AC-3300VLL-1900VLN-3Ph-60Hz | +| AC-3300VLL-1Ph-60Hz | +| AC-3300VLL-3Ph-60Hz | +| AC-3460VLN-1Ph-60Hz | +| AC-347VLN-1Ph-60Hz | +| AC-380VLL-1Ph-60Hz | +| AC-380VLL-219VLN-1Ph-60Hz | +| AC-380VLL-219VLN-3Ph-60Hz | +| AC-380VLL-3Ph-60Hz | +| AC-3810VLN-1Ph-60Hz | +| AC-400VLL-1Ph-50Hz | +| AC-400VLL-231VLN-1Ph-50Hz | +| AC-400VLL-231VLN-3Ph-50Hz | +| AC-400VLL-3Ph-50Hz | +| AC-415VLL-1Ph-50Hz | +| AC-415VLL-240VLN-1Ph-50Hz | +| AC-415VLL-240VLN-3Ph-50Hz | +| AC-415VLL-3Ph-50Hz | +| AC-4160VLL-1Ph-60Hz | +| AC-4160VLL-2400VLN-1Ph-60Hz | +| AC-4160VLL-2400VLN-3Ph-60Hz | +| AC-4160VLL-3Ph-60Hz | +| AC-480VLL-1Ph-60Hz | +| AC-480VLL-277VLN-1Ph-60Hz | +| AC-480VLL-277VLN-3Ph-60Hz | +| AC-480VLL-3Ph-60Hz | +| AC-5770VLN-1Ph-60Hz | +| AC-6000VLL-1Ph-60Hz | +| AC-6000VLL-3460VLN-1Ph-60Hz | +| AC-6000VLL-3460VLN-3Ph-60Hz | +| AC-6000VLL-3Ph-60Hz | +| AC-600VLL-1Ph-60Hz | +| AC-600VLL-347VLN-1Ph-60Hz | +| AC-600VLL-347VLN-3Ph-60Hz | +| AC-600VLL-3Ph-60Hz | +| AC-6600VLL-1Ph-60Hz | +| AC-6600VLL-3810VLN-1Ph-60Hz | +| AC-6600VLL-3810VLN-3Ph-60Hz | +| AC-6600VLL-3Ph-60Hz | +""" . + +s223:Electricity-DC doc:subclauses ( s223:DC-12V s223:DC-24V s223:DC-380V s223:DC-48V s223:DC-5V s223:DC-6V ) . + +s223:Electricity-Signal doc:subclauses ( s223:Signal-Modulated ) . + +s223:EnumerationKind-Aspect doc:subclauses ( s223:Aspect-DayOfWeek s223:Aspect-Effectiveness s223:Aspect-ElectricalPhaseIdentifier s223:Aspect-ElectricalVoltagePhases ) ; +rdfs:comment """ +: Aspect Enumerations + +| Enumeration | +|:-----------| +| Aspect-Alarm | +| Aspect-CatalogNumber | +| Aspect-Command | +| Aspect-DayOfWeek | +| Aspect-Deadband | +| Aspect-Delta | +| Aspect-DryBulb | +| Aspect-Effectiveness | +| Aspect-Efficiency | +| Aspect-ElectricalPhaseIdentifier | +| Aspect-ElectricalVoltagePhases | +| Aspect-Face | +| Aspect-Fault | +| Aspect-HighLimit | +| Aspect-Latent | +| Aspect-Loss | +| Aspect-LowLimit | +| Aspect-Manufacturer | +| Aspect-Maximum | +| Aspect-Minimum | +| Aspect-Model | +| Aspect-Nominal | +| Aspect-NominalFrequency | +| Aspect-PhaseAngle | +| Aspect-PowerFactor | +| Aspect-Rated | +| Aspect-Sensible | +| Aspect-SerialNumber | +| Aspect-ServiceFactor | +| Aspect-Setpoint | +| Aspect-StandardConditions | +| Aspect-Standby | +| Aspect-StartupValue | +| Aspect-Threshold | +| Aspect-Total | +| Aspect-WetBulb | +| Aspect-Year | +""" . + +s223:EnumerationKind-Binary rdfs:comment """ +: Binary Enumerations + +| Enumeration | +|:-----------| +| Binary-False | +| Binary-True | +| Binary-Unknown | +""" . + +s223:EnumerationKind-Direction rdfs:comment """ +: Direction Enumerations + +| Enumeration | +|:-----------| +| Direction-Bidirectional | +| Direction-Inlet | +| Direction-Outlet | +""" . + +s223:EnumerationKind-Domain rdfs:comment """ +: Domain Enumerations + +| Enumeration | +|:-----------| +| Domain-ConveyanceSystems | +| Domain-Electrical | +| Domain-Fire | +| Domain-HVAC | +| Domain-Lighting | +| Domain-Networking | +| Domain-Occupancy | +| Domain-PhysicalSecurity | +| Domain-Plumbing | +| Domain-Refrigeration | +""" . + +s223:EnumerationKind-HVACOperatingMode rdfs:comment """ +: HVAC Operating Mode Enumerations + +| Enumeration | +|:-----------| +| HVACOperatingMode-Auto | +| HVACOperatingMode-CoolOnly | +| HVACOperatingMode-FanOnly | +| HVACOperatingMode-HeatOnly | +| HVACOperatingMode-Off | +""" . + +s223:EnumerationKind-HVACOperatingStatus rdfs:comment """ +: HVAC Operating Status Enumerations + +| Enumeration | +|:-----------| +| HVACOperatingStatus-Cooling | +| HVACOperatingStatus-Dehumidifying | +| HVACOperatingStatus-Heating | +| HVACOperatingStatus-Off | +| HVACOperatingStatus-Ventilating | +""" . + +s223:EnumerationKind-Numerical doc:subclauses ( + s223:Numerical-DCVoltage + s223:Numerical-Frequency + s223:Numerical-LineLineVoltage + s223:Numerical-LineNeutralVoltage + s223:Numerical-NumberOfElectricalPhases + s223:Numerical-Voltage + s223:hasFrequency + s223:hasVoltage +) . + +s223:Numerical-DCVoltage doc:subclauses (s223:DCVoltage-DCNegativeVoltage s223:DCVoltage-DCPositiveVoltage); +rdfs:comment """ +: DC Voltage Enumerations + +| Enumeration | +|:-----------| +| DCVoltage-DCNegativeVoltage | +| DCVoltage-DCPositiveVoltage | +| DCVoltage-DCZeroVoltage | +""" . +s223:DCVoltage-DCNegativeVoltage +rdfs:comment """ +: DC Negative Voltage Enumerations + +| Enumeration | +|:-----------| +| DCNegativeVoltage-12.0V | +| DCNegativeVoltage-190.0V | +| DCNegativeVoltage-2.5V | +| DCNegativeVoltage-24.0V | +| DCNegativeVoltage-3.0V | +| DCNegativeVoltage-380.0V | +| DCNegativeVoltage-48.0V | +| DCNegativeVoltage-5.0V | +| DCNegativeVoltage-6.0V | +""" . + +s223:DCVoltage-DCPositiveVoltage +rdfs:comment """ +: DC Positive Voltage Enumerations + +| Enumeration | +|:-----------| +| DCPositiveVoltage-12.0V | +| DCPositiveVoltage-190.0V | +| DCPositiveVoltage-2.5V | +| DCPositiveVoltage-24.0V | +| DCPositiveVoltage-3.0V | +| DCPositiveVoltage-380.0V | +| DCPositiveVoltage-48.0V | +| DCPositiveVoltage-5.0V | +| DCPositiveVoltage-6.0V | +""" . +s223:EnumerationKind-Occupancy + doc:subclauses ( + s223:Occupancy-Motion + s223:Occupancy-Presence + ) ; +rdfs:comment """ +: Occupancy Enumerations + +| Enumeration | +|:-----------| +| Occupied | +| Unoccupied | +| Unknown | +""" . + +s223:EnumerationKind-OnOff rdfs:comment """ +: On Off Enumerations + +| Enumeration | +|:-----------| +| OnOff-Off | +| OnOff-On | +| OnOff-Unknown | +""" . + +s223:EnumerationKind-Phase + doc:subclauses( + s223:Phase-Gas + s223:Phase-Liquid + s223:Phase-Solid + s223:Phase-Vapor + s223:hasThermodynamicPhase + ) . + +s223:EnumerationKind-Position rdfs:comment """ +: Position Enumerations + +| Enumeration | +|:-----------| +| Position-Closed | +| Position-Open | +| Position-Unknown | +""" . + +s223:EnumerationKind-Role rdfs:comment """ +: Role Enumerations + +| Enumeration | +|:-----------| +| Role-Condenser | +| Role-Controller | +| Role-Cooling | +| Role-Discharge | +| Role-Economizer | +| Role-Evaporator | +| Role-Exhaust | +| Role-Expansion | +| Role-Generator | +| Role-HeatRecovery | +| Role-Heating | +| Role-Load | +| Role-Primary | +| Role-Recirculating | +| Role-Relief | +| Role-Return | +| Role-Secondary | +| Role-Supply | +""" . + +s223:EnumerationKind-RunStatus rdfs:comment """ +: Run Status Enumerations + +| Enumeration | +|:-----------| +| RunStatus-Off | +| RunStatus-On | +| RunStatus-Unknown | +""" . + +s223:EnumerationKind-Speed rdfs:comment """ +: Speed Enumerations + +| Enumeration | +|:-----------| +| Speed-High | +| Speed-Low | +| Speed-Medium | +| Speed-Off | +""" . + +s223:EnumerationKind-Substance doc:subclauses ( s223:Substance-Medium s223:Substance-Particulate ) . + +s223:Constituent-EM doc:subclauses ( s223:EM-Light ) . + +s223:Constituent-Electricity doc:subclauses ( s223:Electricity-AC s223:Electricity-DC s223:Electricity-Signal ) . + +s223:Fluid-Refrigerant rdfs:comment """ +: Refrigerant Enumerations + +| Enumeration | +|:-----------| +| Refrigerant-R-22 | +| Refrigerant-R-410A | +""" . + +s223:Fluid-Water doc:subclauses ( s223:Water-GlycolSolution ) . + +s223:Numerical-DCNegativeVoltage rdfs:comment """ +: DC Negative Voltage Enumerations + +| Enumeration | +|:-----------| +| DCNegativeVoltage-12.0V | +| DCNegativeVoltage-190.0V | +| DCNegativeVoltage-2.5V | +| DCNegativeVoltage-24.0V | +| DCNegativeVoltage-3.0V | +| DCNegativeVoltage-380.0V | +| DCNegativeVoltage-48.0V | +| DCNegativeVoltage-5.0V | +| DCNegativeVoltage-6.0V | +""" . + +s223:Numerical-DCPositiveVoltage rdfs:comment """ +: DC Positive Voltage Enumerations + +| Enumeration | +|:-----------| +| DCPositiveVoltage-12.0V | +| DCPositiveVoltage-190.0V | +| DCPositiveVoltage-2.5V | +| DCPositiveVoltage-24.0V | +| DCPositiveVoltage-3.0V | +| DCPositiveVoltage-380.0V | +| DCPositiveVoltage-48.0V | +| DCPositiveVoltage-5.0V | +| DCPositiveVoltage-6.0V | +""" . + +s223:Numerical-Frequency rdfs:comment """ +: Frequency Enumerations + +| Enumeration | +|:-----------| +| Frequency-50Hz | +| Frequency-60Hz | +""" . + +s223:Numerical-LineLineVoltage rdfs:comment """ +: Line-Line Voltage Enumerations + +| Enumeration | +|:-----------| +| LineLineVoltage-10000V | +| LineLineVoltage-190V | +| LineLineVoltage-208V | +| LineLineVoltage-220V | +| LineLineVoltage-240V | +| LineLineVoltage-3000V | +| LineLineVoltage-3300V | +| LineLineVoltage-380V | +| LineLineVoltage-400V | +| LineLineVoltage-415V | +| LineLineVoltage-4160V | +| LineLineVoltage-480V | +| LineLineVoltage-6000V | +| LineLineVoltage-600V | +| LineLineVoltage-6600V | +""" . + +s223:Numerical-LineNeutralVoltage rdfs:comment """ +: Line Neutral Voltage Enumerations + +| Enumeration | +|:-----------| +| LineNeutralVoltage-110V | +| LineNeutralVoltage-120V | +| LineNeutralVoltage-127V | +| LineNeutralVoltage-139V | +| LineNeutralVoltage-1730V | +| LineNeutralVoltage-1900V | +| LineNeutralVoltage-208V | +| LineNeutralVoltage-219V | +| LineNeutralVoltage-231V | +| LineNeutralVoltage-2400V | +| LineNeutralVoltage-240V | +| LineNeutralVoltage-24V | +| LineNeutralVoltage-277V | +| LineNeutralVoltage-3460V | +| LineNeutralVoltage-347V | +| LineNeutralVoltage-3810V | +| LineNeutralVoltage-5770V | +""" . + +s223:Numerical-NumberOfElectricalPhases rdfs:comment """ +: Number Of Electrical Phases Enumerations + +| Enumeration | +|:-----------| +| NumberOfElectricalPhases-SinglePhase | +| NumberOfElectricalPhases-ThreePhase | +""" . + +s223:Numerical-Voltage rdfs:comment """ +: Voltage Enumerations + +| Enumeration | +|:-----------| +| Voltage-0V | +| Voltage-10000V | +| Voltage-110V | +| Voltage-120V | +| Voltage-127V | +| Voltage-12V | +| Voltage-139V | +| Voltage-1730V | +| Voltage-1900V | +| Voltage-190V | +| Voltage-208V | +| Voltage-219V | +| Voltage-220V | +| Voltage-231V | +| Voltage-2400V | +| Voltage-240V | +| Voltage-24V | +| Voltage-277V | +| Voltage-2V | +| Voltage-3000V | +| Voltage-3300V | +| Voltage-3460V | +| Voltage-347V | +| Voltage-380V | +| Voltage-3810V | +| Voltage-3V | +| Voltage-400V | +| Voltage-415V | +| Voltage-4160V | +| Voltage-480V | +| Voltage-48V | +| Voltage-5770V | +| Voltage-5V | +| Voltage-6000V | +| Voltage-600V | +| Voltage-6600V | +| Voltage-6V | +""" . + +s223:Occupancy-Motion rdfs:comment """ +: Motion Enumerations + +| Enumeration | +|:-----------| +| Motion-False | +| Motion-True | +""" . + +s223:Occupancy-Presence rdfs:comment """ +: Presence Enumerations + +| Enumeration | +|:-----------| +| Presence-False | +| Presence-True | +""" . + +s223:Phase-Gas rdfs:comment """ +: Gas Enumerations + +| Enumeration | +|:-----------| +| Gas-SuperHeated | +""" . + +s223:Phase-Liquid rdfs:comment """ +: Liquid Enumerations + +| Enumeration | +|:-----------| +| Liquid-SubCooled | +""" . + +s223:Signal-Modulated rdfs:comment """ +: Modulated Enumerations + +| Enumeration | +|:-----------| +| Modulated-0-10V | +| Modulated-4-20mA | +""" . + +s223:Substance-Medium doc:subclauses ( s223:Fluid-Air s223:Constituent-EM s223:Constituent-Electricity s223:Fluid-NaturalGas s223:Fluid-Refrigerant s223:Fluid-Water ) . + +s223:Substance-Particulate rdfs:comment """ +: Particulate Enumerations + +| Enumeration | +|:-----------| +| Particulate-PM1.0 | +| Particulate-PM10.0 | +| Particulate-PM2.5 | +""" . + +s223:Water-GlycolSolution rdfs:comment """ +: Glycol Solution Enumerations + +| Enumeration | +|:-----------| +| GlycolSolution-15Percent | +| GlycolSolution-30Percent | +""" . + diff --git a/ontologies/223p.ttl b/ontologies/223p.ttl index 0434638..be2a04e 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 ; + 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 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 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:minCount 2 ; sh:path s223:hasProperty ; sh:qualifiedMinCount 2 ; sh:qualifiedValueShape [ sh:class s223:EnumeratedActuatableProperty ; - sh:node [ sh:property [ sh:hasValue s223:EnumerationKind-Position ; + sh:node [ sh:property [ sh:hasValue s223:EnumerationKind-Binary ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:hasAspect ], - [ sh:hasValue s223:EnumerationKind-Binary ; + sh:path s223:hasEnumerationKind ], + [ sh:hasValue s223:EnumerationKind-Position ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:hasEnumerationKind ] ] ] ] ] ) ; + sh:path s223:hasAspect ] ] ] ] ] ) ; sh:targetClass . a s223:Class, @@ -92,26 +92,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 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 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: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, @@ -160,14 +160,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 ; + sh:node [ sh:property [ sh:hasValue s223:EnumerationKind-Speed ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path ns1:hasQuantityKind ], - [ sh:hasValue s223:EnumerationKind-Speed ; + sh:path s223:hasAspect ], + [ sh:hasValue ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:hasAspect ] ] ] ] . + sh:path ns1:hasQuantityKind ] ] ] ] . a s223:Class, rdfs:Class, @@ -248,18 +248,7 @@ s223:SymmetricProperty a rdfs:Class, rdfs:label "Zone"^^xsd:string ; rdfs:comment "A Zone is a generic thermal zone, with the points required for Guideline 36 controls. It is a collection of s223:DomainSpace instances."^^xsd:string ; rdfs:subClassOf s223:Zone ; - sh:property [ 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 ; - sh:path s223:hasProperty ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:EnumeratedObservableProperty ; - sh:node [ sh:property [ sh:class s223:EnumerationKind-Occupancy ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:path s223:hasEnumerationKind ] ] ] ; - sh:severity sh:Info ], - [ rdfs:comment "A Zone shall have at least one window switch on-off property using the relation hasProperty."^^xsd:string ; + sh:property [ rdfs:comment "A Zone shall have at least one window switch on-off property using the relation hasProperty."^^xsd:string ; sh:message "g36: A Zone shall have at least one window switch on-off property using the relation hasProperty."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasProperty ; @@ -273,21 +262,6 @@ s223:SymmetricProperty a rdfs:Class, sh:minCount 1 ; sh:path s223:hasEnumerationKind ] ] ] ; sh:severity sh:Info ], - [ 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:maxCount 1 ; - sh:minCount 1 ; - sh:path ns1:hasQuantityKind ], - [ sh:hasValue s223:Constituent-CO2 ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:path s223:ofConstituent ] ] ] ; - 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 ; sh:minCount 1 ; @@ -304,11 +278,37 @@ s223:SymmetricProperty a rdfs:Class, sh:path s223:hasAspect ] ] ] ; sh:qualifiedValueShapesDisjoint true ; sh:severity sh:Info ], + [ 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 ; + sh:path s223:hasProperty ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:EnumeratedObservableProperty ; + sh:node [ sh:property [ sh:class s223:EnumerationKind-Occupancy ; + sh:maxCount 1 ; + 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 ] . + 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 ; + sh:minCount 1 ; + sh:path s223:hasProperty ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:QuantifiableObservableProperty ; + sh:node [ sh:property [ sh:hasValue ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path ns1:hasQuantityKind ], + [ sh:hasValue s223:Constituent-CO2 ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:ofConstituent ] ] ] ; + sh:severity sh:Info ] . a s223:Class, rdfs:Class, @@ -1191,20 +1191,20 @@ s223:AirSourceHeatPump a s223:Class, rdfs:label "Air source heat pump"^^xsd:string ; rdfs:comment "A subclass of HeatPump that can heat or cool by transferring thermal energy to and from outside air."^^xsd:string ; rdfs:subClassOf s223:HeatPump ; - sh:property [ rdfs:comment "An AirSourceHeatPump shall have at least two outlets using the medium Air."^^xsd:string ; - sh:message "s223: An AirSourceHeatPump shall have at least two outlets using the medium Air."^^xsd:string ; + sh:property [ rdfs:comment "An AirSourceHeatPump shall have at least two inlets using the medium Air."^^xsd:string ; + sh:message "s223: An AirSourceHeatPump shall have at least two inlets using the medium Air."^^xsd:string ; sh:minCount 2 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 2 ; - 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 "An AirSourceHeatPump shall have at least two inlets using the medium Air."^^xsd:string ; - sh:message "s223: An AirSourceHeatPump shall have at least two inlets using the medium Air."^^xsd:string ; + [ rdfs:comment "An AirSourceHeatPump shall have at least two outlets using the medium Air."^^xsd:string ; + sh:message "s223: An AirSourceHeatPump shall have at least two outlets using the medium Air."^^xsd:string ; sh:minCount 2 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 2 ; - 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 ] ] ] ] . @@ -1214,24 +1214,24 @@ 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-identifier is present it associates the external reference with a BACnet device having the specific device identifier."^^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:pattern "^[A-Za-z0-9-]+,[1-9][0-9]*$"^^xsd:string ], + 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-identifier is present it associates the external reference with the BACnet object having the specific object identifier."^^xsd:string ; sh:datatype xsd:string ; sh:maxCount 1 ; sh:minCount 0 ; - sh:path ], + sh:path ; + sh:pattern "^[A-Za-z0-9-]+,[1-9][0-9]*$"^^xsd:string ], [ a sh:PropertyShape ; - rdfs:comment "If the relation device-name is present it associates the external reference with a BACnet device having the specific device name."^^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:path ], [ 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,18 +1239,18 @@ s223:BACnetExternalReference a s223:Class, sh:minCount 0 ; sh:path ], [ a sh:PropertyShape ; - rdfs:comment "If the relation object-identifier is present it associates the external reference with the BACnet object having the specific object identifier."^^xsd:string ; + rdfs:comment "If the relation 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:pattern "^[A-Za-z0-9-]+,[1-9][0-9]*$"^^xsd:string ], + sh:path ], [ 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 object-name is present it associates the external reference with the BACnet object having the specific object name."^^xsd:string ; sh:datatype xsd:string ; @@ -1283,20 +1283,20 @@ s223:Boiler a s223:Class, rdfs:label "Boiler"^^xsd:string ; rdfs:comment "A closed, pressure vessel that uses fuel or electricity for heating water or other fluids to supply steam or hot water for heating, humidification, or other applications."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A Boiler shall have at least one outlet using the medium Water."^^xsd:string ; - sh:message "s223: A Boiler shall have at least one outlet using the medium Water."^^xsd:string ; + sh:property [ rdfs:comment "A Boiler shall have at least one inlet using the medium Water."^^xsd:string ; + sh:message "s223: A Boiler 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 ] ] ] ], - [ rdfs:comment "A Boiler shall have at least one inlet using the medium Water."^^xsd:string ; - sh:message "s223: A Boiler shall have at least one inlet using the medium Water."^^xsd:string ; + [ rdfs:comment "A Boiler shall have at least one outlet using the medium Water."^^xsd:string ; + sh:message "s223: A Boiler 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 ] ] ] ] . @@ -1384,14 +1384,14 @@ s223:ConnectionCnxShape a sh:NodeShape ; 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 ], [ 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:InletConnectionPoint ] ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ; 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 ; @@ -1597,12 +1597,12 @@ s223:FanCoilUnit a s223:Class, 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 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: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:contains ; + sh:path s223:hasRole ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Fan ] ], + 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:message "s223: A FanCoilUnit shall have at least one inlet using the medium Air."^^xsd:string ; sh:minCount 1 ; @@ -1611,6 +1611,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 ; + sh:minCount 1 ; + sh:path s223:contains ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Coil ] ], [ rdfs:comment "A FanCoilUnit shall have at least one 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 ; @@ -1619,18 +1625,12 @@ 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 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 ; + [ 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 ] ] . 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 "Ensure that the filter inlet and outlet have compatible mediums."^^xsd:string ; + sh:property [ 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 @@ -1665,30 +1665,20 @@ $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 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: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:OutletConnectionPoint ] ], - [ rdfs:comment "A filter should have one common constituent between the inlet and outlet"^^xsd:string ; + [ 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 @@ -1699,12 +1689,10 @@ $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 "A filter should have one common constituent between the inlet and outlet"^^xsd:string ; @@ -1736,7 +1724,19 @@ WHERE { {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} . } } -"""^^xsd:string ] ] . +"""^^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 ; + 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:minCount 1 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ] . s223:FlowSensor a s223:Class, sh:NodeShape ; @@ -1749,20 +1749,20 @@ s223:FumeHood a s223:Class, rdfs:label "Fume hood"^^xsd:string ; rdfs:comment "A fume-collection device mounted over a work space, table, or shelf and serving to conduct unwanted gases away from an area."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A FumeHood shall have at least one outlet using the medium Air."^^xsd:string ; - sh:message "s223: A FumeHood shall have at least one outlet using the medium Air."^^xsd:string ; + sh:property [ rdfs:comment "A FumeHood shall have at least one inlet using the medium Air."^^xsd:string ; + sh:message "s223: A FumeHood 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 FumeHood shall have at least one inlet using the medium Air."^^xsd:string ; - sh:message "s223: A FumeHood shall have at least one inlet using the medium Air."^^xsd:string ; + [ rdfs:comment "A FumeHood shall have at least one outlet using the medium Air."^^xsd:string ; + sh:message "s223: A FumeHood 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 ] ] ] ] . @@ -1823,16 +1823,16 @@ s223:Generator a s223:Class, rdfs:label "Generator"^^xsd:string ; rdfs:comment "An energy transducer that transforms non-electric energy into electric energy."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A Generator must be associated with at least one ConnectionPoint using the relation hasConnectionPoint."^^xsd:string ; - sh:message "s223: A Generator must be associated with at least one ConnectionPoint using the relation hasConnectionPoint."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A Generator shall have at least one outlet using the medium Electricity."^^xsd:string ; + sh:property [ rdfs:comment "A Generator shall have at least one outlet using the medium Electricity."^^xsd:string ; sh:class s223:OutletConnectionPoint ; sh:message "s223: A Generator shall have at least one outlet using the medium Electricity."^^xsd:string ; sh:minCount 1 ; sh:node [ sh:property [ sh:class s223:Constituent-Electricity ; sh:path s223:hasMedium ] ] ; + sh:path s223:hasConnectionPoint ], + [ rdfs:comment "A Generator must be associated with at least one ConnectionPoint using the relation hasConnectionPoint."^^xsd:string ; + sh:message "s223: A Generator must be associated with at least one ConnectionPoint using the relation hasConnectionPoint."^^xsd:string ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ] . s223:GroundSourceHeatPump a s223:Class, @@ -1943,13 +1943,13 @@ s223:JunctionCPShape a sh:NodeShape ; 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 ], [ 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:InletConnectionPoint ] ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ; 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 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: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: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 ] ] ] ], - [ 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 ; + [ 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 ] ] ] ] . s223:Motor a s223:Class, @@ -2029,12 +2029,12 @@ s223:OccupantCounter a s223:Class, sh:class s223:QuantifiableObservableProperty ; sh:message "s223: An OccupantCounter must always observe a QuantifiableObservableProperty that has a QuantityKind of Population and a Unit of unit:NUM."^^xsd:string ; sh:minCount 1 ; - sh:node [ sh:property [ sh:hasValue ; + sh:node [ sh:property [ sh:hasValue ; sh:maxCount 1 ; - sh:path ns1:hasUnit ], - [ sh:hasValue ; + sh:path ns1:hasQuantityKind ], + [ sh:hasValue ; sh:maxCount 1 ; - sh:path ns1:hasQuantityKind ] ] ; + sh:path ns1:hasUnit ] ] ; sh:path s223:observes ] . s223:OccupantMotionSensor 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 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: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: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 ] ] ] ] . s223:Pump a s223:Class, @@ -2142,7 +2142,20 @@ 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 "The non-electrical ConnectionPoints of a Pump must have compatible Media."^^xsd:string ; + 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: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: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 ; + sh:path s223:hasMedium ] ] ) ; + sh:severity sh:Warning ] ] ], + [ rdfs:comment "The non-electrical ConnectionPoints of a Pump must have compatible Media."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:sparql [ a sh:SPARQLConstraint ; rdfs:comment "The non-electrical ConnectionPoints of a Pump must have compatible Media."^^xsd:string ; @@ -2171,19 +2184,6 @@ WHERE { 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 ; - sh:path s223:hasMedium ] ] ) ; - sh:severity sh:Warning ] ] ], - [ 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: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 ; @@ -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 inlet."^^xsd:string ; - sh:message "s223: A TwoWayValve shall have at least one inlet."^^xsd:string ; + 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:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - 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: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:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ] . + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ] . s223:ValveCPShape a sh:NodeShape ; rdfs:label "Valve"^^xsd:string ; @@ -2556,11 +2556,7 @@ s223:VariableFrequencyDrive a s223:Class, rdfs:label "VariableFrequencyDrive"^^xsd:string ; rdfs:comment "An electronic device that varies its output frequency to vary the rotating speed of a motor, given a fixed input frequency. Used with fans or pumps to vary the flow in the system as a function of a maintained pressure."^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "If the relation connectedTo is present it must associate the VariableFrequencyDrive with a Equipment."^^xsd:string ; - sh:class s223:Equipment ; - sh: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 inlet using the medium Electricity."^^xsd:string ; + sh:property [ rdfs:comment "A VariableFrequencyDrive shall have at least one inlet using the medium Electricity."^^xsd:string ; sh:message "s223: A VariableFrequencyDrive shall have at least one inlet using the medium Electricity."^^xsd:string ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; @@ -2576,7 +2572,11 @@ 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 ] ] ] ] . + 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 ] . s223:WaterSourceHeatPump a s223:Class, sh:NodeShape ; @@ -21571,13 +21571,7 @@ s223:AirHeatExchanger a s223:Class, AirHeatExchanger class does not represent the physical characteristics of a heat exchanger design. It represents only the heat transfer functionality."""^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ 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 ; - sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ; - sh:message "s223: An AirHeatExchanger shall have no BidirectionalConnectionPoints."^^xsd:string ; - sh:qualifiedMaxCount 0 ] ], - [ rdfs:comment "An AirHeatExchanger shall have at least two air outlets, each paired with an inlet."^^xsd:string ; + sh:property [ rdfs:comment "An AirHeatExchanger shall have at least two air outlets, each paired with an inlet."^^xsd:string ; sh:message "s223: An AirHeatExchanger shall have at least two air outlets, each paired with an inlet."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 2 ; @@ -21587,6 +21581,11 @@ 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 ; @@ -21597,11 +21596,12 @@ s223:AirHeatExchanger a s223:Class, [ sh:class s223:OutletConnectionPoint ; sh:minCount 1 ; sh:path s223:pairedConnectionPoint ] ] ] ], - [ 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 ; + sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ; + sh:message "s223: An AirHeatExchanger shall have no BidirectionalConnectionPoints."^^xsd:string ; + sh:qualifiedMaxCount 0 ] ] . s223:Aspect-Alarm a s223:Aspect-Alarm, s223:Class, @@ -21874,13 +21874,13 @@ 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 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 ; + [ 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 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Fluid-Water ; + 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 ; @@ -21888,13 +21888,13 @@ s223:ChilledBeam a s223:Class, 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 ; + [ 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 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Fluid-Air ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Fluid-Water ; sh:path s223:hasMedium ] ] ] ] ; sh:rule [ a sh:TripleRule ; rdfs:comment "A Chilled Beam will always have the role Role-Cooling"^^xsd:string ; @@ -22152,16 +22152,16 @@ s223:GlycolSolution-15Percent a s223:Class, sh:NodeShape ; rdfs:label "GlycolSolution-15Percent"^^xsd:string ; s223:composedOf [ a s223:QuantifiableProperty ; - rdfs:label "Glycol conc"^^xsd:string ; - s223:hasValue 15.0 ; - s223:ofConstituent s223:Constituent-Glycol ; - ns1:hasQuantityKind ; - ns1:hasUnit ], - [ a s223:QuantifiableProperty ; rdfs:label "Water conc"^^xsd:string ; s223:hasValue 85.0 ; s223:ofConstituent s223:Constituent-H2O ; ns1:hasQuantityKind ; + ns1:hasUnit ], + [ a s223:QuantifiableProperty ; + rdfs:label "Glycol conc"^^xsd:string ; + s223:hasValue 15.0 ; + s223:ofConstituent s223:Constituent-Glycol ; + ns1:hasQuantityKind ; ns1:hasUnit ] ; s223:hasFreezingPoint [ a s223:QuantifiableProperty ; rdfs:label "Freezing point"^^xsd:string ; @@ -22273,14 +22273,30 @@ 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 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 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 ; sh:qualifiedMinCount 2 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:OutletConnectionPoint ; + 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:OutletConnectionPoint ; + [ 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 ; @@ -22289,23 +22305,7 @@ s223:HydronicHeatExchanger a s223:Class, 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 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 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 ] ] ] ] . + sh:path s223:hasMedium ] ] ] . s223:Light-Ultraviolet a s223:Class, s223:Light-Ultraviolet, @@ -22731,7 +22731,11 @@ s223:System a s223:Class, rdfs:label "System"^^xsd:string ; rdfs:comment "A System is a logical grouping (collection) of Equipment for some functional purpose. Examples of possible systems iclude an air distribution system, or a hot water system. Systems can contain other Systems. A System does not participate in Connections."^^xsd:string ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "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:property [ rdfs:comment "A System may be defined with a number of ConnectionPoints that are the \"boundary\" of the equipment. The hasOptionalConnectionPoint relation is used to reference those connection points of its equipment that may not be connected, the \"dangling ConnectionPoint\" should not generate a validation error."^^xsd:string ; + 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 hasOptionalConnectionPoint relation is used to reference those connection points of its equipment that may not be connected, the \"dangling ConnectionPoint\" should not generate a validation error."^^xsd:string ; + sh:path s223:hasOptionalConnectionPoint ], + [ rdfs:comment "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: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 ], @@ -22745,11 +22749,7 @@ s223:System a s223:Class, [ 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 ], - [ rdfs:comment "A System may be defined with a number of ConnectionPoints that are the \"boundary\" of the equipment. The hasOptionalConnectionPoint relation is used to reference those connection points of its equipment that may not be connected, the \"dangling ConnectionPoint\" should not generate a validation error."^^xsd:string ; - 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 hasOptionalConnectionPoint relation is used to reference those connection points of its equipment that may not be connected, the \"dangling ConnectionPoint\" should not generate a validation error."^^xsd:string ; - sh:path s223:hasOptionalConnectionPoint ] ; + sh:path s223:hasRole ] ; sh:rule [ a sh:TripleRule ; rdfs:comment "Infer the hasBoundaryConnectionPoint relation using hasOptionalConnectionPoint."^^xsd:string ; sh:name "InferredSystemToBoundaryConnectionPointFromOptional"^^xsd:string ; @@ -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 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:property [ 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 ] ; + 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: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 ) ] ; @@ -51879,13 +51879,20 @@ s223:PowerAndSignal-PoE a s223:Class, rdfs:label "Power over Ethernet"^^xsd:string ; s223:composedOf [ a s223:Property ; rdfs:label "Unspecified"^^xsd:string ; - s223:ofConstituent s223:Electricity-DC ], + s223:ofConstituent s223:Signal-Ethernet ], [ a s223:Property ; rdfs:label "Unspecified"^^xsd:string ; - s223:ofConstituent s223:Signal-Ethernet ] ; + 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 "There must be at least two Properties that characterize the constituents of Power over Ethernet."^^xsd:string ; + sh:property [ 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 ], @@ -51895,13 +51902,6 @@ s223:PowerAndSignal-PoE a s223:Class, sh:qualifiedValueShape [ sh:class s223:Property ; sh:node [ sh:property [ rdfs:comment "One of the constituents of PoE must be Ethernet."^^xsd:string ; sh:class s223:Signal-Ethernet ; - sh:path s223:ofConstituent ] ] ] ], - [ rdfs:comment "One of the constituents of PoE must be DC electrical power."^^xsd:string ; - sh:path s223:composedOf ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Property ; - sh:node [ sh:property [ rdfs:comment "One of the constituents of PoE must be DC electrical power."^^xsd:string ; - sh:class s223:Electricity-DC ; sh:path s223:ofConstituent ] ] ] ] . s223:RadiantHeater a s223:Class, @@ -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 "A Radiator shall have at least one bidirectional connection point using the medium Air."^^xsd:string ; + 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: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 ] ] ] ], - [ 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 ] ] . + sh:path s223:hasMedium ] ] ] ] . s223:Voltage-0V a s223:Class, s223:Voltage-0V, @@ -59794,19 +59794,19 @@ s223:ElectricResistanceElement a s223:Class, sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ; sh:node [ sh:property [ sh:class s223:Mix-Fluid ; sh:path s223:hasMedium ] ] ] ; - sh:qualifiedValueShapesDisjoint true ] ] [ sh:property [ rdfs:comment "Pattern 2: An ElectricResistanceElement shall have one outlet using the medium Fluid."^^xsd:string ; + sh:qualifiedValueShapesDisjoint true ] ] [ sh:property [ rdfs:comment "Pattern 2: An ElectricResistanceElement 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:OutletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Mix-Fluid ; sh:path s223:hasMedium ] ] ] ; sh:qualifiedValueShapesDisjoint true ], - [ rdfs:comment "Pattern 2: An ElectricResistanceElement shall have one inlet using the medium Fluid."^^xsd:string ; + [ rdfs:comment "Pattern 2: An ElectricResistanceElement 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:InletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Mix-Fluid ; sh:path s223:hasMedium ] ] ] ; sh:qualifiedValueShapesDisjoint true ] ] ) . @@ -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 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: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:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Fluid-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A HeatPump shall have at least one inlet using the medium Air."^^xsd:string ; - sh:message "s223: A HeatPump shall have at least one inlet using the medium Air."^^xsd:string ; + [ rdfs:comment "A HeatPump shall have at least one outlet using the medium Air."^^xsd:string ; + sh: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 ] ] ] ] . @@ -59849,126 +59849,7 @@ is separated into three or more separate Connections, all tied together with the Junction is a subClassOf Connectable, which gives it the ability to have connection points, but unlike Equipment (and like Connection) it is not allowed to change the Medium that passes through it. This is why Junction is a sibling class to Equipment and not a subclass."""^^xsd:string ; rdfs:subClassOf s223:Connectable ; - 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 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 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 . -FILTER (?cp1 != ?cp2 ) . -?cp2 s223:hasMedium ?m2 . -FILTER (?m1 != ?m2 ) . -FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . -FILTER NOT EXISTS {?m2 s223:composedOf ?c2} -FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) . -FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) . -} -"""^^xsd:string ] ], - [ rdfs:comment "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 ; - sh:path s223:hasMedium ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 3: Junction with a pure medium and an associated ConnectionPoint with constituents."^^xsd:string ; - sh:message "s223: Junction {$this} with Medium {?m1} is incompatible with {?cp} with Medium {?m2}."^^xsd:string ; - sh:prefixes ; - sh:select """ -SELECT $this ?m2 ?cp ?m1 -WHERE { -$this s223:cnx ?cp . -?cp a/rdfs:subClassOf* s223:ConnectionPoint . -?cp s223:hasMedium ?m2 . -$this s223:hasMedium ?m1 . -?m2 s223:composedOf/s223:ofConstituent ?s2 . -FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . -FILTER NOT EXISTS { - ?m2 s223:composedOf/s223:ofConstituent ?s12 . - {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} . -} -} -"""^^xsd:string ] ], - [ 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 all the associated ConnectionPoints via the s223:hasMedium relation are compatible with one another."^^xsd:string ; + sh:property [ 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 ; @@ -60025,6 +59906,125 @@ $this s223:hasMedium ?m2 . {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} . } } +"""^^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 . +FILTER (?cp1 != ?cp2 ) . +?cp2 s223:hasMedium ?m2 . +FILTER (?m1 != ?m2 ) . +FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . +FILTER NOT EXISTS {?m2 s223:composedOf ?c2} +FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) . +FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) . +} +"""^^xsd:string ] ], + [ rdfs:comment "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 ; + sh:path s223:hasMedium ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Inconsistent Medium. Case 3: Junction with a pure medium and an associated ConnectionPoint with constituents."^^xsd:string ; + sh:message "s223: Junction {$this} with Medium {?m1} is incompatible with {?cp} with Medium {?m2}."^^xsd:string ; + sh:prefixes ; + sh:select """ +SELECT $this ?m2 ?cp ?m1 +WHERE { +$this s223:cnx ?cp . +?cp a/rdfs:subClassOf* s223:ConnectionPoint . +?cp s223:hasMedium ?m2 . +$this s223:hasMedium ?m1 . +?m2 s223:composedOf/s223:ofConstituent ?s2 . +FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . +FILTER NOT EXISTS { + ?m2 s223:composedOf/s223:ofConstituent ?s12 . + {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} . +} +} """^^xsd:string ] ] . s223:LightSensor a s223:Class, @@ -60157,12 +60157,16 @@ s223:Water-GlycolSolution a s223:Class, ns1:hasQuantityKind ] ; rdfs:comment "This class has enumerated subclasses of water-glycol solutions in various concentrations."^^xsd:string ; rdfs:subClassOf s223:Fluid-Water ; - sh:property [ rdfs:comment "If the relation hasFreezingPoint is used, the object must be a QuantifiableProperty with a quantity kind of Temperature."^^xsd:string ; - sh:class s223:QuantifiableProperty ; - sh:message "The object must be a QuantifiableProperty with a quantity kind of Temperature."^^xsd:string ; - sh:node [ sh:property [ sh:hasValue ; - sh:path ns1:hasQuantityKind ] ] ; - sh:path s223:hasFreezingPoint ], + sh:property [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Constituent-Glycol."^^xsd:string ; + sh:path s223:composedOf ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:QuantifiableProperty ; + sh:node [ sh:property [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Constituent-Glycol."^^xsd:string ; + sh:hasValue s223:Constituent-Glycol ; + sh:path s223:ofConstituent ], + [ rdfs:comment "The quantity kind of the constituent must be VolumeFraction."^^xsd:string ; + sh:hasValue ; + sh:path ns1:hasQuantityKind ] ] ] ], [ rdfs:comment "There must be at least two QuantifiableProperties that characterize the constituents of a Water-GlycolSolution."^^xsd:string ; sh:class s223:QuantifiableProperty ; sh:minCount 2 ; @@ -60171,29 +60175,36 @@ s223:Water-GlycolSolution a s223:Class, sh:path s223:composedOf ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:QuantifiableProperty ; - sh:node [ sh:property [ rdfs:comment "The quantity kind of the constituent must be VolumeFraction."^^xsd:string ; - sh:hasValue ; - sh:path ns1:hasQuantityKind ], - [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Constituent-H2O."^^xsd:string ; + sh:node [ sh:property [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Constituent-H2O."^^xsd:string ; sh:hasValue s223:Constituent-H2O ; - sh:path s223:ofConstituent ] ] ] ], - [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Constituent-Glycol."^^xsd:string ; - sh:path s223:composedOf ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:QuantifiableProperty ; - sh:node [ sh:property [ rdfs:comment "The quantity kind of the constituent must be VolumeFraction."^^xsd:string ; + sh:path s223:ofConstituent ], + [ rdfs:comment "The quantity kind of the constituent must be VolumeFraction."^^xsd:string ; sh:hasValue ; - sh:path ns1:hasQuantityKind ], - [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Constituent-Glycol."^^xsd:string ; - sh:hasValue s223:Constituent-Glycol ; - sh:path s223:ofConstituent ] ] ] ] . + 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 ; + sh:class s223:QuantifiableProperty ; + sh:message "The object must be a QuantifiableProperty with a quantity kind of Temperature."^^xsd:string ; + sh:node [ sh:property [ sh:hasValue ; + sh:path ns1:hasQuantityKind ] ] ; + sh:path s223:hasFreezingPoint ] . s223:Zone a s223:Class, sh:NodeShape ; rdfs:label "Zone"^^xsd:string ; rdfs:comment "A Zone is a logical grouping (collection) of domain spaces for some functional or system reason, to identify a domain of control, such as a Lighting Zone, or a heating zone"^^xsd:string ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "The associated Domain of a Zone and the Domain of the DomainSpaces it contains must be the same."^^xsd:string ; + sh:property [ rdfs:comment "A Zone must be associated with exactly one EnumerationKind-Domain using the relation hasDomain."^^xsd:string ; + sh:class s223:EnumerationKind-Domain ; + sh:maxCount 1 ; + sh:message "s223: A Zone must be associated with exactly one EnumerationKind-Domain using the relation hasDomain."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:hasDomain ], + [ rdfs:comment "A Zone must be associated with at least one DomainSpace using the relation hasDomainSpace."^^xsd:string ; + sh:class s223:DomainSpace ; + sh:message "s223: A Zone must be associated with at least one DomainSpace using the relation hasDomainSpace."^^xsd:string ; + sh:minCount 1 ; + sh:path s223:hasDomainSpace ], + [ rdfs:comment "The associated Domain of a Zone and the Domain of the DomainSpaces it contains must be the same."^^xsd:string ; sh:path s223:hasDomain ; sh:sparql [ a sh:SPARQLConstraint ; rdfs:comment "The associated Domain of a Zone and the Domain of the DomainSpaces it contains must be the same."^^xsd:string ; @@ -60208,26 +60219,15 @@ $this s223:contains ?ds . ?ds s223:hasDomain ?dsdomain . FILTER (?domain != ?dsdomain) } -"""^^xsd:string ] ], - [ rdfs:comment "A Zone must be associated with at least one DomainSpace using the relation hasDomainSpace."^^xsd:string ; - sh:class s223:DomainSpace ; - sh:message "s223: A Zone must be associated with at least one DomainSpace using the relation hasDomainSpace."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasDomainSpace ], - [ rdfs:comment "A Zone must be associated with exactly one EnumerationKind-Domain using the relation hasDomain."^^xsd:string ; - sh:class s223:EnumerationKind-Domain ; - sh:maxCount 1 ; - sh:message "s223: A Zone must be associated with exactly one EnumerationKind-Domain using the relation hasDomain."^^xsd:string ; - sh:minCount 1 ; - sh:path s223:hasDomain ] ; +"""^^xsd:string ] ] ; sh:rule [ a sh:TripleRule ; - rdfs:comment "Infer a hasDomain relation by checking any 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 ], [ 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 ] . @@ -67991,21 +67991,7 @@ s223:Coil a s223:Class, """^^xsd:string ; rdfs:subClassOf s223:Equipment ; sh:message "s223: A Coil shall fit one of the following patterns of ConnectionPoints: 1: Two inlets and two outlets using the medium Mix-Fluid. 2: One inlet and one outlet using the medium Mix-Fluid, and one or two bidirectionals using the medium Mix-Fluid or Medium-ThermalContact. 3: Three bidirectionals using the medium Mix-Fluid or Medium-ThermalContact."^^xsd:string ; - sh:xone ( [ sh:property [ 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 ] ] ] ], - [ rdfs:comment "Pattern 1: A Coil shall have two inlets using the medium Fluid."^^xsd:string ; + sh:xone ( [ sh:property [ rdfs:comment "Pattern 1: A Coil shall have two inlets using the medium Fluid."^^xsd:string ; sh:path s223:hasConnectionPoint ; sh:qualifiedMaxCount 2 ; sh:qualifiedMinCount 2 ; @@ -68018,15 +68004,21 @@ s223:Coil a s223:Class, 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 or two bidirectionals using the medium Fluid or ThermalContact."^^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 2 ; + sh:qualifiedMaxCount 1 ; sh:qualifiedMinCount 1 ; - 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 ], - [ rdfs:comment "Pattern 2: A Coil shall have one outlet using the medium Fluid."^^xsd:string ; + 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:hasConnectionPoint ; sh:qualifiedMaxCount 1 ; sh:qualifiedMinCount 1 ; @@ -68039,7 +68031,15 @@ s223:Coil a s223:Class, 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:hasMedium ] ] ] ], + [ rdfs:comment "Pattern 2: A Coil shall have one or two bidirectionals using the medium Fluid or ThermalContact."^^xsd:string ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMaxCount 2 ; + sh:qualifiedMinCount 1 ; + 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: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 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 ], - [ rdfs:comment "If the relation hasOutput is present it must associate a Function with a Property."^^xsd:string ; + 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 ] . + sh:path s223:hasOutput ], + [ 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 ] . s223:LineNeutralVoltage-110V a s223:Class, s223:LineNeutralVoltage-110V, @@ -71217,7 +71217,13 @@ s223:EnumerationKind-Substance a s223:Class, rdfs:label "Substance"^^xsd:string ; rdfs:comment "This class has enumerated subclasses of the substances that are consumed, produced, transported, sensed, controlled or otherwise interacted with (e.g. water, air, etc.)."^^xsd:string ; rdfs:subClassOf s223:EnumerationKind ; - sh:property [ rdfs:comment "A substance may only have atomic constituents, it may not have a constituent that also composed ofs."^^xsd:string ; + sh:property [ rdfs:comment """If the relation composedOf is present, it must associate an EnumerationKind-Substance with one or more Properties that +identify and characterize its constituents. The Property identifies the constituent using the relation ofConstituent. If appropriate, a +QuantifiableProperty may be used to also specify the amount of the constituent using the relations qudt:hasQuantityKind, qudt:hasUnit, and s223:hasValue. +For example, see `s223:GlycolSolution-15Percent`."""^^xsd:string ; + sh:class s223:Property ; + sh:path s223:composedOf ], + [ rdfs:comment "A substance may only have atomic constituents, it may not have a constituent that also composed ofs."^^xsd:string ; sh:path s223:composedOf ; sh:sparql [ a sh:SPARQLConstraint ; rdfs:comment "If a substance has a constituent, that constituent may not itself have constituents."^^xsd:string ; @@ -71229,33 +71235,27 @@ WHERE { $this s223:composedOf ?constituent . ?constituent s223:ofConstituent/s223:composedOf ?nextConstituent . } -"""^^xsd:string ] ], - [ rdfs:comment """If the relation composedOf is present, it must associate an EnumerationKind-Substance with one or more Properties that -identify and characterize 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 ] . +"""^^xsd:string ] ] . s223:Fan a s223:Class, sh:NodeShape ; rdfs:label "Fan"^^xsd:string ; rdfs:comment "A machine used to create flow within a gas such as air. "^^xsd:string ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A Fan shall have at least one outlet using the medium Air."^^xsd:string ; - sh:message "s223: A Fan shall have at least one outlet using the medium Air."^^xsd:string ; + sh:property [ rdfs:comment "A Fan shall have at least one inlet using the medium Air."^^xsd:string ; + sh:message "s223: A Fan 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 Fan shall have at least one inlet using the medium Air."^^xsd:string ; - sh:message "s223: A Fan shall have at least one inlet using the medium Air."^^xsd:string ; + [ rdfs:comment "A Fan shall have at least one outlet using the medium Air."^^xsd:string ; + sh:message "s223: A Fan 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 ] ] ] ] . @@ -76143,15 +76143,15 @@ s223:EnumerationKind-Numerical a s223:Class, ns1:hasUnit ; rdfs:comment "Numerical enumeration kinds are used to support the definitions of the Electricity medium. The enumerations instances in these classes have names that are recognizable by humans but are just a string for a computer application. To avoid the need to parse strings, each of these enumeration kinds have properties associated with the enumeration that represent electrical phase, voltage, and frequency. The purpose of these properties is to enable a machine to query them and obtain the same information that a person would associate with the sting"^^xsd:string ; rdfs:subClassOf s223:EnumerationKind ; - sh:property [ rdfs:comment "An EnumerationKind-Numerical must be associated with at least one QuantityKind using the relation hasQuantityKind."^^xsd:string ; - sh:class ns1:QuantityKind ; - sh:minCount 1 ; - sh:path ns1:hasQuantityKind ], - [ rdfs:comment "An EnumerationKind-Numerical must be associated with at least one Unit using the relation hasUnit."^^xsd:string ; + sh:property [ rdfs:comment "An EnumerationKind-Numerical must be associated with at least one Unit using the relation hasUnit."^^xsd:string ; sh:class ns1:Unit ; sh:minCount 1 ; sh:path ns1:hasUnit ; sh:severity sh:Info ], + [ rdfs:comment "An EnumerationKind-Numerical must be associated with at least one QuantityKind using the relation hasQuantityKind."^^xsd:string ; + sh:class ns1:QuantityKind ; + sh:minCount 1 ; + sh:path ns1:hasQuantityKind ], [ rdfs:comment "An EnumerationKind-Numerical can be associated with a decimal value using the relation hasValue."^^xsd:string ; sh:datatype xsd:decimal ; sh:path s223:hasValue ] . @@ -79116,103 +79116,10 @@ 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 "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the associated Connection."^^xsd:string ; - sh:name "Test for compatible declared Medium"^^xsd:string ; - sh:path s223:hasMedium ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 3: Connection with a pure medium 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 . -?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 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 {?m2} is incompatible with {?cp2} with Medium {?m1}."^^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 ?m2 . -$this s223:cnx ?cp2 . -?cp2 a/rdfs:subClassOf* s223:ConnectionPoint . -FILTER (?cp1 != ?cp2 ) . -?cp2 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:name "Test for compatible declared Medium"^^xsd:string ; - sh:path s223:hasMedium ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 2: A Connection with constituents and an associated ConnectionPoint with a pure Medium."^^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 . -?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 "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 "A Connection must be associated with exactly one Substance-Medium using the relation hasMedium."^^xsd:string ; - sh:class s223:Substance-Medium ; - sh:maxCount 1 ; - sh:message "s223: A Connection must be associated with exactly one Substance-Medium using the relation hasMedium."^^xsd:string ; - sh:minCount 1 ; - sh:name "Connection medium"^^xsd:string ; - sh:path s223:hasMedium ], - [ rdfs:comment "If the relation hasRole is present it must associate the Connection with an EnumerationKind-Role."^^xsd:string ; + 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 "If the relation hasThermodynamicPhase is present it must associate the Connection with at most one EnumerationKind-Phase."^^xsd:string ; - sh:class s223:EnumerationKind-Phase ; - sh:maxCount 1 ; - sh:message "s223: If the relation hasThermodynamicPhase is present it must associate the Connection with at most one EnumerationKind-Phase."^^xsd:string ; - sh:path s223:hasThermodynamicPhase ], [ rdfs:comment "Ensure that the Medium identified by 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 ; @@ -79234,26 +79141,29 @@ FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) . FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) . } """^^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 only have a cnx relation with a ConnectionPoint"^^xsd:string ; - sh:path s223:cnx ; + [ rdfs:comment "Ensure that the Medium identified by all the associated ConnectionPoints via the s223:hasMedium relation are compatible with one another."^^xsd:string ; + sh:name "Test for compatible declared Medium"^^xsd:string ; + sh:path s223:hasMedium ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "A Connection must only have a cnx relation with a ConnectionPoint"^^xsd:string ; - sh:message "s223: {$this} cannot have a s223:cnx relation to {?something}, because {?something} is not a ConnectionPoint."^^xsd:string ; + rdfs:comment "Inconsistent Medium. Case 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 ?something + sh:select """ +SELECT $this ?cp1 ?m1 ?cp2 ?m2 WHERE { -$this s223:cnx ?something . -FILTER NOT EXISTS {?something a/rdfs:subClassOf* s223:ConnectionPoint} . -}"""^^xsd:string ] ], - [ 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 ], +$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 ; @@ -79282,6 +79192,55 @@ $this s223:hasMedium ?m1 . } } """^^xsd:string ] ], + [ rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the associated Connection."^^xsd:string ; + sh:name "Test for compatible declared Medium"^^xsd:string ; + sh:path s223:hasMedium ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Inconsistent Medium. Case 3: Connection with a pure medium 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 . +?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 "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 ; + rdfs:comment "A Connection must only have a cnx relation with a ConnectionPoint"^^xsd:string ; + sh:message "s223: {$this} cannot have a s223:cnx relation to {?something}, because {?something} is not a ConnectionPoint."^^xsd:string ; + sh:prefixes ; + sh:select """SELECT $this ?something +WHERE { +$this s223:cnx ?something . +FILTER NOT EXISTS {?something a/rdfs:subClassOf* s223:ConnectionPoint} . +}"""^^xsd:string ] ], + [ rdfs:comment "If the relation 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 ; @@ -79307,75 +79266,116 @@ 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 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 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 ; + rdfs:comment "Inconsistent Medium. Case 3: Two ConnectionPoints with mediums with constituents."^^xsd:string ; + sh:message "s223: {?cp1} with Medium {?m2} is incompatible with {?cp2} with Medium {?m1}."^^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 . +?cp1 s223:hasMedium ?m2 . $this s223:cnx ?cp2 . ?cp2 a/rdfs:subClassOf* s223:ConnectionPoint . -?cp2 s223:hasMedium ?m2 . -FILTER (?m1 != ?m2 ) . +FILTER (?cp1 != ?cp2 ) . +?cp2 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 hasThermodynamicPhase is present it must associate the Connection with at most one EnumerationKind-Phase."^^xsd:string ; + sh:class s223:EnumerationKind-Phase ; + sh:maxCount 1 ; + sh:message "s223: If the relation hasThermodynamicPhase is present it must associate the Connection with at most one EnumerationKind-Phase."^^xsd:string ; + sh:path s223:hasThermodynamicPhase ], + [ rdfs:comment "Ensure that the Medium identified by 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 2: A Connection with constituents and an associated ConnectionPoint with a pure Medium."^^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 . +?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 ] ] ; - sh:rule [ a sh:SPARQLRule ; - rdfs:comment "Infer the connectsTo relation using connectsAt"^^xsd:string ; +} +"""^^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 ; 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:SPARQLRule ; - rdfs:comment "Infer the connectsFrom relation using connectsAt"^^xsd:string ; + 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: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,11 +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 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 "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: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 ], @@ -81349,6 +81345,21 @@ s223:Sensor a s223:Class, 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: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 ; + sh:message "s223: Sensor {$this} has a reference location, but its Property lacks isDeltaQuantity true."^^xsd:string ; + sh:prefixes ; + sh:select """ + SELECT $this + WHERE { +$this s223:hasReferenceLocation ?y . +$this s223:observes ?x . +?x a/rdfs:subClassOf* s223:QuantifiableProperty . +FILTER NOT EXISTS {$this s223:observes/qudt:isDeltaQuantity true} +} +"""^^xsd:string ] ], [ 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 ; @@ -81364,26 +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 ], - [ 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 ; - sh:message "s223: Sensor {$this} has a reference location, but its Property lacks isDeltaQuantity true."^^xsd:string ; - sh:prefixes ; - sh:select """ - SELECT $this - WHERE { -$this s223:hasReferenceLocation ?y . -$this s223:observes ?x . -?x a/rdfs:subClassOf* s223:QuantifiableProperty . -FILTER NOT EXISTS {$this s223:observes/qudt:isDeltaQuantity true} -} -"""^^xsd:string ] ] ; + sh:path s223:hasObservationLocation ] ; 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 """ @@ -82618,16 +82618,15 @@ $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 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 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 ; @@ -82638,15 +82637,34 @@ FILTER NOT EXISTS {$this s223:cnx+ ?otherC} 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 ], + [ 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 ], - [ 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 ] ; - sh:rule [ a sh:SPARQLRule ; + 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 ; + 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 ; + sh:subject sh:this ], + [ a sh:TripleRule ; + rdfs:comment "Infer the hasConnectionPoint relation using cnx"^^xsd:string ; + sh:name "InferredEquipmentToConnectionPointProperty"^^xsd:string ; + sh:object [ sh:path s223:cnx ] ; + sh:predicate s223:hasConnectionPoint ; + sh:subject sh:this ], + [ a sh:SPARQLRule ; rdfs:comment "Infer the connectedTo relation using connectsThrough and connectsTo."^^xsd:string ; sh:construct """ CONSTRUCT {$this s223:connectedTo ?equipment .} @@ -82659,15 +82677,9 @@ $this s223:hasConnectionPoint ?cp . sh:name "InferredEquipmentToDownstreamEquipmentProperty"^^xsd:string ; sh:prefixes ], [ a sh:TripleRule ; - rdfs:comment "Infer the hasConnectionPoint relation using cnx"^^xsd:string ; - sh:name "InferredEquipmentToConnectionPointProperty"^^xsd:string ; - sh:object [ sh:path s223:cnx ] ; - sh:predicate s223:hasConnectionPoint ; - sh:subject sh:this ], - [ a sh:TripleRule ; - rdfs:comment "Infer the connected relation using connectedFrom"^^xsd:string ; - sh:name "InferredEquipmentToEquipmentPropertyfromconnectedFrom"^^xsd:string ; - sh:object [ sh:path s223:connectedFrom ] ; + 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 ; @@ -82683,12 +82695,6 @@ FILTER NOT EXISTS {?d2 s223:contains* $this} . """^^xsd:string ; sh:name "InferredEquipmentToDownstreamEquipmentProperty"^^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 ; - sh:subject sh:this ], [ a sh:SPARQLRule ; rdfs:comment "Infer the connectedFrom relations using connectsThrough and connectsFrom."^^xsd:string ; sh:construct """ @@ -82702,22 +82708,16 @@ $this s223:hasConnectionPoint ?cp . sh:name "InferredEquipmentToUpstreamEquipmentProperty"^^xsd:string ; sh:prefixes ], [ a sh:TripleRule ; - rdfs:comment "Infer the connected relation using connectedTo"^^xsd:string ; - sh:name "InferredEquipmentToEquipmentPropertyfromconnectedTo"^^xsd:string ; - sh:object [ sh:path s223:connectedTo ] ; - sh:predicate s223:connected ; + rdfs:comment "Infer the cnx relationship using hasConnectionPoint."^^xsd:string ; + sh:name "InferredEquipmentToConnectionPointCnxProperty"^^xsd:string ; + sh:object [ sh:path s223:hasConnectionPoint ] ; + sh:predicate s223:cnx ; sh:subject sh:this ], [ a sh:TripleRule ; rdfs:comment "Infer the cnx relation using isConnectionPointOf."^^xsd:string ; sh:name "InferredEquipmentToConnectionPointCnxPropertyFromInverse"^^xsd:string ; sh:object [ sh:path [ sh:inversePath s223:isConnectionPointOf ] ] ; sh:predicate s223:cnx ; - sh:subject sh:this ], - [ a sh:TripleRule ; - rdfs:comment "Infer the 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 ; @@ -83850,23 +83850,6 @@ BIND(REPLACE(?localName, "-", " ", "i") AS ?newLabel) sh:name "AddLabelFromLocalName"^^xsd:string ; sh:prefixes ] ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Ensure that any instance that is declared to be an instance of an abstract class must also be declared an instance of at least one subClass of that abstract class"^^xsd:string ; - sh:message "s223: {$this} cannot be declared an instance of only abstract class {?class}."^^xsd:string ; - sh:prefixes ; - sh:select """ -SELECT DISTINCT $this ?class -WHERE { -?class s223:abstract true . -$this a ?class . -OPTIONAL { -?otherClass rdfs:subClassOf+ ?class . -$this a ?otherClass . -FILTER (?class != ?otherClass) . -} -FILTER (!bound (?otherClass)) . -} -"""^^xsd:string ], - [ a sh:SPARQLConstraint ; rdfs:comment "Inconsistent Medium. Case 4: A medium with constituents and an associated property with constituents."^^xsd:string ; sh:message "s223: {$this} hasMedium of {?m1}, but is associated with property {?prop} that has ofMedium of {?m2}."^^xsd:string ; sh:prefixes ; @@ -83890,6 +83873,25 @@ $this ?p ?prop . {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} . } } +"""^^xsd:string ], + [ a sh:SPARQLConstraint ; + rdfs:comment "Inconsistent Medium. Case 2: A pure medium and an associated property with constituents."^^xsd:string ; + sh:message "s223: {$this} hasMedium of {?m1}, but is associated with property {?prop} that has ofMedium of {?m2}."^^xsd:string ; + sh:prefixes ; + sh:select """ +SELECT $this ?m1 ?prop ?m2 +WHERE { +$this s223:hasMedium ?m1 . +$this ?p ?prop . +?prop a/rdfs:subClassOf* s223:Property . +?prop s223:ofMedium ?m2 . +?m2 s223:composedOf/s223:ofConstituent ?s2 . +FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . +FILTER NOT EXISTS { + ?m2 s223:composedOf/s223:ofConstituent ?s12 . + {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} . +} +} """^^xsd:string ], [ a sh:SPARQLConstraint ; rdfs:comment "Inconsistent Medium. Case 1: Two pure mediums."^^xsd:string ; @@ -83910,35 +83912,33 @@ FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) . } """^^xsd:string ], [ a sh:SPARQLConstraint ; - rdfs:comment "Inconsistent Medium. Case 3: A medium with constituents and an associated property with a pure medium."^^xsd:string ; - sh:message "s223: {$this} hasMedium of {?m2}, but is associated with property {?prop} that has ofMedium of {?m1}."^^xsd:string ; + rdfs:comment "Ensure that any instance that is declared to be an instance of an abstract class must also be declared an instance of at least one subClass of that abstract class"^^xsd:string ; + sh:message "s223: {$this} cannot be declared an instance of only abstract class {?class}."^^xsd:string ; sh:prefixes ; sh:select """ -SELECT $this ?m1 ?prop ?m2 +SELECT DISTINCT $this ?class WHERE { -$this s223:hasMedium ?m2 . -$this ?p ?prop . -?prop a/rdfs:subClassOf* s223:Property . -?prop s223:ofMedium ?m1 . -?m2 s223:composedOf/s223:ofConstituent ?s2 . -FILTER NOT EXISTS {?m1 s223:composedOf ?c1} . -FILTER NOT EXISTS { - ?m2 s223:composedOf/s223:ofConstituent ?s12 . - {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} . +?class s223:abstract true . +$this a ?class . +OPTIONAL { +?otherClass rdfs:subClassOf+ ?class . +$this a ?otherClass . +FILTER (?class != ?otherClass) . } +FILTER (!bound (?otherClass)) . } """^^xsd:string ], [ a sh:SPARQLConstraint ; - 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 { @@ -84387,33 +84387,7 @@ ConnectionPoints are represented graphically in this standard by a triangle with """^^xsd:string ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "A ConnectionPoint can be associated with at most one other ConnectionPoint using the inverse of relation mapsTo"^^xsd:string ; - sh:class s223:ConnectionPoint ; - sh:maxCount 1 ; - sh:message "s223: A ConnectionPoint can be associated with at most one other ConnectionPoint using the inverse of relation mapsTo"^^xsd:string ; - sh:path [ sh:inversePath s223:mapsTo ] ], - [ rdfs:comment "A ConnectionPoint must be associated with exactly one Connectable using the relation isConnectionPointOf."^^xsd:string ; - sh:class s223:Connectable ; - sh:maxCount 1 ; - sh:message "s223: A ConnectionPoint must be associated with exactly one Connectable using the relation isConnectionPointOf."^^xsd:string ; - sh:minCount 1 ; - sh:name "ConnectionPointToEquipmentShape"^^xsd:string ; - sh:path s223:isConnectionPointOf ], - [ rdfs:comment "A ConnectionPoint must not have both a mapsTo and a connectsThrough relation."^^xsd:string ; - sh:path s223:mapsTo ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "A ConnectionPoint must not have both a mapsTo and a connectsThrough relation."^^xsd:string ; - sh:message "s223: {$this} cannot have both a mapsTo {?uppercp} and a connectsThrough {?connection}."^^xsd:string ; - sh:prefixes ; - sh:select """ -SELECT $this ?uppercp ?connection -WHERE { -$this s223:mapsTo ?uppercp . -$this s223:connectsThrough ?connection . -?connection a/rdfs:subClassOf* s223:Connection . -} -"""^^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: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:sparql [ a sh:SPARQLConstraint ; @@ -84440,60 +84414,52 @@ FILTER (NOT EXISTS {?a a/rdfs:subClassOf* ?b}) . sh:name "ConnectionPointToConnectionShape"^^xsd:string ; sh:path s223:connectsThrough ; sh:severity sh:Info ], - [ 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 "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 can be associated with at most one other ConnectionPoint using the relation mapsTo"^^xsd:string ; - sh:path s223:mapsTo ], [ rdfs:comment "If the relation hasElectricalPhase is present it must associate the ConnectionPoint with an ElectricalPhaseIdentifier or ElectricalVoltagePhases."^^xsd:string ; sh: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 ; + sh:maxCount 1 ; + sh:message "s223: A ConnectionPoint can be associated with at most one other ConnectionPoint using the inverse of relation mapsTo"^^xsd:string ; + sh:path [ sh:inversePath s223:mapsTo ] ], + [ rdfs:comment "A ConnectionPoint must not have both a mapsTo and a connectsThrough relation."^^xsd:string ; + sh:path s223:mapsTo ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "A ConnectionPoint must not have both a mapsTo and a connectsThrough relation."^^xsd:string ; + sh:message "s223: {$this} cannot have both a mapsTo {?uppercp} and a connectsThrough {?connection}."^^xsd:string ; + sh:prefixes ; + sh:select """ +SELECT $this ?uppercp ?connection +WHERE { +$this s223:mapsTo ?uppercp . +$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, 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 "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 "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 ; @@ -84509,6 +84475,13 @@ $this s223:mapsTo ?otherCP . FILTER NOT EXISTS {?otherEquipment s223:contains ?equipment} } """^^xsd:string ] ], + [ rdfs:comment "A ConnectionPoint must be associated with exactly one Connectable using the relation isConnectionPointOf."^^xsd:string ; + sh:class s223:Connectable ; + sh:maxCount 1 ; + sh:message "s223: A ConnectionPoint must be associated with exactly one Connectable using the relation isConnectionPointOf."^^xsd:string ; + sh:minCount 1 ; + sh:name "ConnectionPointToEquipmentShape"^^xsd:string ; + sh:path s223:isConnectionPointOf ], [ rdfs:comment "A ConnectionPoint must be associated with exactly one Substance-Medium using the relation hasMedium."^^xsd:string ; sh:class s223:Substance-Medium ; sh:maxCount 1 ; @@ -84516,12 +84489,39 @@ 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 ; + 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 "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 ] . + sh:qualifiedValueShapesDisjoint true ], + [ 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 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 ] . a ns1:QuantityKindDimensionVector_ISO, ns1:QuantityKindDimensionVector_Imperial, @@ -86936,27 +86936,55 @@ A property that is not an instance of one of its subclasses is unconstrained with respect to its value. """^^xsd:string ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "A Property can use at most one relation hasValue if it is required to provide a static value in the model. It is not meant for real-time value (see `s223:hasExternalReference`)."^^xsd:string ; - sh:maxCount 1 ; - sh:message "s223: A Property can use at most one relation hasValue if it is required to provide a static value in the model. It is not meant for real-time value (see `s223:hasExternalReference`)."^^xsd:string ; - sh:path s223:hasValue ], - [ rdfs:comment "An instance of s223:Property must not be observed (set) by more than one entity."^^xsd:string ; - sh:maxCount 1 ; - sh:message "s223: An instance of s223:Property must not be observed (set) by more than one entity."^^xsd:string ; - sh:path [ sh:inversePath s223:observes ] ], - [ rdfs:comment "A Property must not have both a hasInternalReference and a hasValue relation."^^xsd:string ; + sh:property [ rdfs:comment "A Property must not have both a hasExternalReference and a hasValue relation."^^xsd:string ; + sh:path s223:hasValue ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "A Property must not have both a hasExternalReference and a hasValue relation."^^xsd:string ; + sh:message "s223: {$this} cannot have both a hasExternalReference and a hasValue relation."^^xsd:string ; + sh:prefixes ; + sh:select """ +SELECT $this +WHERE { +$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 ; 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 "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 ; @@ -86978,51 +87006,23 @@ FILTER NOT EXISTS {$this s223:ofConstituent ?someSubstance} . 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 can be associated with at most one Function using the inverse relation hasOutput."^^xsd:string ; - sh:class s223:Function ; - sh:maxCount 1 ; - sh:message "s223: A Property can be associated with at most one Function using the inverse relation hasOutput."^^xsd:string ; - sh:path [ sh:inversePath s223:hasOutput ] ], - [ rdfs:comment "A Property can be associated with at most one EnumerationKind-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 ; + [ 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 . -} -"""^^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 "A Property must not have both a hasExternalReference and a hasValue relation."^^xsd:string ; - sh:path s223:hasValue ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "A Property must not have both a hasExternalReference and a hasValue relation."^^xsd:string ; - sh:message "s223: {$this} cannot have both a hasExternalReference and a hasValue relation."^^xsd:string ; - sh:prefixes ; - sh:select """ -SELECT $this -WHERE { -$this s223:hasExternalReference ?ext . $this s223:hasValue ?val . } """^^xsd:string ] ], - [ rdfs:comment "If the relation hasAspect is present, it must associate the Property with an EnumerationKind."^^xsd:string ; - sh:class s223:EnumerationKind ; - sh:message "s223: If the relation hasAspect is present, it must associate the Property with an EnumerationKind."^^xsd:string ; - sh:path s223:hasAspect ] ; + [ 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: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,17 +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 """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 ], + sh:property [ 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 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 +WHERE { +$this qudt:hasUnit ?punit . +$this s223:hasSetpoint ?setpoint . +?setpoint qudt:hasUnit ?sunit . +?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 ; @@ -87069,20 +87077,41 @@ FILTER (?pqk != ?sqk) . FILTER (?pdv != ?sdv) . } """^^xsd:string ] ], - [ rdfs:comment "This QuantifiableProperty cannot have a value without a Unit."^^xsd:string ; - sh:path s223:hasValue ; + [ 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 ; 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 ; + 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 ?v ?subject +SELECT $this WHERE { -$this s223:hasValue ?v . -FILTER NOT EXISTS {$this qudt:hasUnit ?u} . -?subject ?p $this . +$this s223:hasAspect s223:Aspect-Setpoint . +FILTER NOT EXISTS {?anything s223:hasSetpoint $this} . } """^^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 ; @@ -87097,23 +87126,27 @@ FILTER NOT EXISTS {$this qudt:hasUnit ?u} . ?subject ?p $this . } """^^xsd:string ] ], - [ rdfs:comment "A QuantifiableProperty must be associated with a QuantityKind using the relation hasQuantityKind."^^xsd:string ; - sh:class ns1:QuantityKind ; + [ 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 must be associated with a QuantityKind using the relation hasQuantityKind."^^xsd:string ; - sh:minCount 1 ; - sh:path ns1:hasQuantityKind ], - [ rdfs:comment "This QuantifiableProperty uses hasSetpoint to reference a Property that lacks an Aspect of Aspect-Setpoint."^^xsd:string ; - sh:path ns1:hasAspect ; + 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 ; + sh:path ns1:hasUnit ; 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 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 +SELECT $this ?setpoint ?punit ?sunit WHERE { +$this qudt:hasUnit ?punit . $this s223:hasSetpoint ?setpoint . -FILTER NOT EXISTS {?setpoint s223:hasAspect s223:Aspect-Setpoint} . +?setpoint qudt:hasUnit ?sunit . +?punit qudt:hasDimensionVector ?pdv . +?sunit qudt:hasDimensionVector ?sdv . +FILTER (?punit != ?sunit) . +FILTER (?pdv != ?sdv) . } """^^xsd:string ] ], [ rdfs:comment """Normally, a QuantifiableProperty is associated with a static decimal value using s223:hasValue, along with a single @@ -87124,70 +87157,37 @@ 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 "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 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 "This QuantifiableProperty uses a different Unit than the Setpoint associated with it."^^xsd:string ; - sh:path ns1:hasUnit ; - sh:severity sh:Info ; + [ 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 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 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 ?setpoint ?punit ?sunit +SELECT $this ?v ?subject WHERE { -$this qudt:hasUnit ?punit . -$this s223:hasSetpoint ?setpoint . -?setpoint qudt:hasUnit ?sunit . -?punit qudt:hasDimensionVector ?pdv . -?sunit qudt:hasDimensionVector ?sdv . -FILTER (?punit != ?sunit) . -FILTER (?pdv = ?sdv) . +$this s223:hasValue ?v . +FILTER NOT EXISTS {$this qudt:hasUnit ?u} . +?subject ?p $this . } """^^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 "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 ; - sh:path ns1:hasUnit ; - 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 ; - sh:prefixes ; - sh:select """ -SELECT $this ?setpoint ?punit ?sunit -WHERE { -$this qudt:hasUnit ?punit . -$this s223:hasSetpoint ?setpoint . -?setpoint qudt:hasUnit ?sunit . -?punit qudt:hasDimensionVector ?pdv . -?sunit qudt:hasDimensionVector ?sdv . -FILTER (?punit != ?sunit) . -FILTER (?pdv != ?sdv) . -} -"""^^xsd:string ] ] ; + sh:path ns1:value ] ; sh:rule [ a sh:SPARQLRule ; rdfs:comment "Infer the hasQuantityKind relation if it is unambiguous."^^xsd:string ; sh:construct """ @@ -92275,14 +92275,14 @@ s223:OutletConnectionPoint a s223:Class, rdfs:label "Outlet Connection Point"^^xsd:string ; rdfs:comment "An OutletConnectionPoint is a ConnectionPoint for which a Medium is expected to flow out of the associated Connectable."^^xsd:string ; rdfs:subClassOf s223:ConnectionPoint ; - sh:property [ rdfs:comment "If the relation mapsTo is present it must associate the OutletConnectionPoint with an OutletConnectionPoint."^^xsd:string ; - sh:class s223:OutletConnectionPoint ; - sh:message "s223: If the relation mapsTo is present it must associate the OutletConnectionPoint with an OutletConnectionPoint."^^xsd:string ; - sh:path s223:mapsTo ], - [ rdfs:comment "If the relation pairedConnectionPoint is present it must associate the OutletConnectionPoint with an InletConnectionPoint."^^xsd:string ; + sh:property [ rdfs:comment "If the relation pairedConnectionPoint is present it must associate the OutletConnectionPoint with an InletConnectionPoint."^^xsd:string ; sh:class s223:InletConnectionPoint ; sh:message "s223: If the relation pairedConnectionPoint is present it must associate the OutletConnectionPoint with an InletConnectionPoint."^^xsd:string ; sh:path s223:pairedConnectionPoint ], + [ rdfs:comment "If the relation mapsTo is present it must associate the OutletConnectionPoint with an OutletConnectionPoint."^^xsd:string ; + sh:class s223:OutletConnectionPoint ; + sh:message "s223: If the relation mapsTo is present it must associate the OutletConnectionPoint with an OutletConnectionPoint."^^xsd:string ; + sh:path s223:mapsTo ], [ rdfs:comment "Ensure an OutletConnectionPoint 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 ; @@ -92355,14 +92355,14 @@ FILTER NOT EXISTS {?parentEquipment s223:contains ?sourceEquipment} . FILTER NOT EXISTS {$this s223:mapsTo ?anything} . } """^^xsd:string ] ], - [ 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 "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 ] . + 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 ] . 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 Quantity Kind of Voltage"^^xsd:string ; - sh:hasValue ; - sh:path ns1:hasQuantityKind ], - [ rdfs:comment "A Numerical-Voltage must have a unit of Volts"^^xsd:string ; + sh:property [ rdfs:comment "A Numerical-Voltage must have a unit of Volts"^^xsd:string ; sh:hasValue ; - sh:path ns1:hasUnit ] . + sh:path ns1:hasUnit ], + [ rdfs:comment "A Numerical-Voltage must have a Quantity Kind of Voltage"^^xsd:string ; + sh:hasValue ; + sh:path ns1:hasQuantityKind ] . s223:Equipment a s223:Class, sh:NodeShape ; @@ -92417,21 +92417,44 @@ 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 "Disallow contained equipment from having external outgoing connections."^^xsd:string ; - sh:path s223:connectedTo ; + 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 "Disallow contained equipment from having external outgoing connections."^^xsd:string ; - sh:message "s223: {$this} should not have a connection to external equipment {?otherDev} because {?container} contains {$this}."^^xsd:string ; + 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 ?container ?otherDev +SELECT $this ?subEquip ?type1 ?type2 WHERE { -$this s223:connectedTo ?otherDev . -$this ^s223:contains ?container . -?container a/rdfs:subClassOf* s223:Equipment . -FILTER NOT EXISTS {?container s223:contains ?otherDev .} + 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 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 "Disallow contained equipment from having external incoming connections."^^xsd:string ; sh:path s223:connectedFrom ; sh:sparql [ a sh:SPARQLConstraint ; @@ -92447,12 +92470,6 @@ $this ^s223:contains ?container . FILTER NOT EXISTS {?container s223:contains ?otherDev .} } """^^xsd:string ] ], - [ 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 ; @@ -92463,38 +92480,21 @@ Note that any Equipment may use this relation, not just Actuator."""^^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 "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 ; + [ rdfs:comment "Disallow contained equipment from having external outgoing connections."^^xsd:string ; + sh:path s223:connectedTo ; 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 ; + rdfs:comment "Disallow contained equipment from having external outgoing connections."^^xsd:string ; + sh:message "s223: {$this} should not have a connection to external equipment {?otherDev} because {?container} contains {$this}."^^xsd:string ; sh:prefixes ; sh:select """ -SELECT $this ?subEquip ?type1 ?type2 +SELECT $this ?container ?otherDev 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 . -} +$this s223:connectedTo ?otherDev . +$this ^s223:contains ?container . +?container a/rdfs:subClassOf* s223:Equipment . +FILTER NOT EXISTS {?container s223:contains ?otherDev .} } -"""^^xsd:string ] ], - [ rdfs:comment "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 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 ] ; +"""^^xsd:string ] ] ; 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,110 +94068,110 @@ s223:Frequency-60Hz a s223:Class, sh: ; owl:versionInfo "Created with TopBraid Composer", "Created with TopBraid Composer"^^xsd:string ; - sh:declare [ 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/2000/01/rdf-schema#"^^xsd:anyURI ; - sh:prefix "rdfs"^^xsd:string ], - [ a sh:PrefixDeclaration ; - sh:namespace "http://www.w3.org/2001/XMLSchema#"^^xsd:anyURI ; - sh:prefix "xsd"^^xsd:string ], - [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; - sh:prefix "qudt"^^xsd:string ], - [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; + sh:declare [ 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://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/2002/07/owl#"^^xsd:anyURI ; + sh:prefix "owl"^^xsd:string ], [ a sh:PrefixDeclaration ; sh:namespace "http://www.w3.org/ns/shacl#"^^xsd:anyURI ; sh:prefix "sh"^^xsd:string ], - [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; - sh:prefix "qudtqk"^^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 ], + [ a sh:PrefixDeclaration ; + sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; + sh:prefix "quantitykind"^^xsd:string ], [ a sh:PrefixDeclaration ; 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://qudt.org/vocab/unit/"^^xsd:anyURI ; - sh:prefix "unit"^^xsd:string ], [ a sh:PrefixDeclaration ; - sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ; - sh:prefix "unit"^^xsd:string ], + sh:namespace "http://qudt.org/vocab/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 ], [ 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/ns/shacl#"^^xsd:anyURI ; - sh:prefix "sh"^^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/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://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; - sh:prefix "quantitykind"^^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://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://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 ], [ 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 ], + sh:namespace "http://purl.org/dc/terms/"^^xsd:anyURI ; + sh:prefix "dcterms"^^xsd:string ], [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; sh:prefix "quantitykind"^^xsd:string ], [ a sh:PrefixDeclaration ; - sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ; - sh:prefix "rdf"^^xsd:string ], + sh:namespace "http://qudt.org/vocab/dimensionvector/"^^xsd:anyURI ; + sh:prefix "qkdv"^^xsd:string ], [ a sh:PrefixDeclaration ; sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; sh:prefix "rdfs"^^xsd:string ], [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; sh:prefix "rdfs"^^xsd:string ], - [ sh:namespace "http://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/2000/01/rdf-schema#"^^xsd:anyURI ; + sh:prefix "rdfs"^^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 ], [ a sh:PrefixDeclaration ; sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ; sh:prefix "rdf"^^xsd:string ], - [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; - sh:prefix "s223"^^xsd:string ], - [ a sh:PrefixDeclaration ; - sh:namespace "http://www.w3.org/2002/07/owl#"^^xsd:anyURI ; - sh:prefix "owl"^^xsd:string ], [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; sh:prefix "rdfs"^^xsd:string ], + [ 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/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 ], + sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ; + sh:prefix "unit"^^xsd:string ], [ a sh:PrefixDeclaration ; sh:namespace "http://purl.org/dc/terms/"^^xsd:anyURI ; sh:prefix "dcterms"^^xsd:string ], [ 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/2000/01/rdf-schema#"^^xsd:anyURI ; - sh:prefix "rdfs"^^xsd:string ], + [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; + sh:prefix "qudt"^^xsd:string ], [ a sh:PrefixDeclaration ; - sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ; + sh:namespace "http://www.w3.org/2002/07/owl#"^^xsd:anyURI ; + sh:prefix "owl"^^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://qudt.org/schema/qudt/"^^xsd:anyURI ; - sh:prefix "qudt"^^xsd:string ] . + [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; + sh:prefix "s223"^^xsd:string ] . a ns1:SystemOfUnits ; rdfs:label "CGS System of Units ESU"@en ; diff --git a/ontologies/223standard.ttl b/ontologies/223standard.ttl new file mode 100644 index 0000000..f8a2f54 --- /dev/null +++ b/ontologies/223standard.ttl @@ -0,0 +1,919 @@ +@prefix s223: . +@prefix qudt: . +@prefix bacnet: . +@prefix g36: . + +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xml: . +@prefix xsd: . +@prefix doc: . +@prefix pub: . + +pub:root a doc:Document ; + rdfs:comment """**Semantic Data Model for Analytics and Automation Applications in Buildings** + +**(This foreword is not part of this standard. It is merely informative and does not contain requirements necessary for conformance to the standard. It has not been processed according to the ANSI requirements for a standard and may contain material that has not been subject to public review or a consensus process. Unresolved objectors on informative material are not offered the right to appeal at ASHRAE or ANSI.)** + +**FOREWORD** + +*The motivation for this standard is to facilitate the deployment and use of software tools that leverage the data available from +building automation systems to improve building system operation in a variety of ways. This standard builds upon standards +and tools developed by the World Wide Web Consortium (W3C). Using those general tools, this standard defines modeling constructs for +use in creating amachine-readable representations of building systems, the building spaces that they serve, and the measurement +and control points used to provide a safe and comfortable environment for the building occupants. The result is a searchable +knowledge graph that can be used to automate the data mapping and configuration needed to deploy analytical, management, and control +tools for the built environment.* +""" ; + doc:subclauses ( + pub:purpose + pub:scope + pub:definitions + pub:conceptual-framework + pub:equipment + pub:connection + pub:grouping + pub:system + pub:space + pub:zone + pub:enumerations + pub:property_value + pub:reference-equipment-models + pub:AnnexA + pub:AnnexB + ) . + +pub:purpose + doc:title "PURPOSE" ; + rdfs:comment "The purpose of this standard is to define formal knowledge concepts and a methodology to apply them to create interoperable, machine-readable semantic frameworks for representing building automation and control data, and other building system information.". + +pub:scope + doc:title "SCOPE" ; + rdfs:comment """This standard provides a comprehensive way to apply semantic formalisms to represent the context of building system data and relationships between the associated building mechanical system components so that software applications can find and understand the information in an automated way. It is intended to facilitate the development and implementation of building analytics tools and enterprise knowledge applications that can implement many building system functions, including: + +(a) automated fault detection and diagnostics, +(b) building system commissioning, +(c) digital twins, +(d) optimization of energy use, and +(e) smart grid interactions. +""" . + +pub:definitions + doc:title "DEFINITIONS" ; + doc:subclauses ( + pub:definitions-terms + pub:abbrev + ) . + +pub:definitions-terms + doc:title "Terms Defined for this Standard" ; + rdfs:comment """ +**Connectable:** an abstract class that represents a thing (Equipment or DomainSpace) that can be connected via ConnectionPoints and Connections. + +**Connection:** the modeling construct used to represent a physical thing (e.g., pipe, duct, or wire) that is used to convey some Medium (e.g., water, air, or electricity) between two Connectable things. + +**ConnectionPoint:** an abstract modeling construct used to represent the fact that one Connectable thing can be connected to another Connectable thing using a Connection. It is the abstract representation of the flange, wire terminal, or other physical feature where a connection is made. + +Domain: a categorization of building service or specialization used to characterize equipment or spaces in a building. Example domains include HVAC, lighting, and plumbing. + +**DomainSpace:** a portion or the entirety of a PhysicalSpace that is associated with a Domain, such as lighting, HVAC, or physical security. DomainSpaces can be combined to form a Zone. + +**Duct:** a subclass of Connection that is used to transport air such as supply, return, and exhaust in HVAC (Heating, Ventilation, and Air Conditioning) systems. + +**ElectricWire:** a subclass of Connection that represents one or more flexible conductors used to convey electricity. + +**Equipment:** the modeling construct used to represent a device designed to accomplish a specific task. Examples include a pump, fan, heat exchanger, luminaire, temperature sensor, or flow meter. A piece of equipment can contain another piece of equipment. For example, an air handling unit can contain a cooling coil. + +**PhysicalSpace:** an architectural concept that represents 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. + +**Pipe:** a subclass of Connection that is used primarily to transport liquids and gases such as water, sewage, natural gas, and compressed air. + +**System:** a logical grouping (collection) of Equipment for some functional purpose. Examples of possible systems include an air distribution system, or a hot water system. Systems can contain other Systems. A System does not participate in Connections. + +**Zone:** a collection of DomainSpaces of a specific domain that are grouped together from the perspective of building services or controls. + +""" . + +pub:abbrev + doc:title "Abbreviations and Acronyms Used in this Standard" ; + rdfs:comment """ + +IFC Industry Foundation Class +RDF Resource Description Framework +SHACL Shapes Constraint Language +SPARQL SPARQL Protocol and RDF Query Language +Turtle Terse RDF Triple Language +W3C Worldwide Web Consortium + +""" . + +pub:conceptual-framework + + doc:title "CONCEPTUAL FRAMEWORK FOR SEMANTIC MODELING OF BUILDING SYSTEMS AND DATA" ; + rdfs:comment """ +This standard defines modeling constructs for use in creating a machine-readable representation of building systems, the building spaces that they serve, +and the measurement and control points used to provide a safe and comfortable environment for the building occupants. The standard can be considered a +toolkit of semantic building blocks and rules for using them to create a semantic model of a particular building or campus of buildings. The resulting model provides +a way for software applications to determine the relationships between the mechanical equipment in the building (i.e., AHU 1 gets chilled water from CH 3 +and provides conditioned air to VAV Boxes 12 through 15 serving rooms on the third floor) and the meaning of measurements that are available +(i.e., T16 is a temperature sensor measuring the temperature of the air stream exiting AHU 1). + +The model does not directly contain telemetric data about the real-time operation or past operation of the building systems. It does provide information +about the meaning or context of that data and defines external references that are used to point to a source of the data values, thus enablling analytics + applications to find them. If the data source is a BACnet building automation and control system, the external reference contains the necessary information + for analytic software to learn which BACnet device, object and property corresponds to the desired piece of information. This enables construction of a BACnet + message used to read the value. + +These capabilities are achieved by applying concepts, standards, and query tools developed and deployed for information and data science applications outside the building domain. A primary commercial driver for developing these standards and tools is the Semantic Web, an extension of the World Wide Web that was created to make the semantic meaning of data accessible from the Internet machine readable. + +This standard uses Resource Description Framework (RDF) (W3C) and its extended schema (RDFS) to represent the semantic ideas in the model. RDF is a general method for representing semantic ideas as of a triple. A triple consists of a subject, a predicate, and either a literal or an object. For example: + +Jane hasFriend Dave + +Jane hasSupervisor Mary + +In this example Jane is the subject of both triples, there are two different predicates, hasFriend and hasSupervisor, and there are two different objects, + Dave and Mary. The number of triples is expanded as needed to capture the desired information. The collection of triples represents a directed + multi-graph that can be searched or queried to answer questions or to infer information that may not be explicit in the graph. Figure 4-1 is a graph that + corresponds to this example. + +![Example triple graph.](figures/Figure_4-1_Triple_Example.svg) + +This standard defines subjects, predicates, and objects relevant to the building space that are used to build a multi-graph representing a specific + building or group of buildings. A compelling advantage of this graph-based approach is the ability to combine semantic graphs derived from complementary + semantic models that apply to the same building. This makes it possible to take advantage of the combined information from distinct domains. For example, a + RealEstateCore model that captures how spaces are assigned to different tenants in a building linked to the spaces represented in a Standard 223 model + results in a semantic model containing the combined information. In a similar way, it is possible to link information from a computerized maintenance + management system or an asset management system to the semantic graph of a Standard 223 model by adding a triple that binds a piece of equipment to its + representation in the other system.. + +A model constructed from this standard describes the topology of the equipment and spaces in a building but not the geometric details. Linking a +Standard 223 model with an RDF representation of a building information model would add that geometric information. + +Another advantage of using RDF to model building systems is that a query language standard, SPARQL (W3C SPARQL), exists and tools that implement SPARQL +are readily available. A building analytics tool developer needs only to create a library of queries relevant to their application, and use these queries +to interrogate any Standard 223 conformant model to find what they need from that building for their application. + +Using RDF also provides a way to build conformance constraints into this standard in a way that enables conformance to be algorithmically verified. +This is done by using a different W3C standard, Shapes Constraints Language (SHACL) (W3C SHACL). SHACL defines a way to constrain the construction of RDF +graphs through the application of custom developed rules called shapes. The normative constraints described in this standard are formalized in +SHACL shapes. The description of each concept defined in this standard includes a table that lists related conformance constraints defined by these +SHACL shapes. Readily available SHACL reasoners check whether or not a particular model instance conforms to the shapes defined in this standard. + +SHACL is also used in this standard to derive implicit information. The triples generated from this inference process enhance the ability to make useful +queries without the burden of a modeler crafting each predicate that might be useful in common searches. The goal is to make model development easier without sacrificing the utility application +developers need to find what they are looking for. The description of each concept defined in this standard with related inference rules includes a +table that lists the relevant SHACL shapes that apply the inferencing. + +The Terse RDF Triple Language (W3C Turtle) defines a textual syntax to represent and exchange RDF models. + +Because this standard includes references to measurements of physical properties, it is necessary to provide a model representation of units of measure +as well as what those units are quantifying (e.g., temperature, power, etc.). This standard builds upon the "Quantities, Units, Dimensions and +Types" (QUDT) ontology which is the leading open-source model expressed in RDF/SHACL. The QUDT model is documented at https://qudt.org. The key +concepts used here are the classes qudt:Unit and qudt:QuantityKind. + +The normative content of this standard is documented in an RDF model textualized using Turtle (see `pub:AnnexA`). All models conforming to this standard shall be textualized using Turtle. + +Because it is anticipated that models conforming to this standard will be combined with other semantic models, it is necessary to define a namespace for the +concepts defined by this standard to avoid any possible ambiguities that might arise from the same name being used in the complementary model. In this standard +and all conforming models, the prefix “s223:” shall be used in the name of each concept (class and property) defined by this standard, e.g., s223:Equipment. +The prefix “s223:” is reserved for this standard. Users who extend this standard with additional concept definitions shall use a different prefix for their concepts. The +use of different prefixes for different models allows the combination of models without ambiguity, and makes it possible to enforce a closed-world assumption +for concepts that use the "s223:" prefix, namely allowing the use of a property with a given class only if a SHACL shape has been defined for that use (see `s223:Concept`). The +closed-world assumption is a fundamental principle of semantic modeling that states that if a concept is not defined +in the model, then it is not part of the model. This principle is essential for the development of semantic models that can be used to make inferences about the +real world. Managing the use of the "s223:" prefix also makes it possible to test for strict conformance to the standard. + +The concepts and properties mentioned below were designed to aid in standard development using RDF and SHACL exclusively and avoiding any dependence on OWL axioms. +This approach was chosen to avoid some of the shortcomings of using OWL in industrial settings, such as the open world assumption, the many flavors of OWL and their +support, and the sometimes counterintuitive implications of OWL reasoning for non-ontologists. (For example, if an instance satisfies the OWL axioms for a class, then +it is inferred to be an instance of that class). The use of SHACL shapes to define constraints and inferencing rules is a more intuitive way to define intended +model behavior and to verify conformance to the standard. The two most-used OWL inferences, supporting symmetric and inverse properties, are redefined in this standard +using SHACL rules. + +""" ; +doc:subclauses ( + pub:Conform-Constraints + pub:Implicit-Info + pub:Text-Serialization + pub:Units + pub:Namespace + s223:Class + s223:Concept + s223:SymmetricProperty + s223:inverseOf + s223:abstract +) + . + +pub:Conform-Constraints +doc:title "Conformance Constraints and Validation"; +rdfs:comment """ Using RDF also provides a way to build conformance constraints into this standard in a way that enables conformance to be algorithmically +verified. This is done by using a different W3C standard, Shapes Constraints Language (SHACL) (W3C SHACL). SHACL defines a way to constrain how RDF graphs +can be constructed through the application of custom developed rules called shapes. The normative constraints described in this standard are formalized in +SHACL shapes. The description of each concept defined in this standard includes a table that lists related conformance constraints defined by these SHACL +shapes. Readily available SHACL reasoners can use the shapes defined in this standard to determine if a particular model instance violates conformance to the standard. + +When a SHACL reasoner is applied to a model, discrepancies from the conformance constraints result in a message from the reasoner with one of three levels +of severity (sh:severity). + +A message with a severity sh:Info means that a model construct is incomplete. + +A message with a severity sh:Warning means that a model construct is used in an unexpected way. + +A message with a severity sh:Violation means a model construct is invalid and does not comply with the standard. + +The concepts and properties defined in `s223:Class` through `s223:abstract` were designed to aid in standard development using RDF and SHACL exclusively and +avoiding any dependence on OWL +axioms. This approach was chosen to avoid some of the shortcomings of using OWL in industrial settings, such as the open world assumption, the many flavors +of OWL and their support, and the sometimes counterintuitive implications of OWL reasoning for non-ontologists. (For example, if an instance satisfies the +OWL axioms for a class, then it is inferred to be an instance of that class). The use of SHACL shapes to define constraints and inferencing rules is a more +intuitive way to define intended model behavior and to verify conformance to the standard. The two most-used OWL inferences, supporting symmetric and inverse + properties, are redefined in this standard using SHACL rules. + """. + +pub:Implicit-Info +doc:title "Deriving Implicit Information from Inference Rules"; +rdfs:comment """ SHACL is also used in this standard to derive implicit information via a process called inferencing. Inference rules are used to define +how new triples are generated. The triples generated from this inference process enhance the ability to make useful queries without the burden of a modeler +crafting each one. The goal is to make model development easier without sacrificing the utility application developers need to find what they are looking +for. The description of each concept defined in this standard with related inference rules includes a table that lists the relevant SHACL shapes that specify +the inferencing. """. + +pub:Text-Serialization +doc:title "Textual Serialization"; +rdfs:comment """ The Terse RDF Triple Language (W3C Turtle) defines a textual syntax to represent and exchange RDF models. +The normative content of this standard is documented in an RDF model textualized using Turtle (see Clause 15). All models conforming to this standard shall +be textualized using Turtle. +""". + +pub:Units +doc:title "Units of Measure"; +rdfs:comment """ Because this standard includes references to measurements of physical properties, it is necessary to provide a model representation of +units of measure as well as what those units are quantifying (e.g. temperature, power, etc.). This standard builds upon the “Quantities, Units, Dimensions +and Types” (QUDT) ontology which is the leading open-source model expressed in RDF/SHACL. The QUDT model is documented at https://qudt.org. The key concepts +used here are the classes qudt:Unit and qudt:QuantityKind. The 223 standard is compatible with Version 2.1.41 of QUDT and is expected to be compatible with +all newer versions as well.""". + +pub:Namespace +doc:title "Namespace"; +rdfs:comment """ Because it is anticipated that models conforming to this standard will be combined with other semantic models, it is necessary to define +a namespace for the concepts defined by this standard to avoid any possible ambiguities that might arise from a similar name used in the complementary model. + In this standard and all conforming models, the prefix “s223:” shall be used in the name of each concept (class and property) defined by this standard, + e.g., s223:Equipment. + """. + + s223:Concept + doc:subclauses( + s223:hasProperty + ). + +pub:equipment + doc:title "EQUIPMENT" ; + rdfs:comment """This clause is the top level of the hierarchical structure of the portion of the model that represents the characteristics and features of physical equipment that make up the building systems being modeled. Equipment can be connected to other Equipment or DomainSpaces (See `pub:connectedness`). Equipment can optionally contain other pieces of equipment, providing a way to represent its constituent parts within the model (see `pub:equipment-containment`). Equipment can also be grouped together to define a System (see `pub:system`). + +""" ; + doc:subclauses ( + s223:Equipment + s223:contains + s223:hasRole + s223:hasPhysicalLocation + pub:measuring-equipment + s223:Actuator + s223:Controller + ) . + +pub:measuring-equipment + doc:title "Measuring equipment" ; + rdfs:comment """This clause is the top level of the hierarchical structure of the model portion that represents the characteristics of a piece of equipment that measures something.""" ; + doc:subclauses ( + s223:AbstractSensor + s223:Sensor + s223:DifferentialSensor + ) . + +s223:AbstractSensor + doc:title "Abstract Sensor"; + doc:subclauses ( + s223:hasMeasurementResolution + s223:observes + s223:hasObservationLocation + + ) . + +s223:Sensor + doc:subclauses ( + s223:FlowSensor + s223:HumiditySensor + s223:PressureSensor + s223:TemperatureSensor + s223:ConcentrationSensor + s223:LightSensor + s223:ParticulateSensor + s223:OccupancySensor + ) . + +s223:LightSensor + doc:subclauses( + s223:CorrelatedColorTemperatureSensor + s223:DuvSensor + s223:IlluminanceSensor + ) . + +s223:OccupancySensor + doc:subclauses( + s223:OccupantCounter + s223:OccupantMotionSensor + s223:OccupantPresenceSensor + ) . + +s223:DifferentialSensor + doc:title "Differential Sensor"; + doc:subclauses( + s223:hasObservationLocationHigh + s223:hasObservationLocationLow + ). + +s223:Controller + doc:title "Controller"; + doc:subclauses( + s223:Function + s223:executes + ) . + +s223:Function + doc:title "Function"; + doc:subclauses( + s223:hasInput + s223:hasOutput + ) . + +s223:ConnectionPoint + doc:subclauses ( + s223:BidirectionalConnectionPoint + s223:InletConnectionPoint + s223:OutletConnectionPoint + s223:mapsTo + s223:hasMedium + ) . + +s223:Actuator + doc:title "Actuator" ; + rdfs:comment """Actuators are physical entities that receive control signals and actuate equipment.""" ; + doc:subclauses ( + s223:actuates + s223:actuatedByProperty + ) . + +pub:connection + doc:title "CONNECTION" ; + rdfs:comment """This clause is the top level of the hierarchical structure of the portion of the model that represents the characteristics and features of connections that provide a means for a medium such as air, water, or electricity, to flow from one place to another. Examples of connections are ducts, pipes, and wires.""" ; + doc:subclauses ( + s223:Connectable + s223:ConnectionPoint + s223:Connection + s223:Junction + pub:connectedness + s223:hasMedium + ) . +pub:connectedness +doc:title "Relations Describing Connectedness"; +rdfs:comment """The collection of relations defined for Connectable, ConnectionPoint, and Connection is intended to facilitate model queries that answer questions about how equipment is connected and to what it is connected. These relations are shown in Figure 6-3. + +![Connection Relations.](figures/Figure_6-1_Connection_Relationships.svg) + +It is not necessary for a model developer to create each of these relations individually. A model can be created using a simpler construct shown in Figure 6-4 using the cnx relation. Inference rules can then be applied to generate the complete set shown in Figure 6-3. The intent is to simplify model development without losing the connectedness relationships that facilitate model queries. + +![CNX Relations.](figures/Figure_6-2_CNX_Relationships.svg) +"""; +doc:subclauses ( + s223:connected + s223:connectedTo + s223:connectedFrom + s223:connectedThrough + s223:connectsTo + s223:connectsFrom + s223:connectsThrough + s223:connectsAt + s223:hasConnectionPoint + s223:isConnectionPointOf + s223:cnx +) +. + +s223:Connection + doc:subclauses ( + s223:Pipe + s223:Duct + s223:ElectricWire + ) . + +pub:grouping + doc:title "GROUPING" ; + rdfs:comment """This clause is the top level of the hierarchical structure of the portion of the model that represents the general concept that some modeling elements can be grouped together using several different concepts. This standard describes these concepts and constrains their use.""" ; + doc:subclauses ( + pub:equipment-containment + pub:system-membership + pub:physical-space-containment + pub:domain-space-containment + pub:zone-containment + ) . + +pub:equipment-containment + doc:title "Equipment Containment" ; + rdfs:comment """A piece of equipment can only contain other pieces of equipment. For example, a fan can be contained by an air handling unit. The relation contains is used to describe a piece of equipment containing another piece of equipment (see 's223:contains'). The relationship mapsTo relates a ConnectionPoint of a contained equipment to the ConnectionPoint of a containing equipment (see `s223:mapsTo`). For example, the inlet to a heating coil contained in a fan coil unit may map to the inlet of the fan coil unit. Any air connection to the fan coil unit inlet is supplying air to the inlet of the heating coil as well. Multiple pieces of equipment contained by the same piece of equipment may connect to each other, however, they may not connect to equipment that are not also contained. To indicate how a contained piece of equipment connects to an external piece of equipment, the relationship mapsTo is used. MapsTo will relate the connection point of a contained equipment to the connection point of the containing equipment, then the connection point of the containing equipment may connect to the external equipment.""" . + +pub:system + doc:title "SYSTEM" ; + rdfs:comment """A System is a task-oriented collection of interacting or interrelated Equipment defined by the modeler. Examples of possible systems are an air distribution system, or a hot water system. Systems can be associated with other Systems using the relation hasMember (see `pub:system-membership`) A System may be associated with an EnumerationKind-Role (see `s223:hasRole`). +""" ; + doc:subclauses ( + s223:System + s223:hasMember + s223:hasBoundaryConnectionPoint + s223:hasOptionalConnectionPoint + ) . + +pub:system-membership + doc:title "System Membership" ; + rdfs:comment """A system can group other pieces of equipment and sub-systems together using the relation hasMember (see `s223:hasMember`).""" . + +pub:zone + doc:title "ZONE" ; + rdfs:comment "Zones are collections of domain spaces of a specific domain grouped together from the perspective of building services or controls. Zones can be collected together into groups (see `pub:zone-containment`)." ; + doc:subclauses ( + s223:Zone + s223:hasDomainSpace + ) . + +pub:zone-containment + doc:title "Zone Containment" ; + rdfs:comment """ZoneGroups are collections of zones. ZonesGroups may relate to Zones using the relation hasZone (see `s223:hasZone`).""" ; + doc:subclauses ( + s223:ZoneGroup + s223:hasZone + ) . + +pub:space + doc:title "SPACE" ; + rdfs:comment "There are two types of spaces. Physical spaces represent the architectural constructs in a building like rooms, auditoriums, corridors, etc. Physical spaces enclose (see `s223:encloses`) domain spaces. Domain spaces represent portions of a physical space that pertain to different building services. A physical space may represent a kitchen, but the lighting domain space it encloses describes the lighting area within the kitchen. " ; + doc:subclauses ( + pub:domain-space + pub:physical-space + ) . + +pub:domain-space + doc:title "Domain Space" ; + rdfs:comment "A DomainSpace is a subclass of Connectable (see `s223:Connectable`) and represents atomic subdivision (or component) of a Zone and is associated with a domain such as Lighting, HVAC, etc. (see `s223:EnumerationKind-Domain`). DomainSpaces can be viewed as the endpoints of building services. A lighting domain space may be a part of an auditorium that receives light from a group of luminaires. An occupancy space may be a building area that is measured by occupancy sensors (see `s223:OccupancySensor`). An HVAC domain space may be part of an office or room that receives air from a VAV (see `s223:VAV`). An HVAC domain space may also be a significant waypoint in an air distribution system, like a plenum. Domain spaces generally have properties that pertain to control of the systems serving them (e.g., a lighting domain space may have an occupancy property for when the space is occupied). " ; + doc:subclauses ( + s223:DomainSpace + s223:hasDomain + ) . + +pub:physical-space + doc:title "Physical Space" ; + rdfs:comment "A portion of an enclosure that is distinct from other physical spaces." ; + doc:subclauses ( + s223:PhysicalSpace + s223:contains + s223:encloses + ) . + +pub:physical-space-containment + doc:title "Physical Space Containment" ; + rdfs:comment """A physical space (see `s223:PhysicalSpace`) can contain other physical spaces. This containment relationship is used to represent collections of rooms that make up a floor in a building, a building that contains a collection of rooms or floors, a campus that contains a collection of buildings or some other nested grouping of physical spaces. Physical spaces may also enclose domain spaces (see `s223:DomainSpace`). Enclosement indicates that the domain space is completely within a physical space. A physical space may enclose one or more domain spaces. For example, an auditorium may have several different lighting domain spaces with independently controlled lights.""" . + + +pub:domain-space-containment + doc:title "Domain Space Containment" ; + rdfs:comment """Physical spaces may enclose domain spaces, indicating their physical location and borders. Zones may also group domain spaces together using the relationship hasDomainSpace (see `s223:hasDomainSpace`). This grouping is from the perspective of building controls rather than physical location.""" . + +pub:property_value + doc:title "PROPERTIES AND VALUES" ; + rdfs:comment "Things have properties, and properties have values." ; + doc:subclauses ( + s223:Property + s223:ActuatableProperty + s223:ObservableProperty + s223:EnumerableProperty + s223:QuantifiableProperty + s223:QuantifiableActuatableProperty + s223:QuantifiableObservableProperty + s223:EnumeratedObservableProperty + s223:EnumeratedActuatableProperty + s223:ExternalReference + s223:hasValue + qudt:hasUnit + qudt:hasQuantityKind + s223:hasAspect + s223:ofSubstance + s223:ofMedium + s223:composedOf + s223:hasExternalReference + ) . + +s223:EnumerableProperty + doc:subclauses ( + s223:hasEnumerationKind + ) . + +s223:ExternalReference + doc:subclauses ( + s223:BACnetExternalReference + ) . + +s223:BACnetExternalReference + doc:subclauses ( + bacnet:device-name + bacnet:device-identifier + bacnet:object-name + bacnet:object-identifier + bacnet:property-identifier + bacnet:property-array-index + bacnet:priority-for-writing + ) . + +s223:Setpoint + doc:subclauses ( + s223:hasDeadband + ) . + +pub:enumerations + doc:title "ENUMERATIONS"; + rdfs:comment """Enumerations are sets of closed values (they cannot take on values outside of what is explicitly listed in the definition) and named (each value has a unique name). The values within an enumeration share a "kind," which communicates how the enumerations are intended to be used. + +The standard uses enumerations to convey groups of useful values for describing attributes of Properties, Equipment, and other things in the model. + """ ; + doc:subclauses ( + s223:EnumerationKind + s223:EnumerationKind-Aspect + s223:EnumerationKind-Binary + s223:EnumerationKind-Direction + s223:EnumerationKind-Domain + s223:EnumerationKind-HVACOperatingMode + s223:EnumerationKind-HVACOperatingStatus + s223:EnumerationKind-Numerical + s223:EnumerationKind-Occupancy + s223:EnumerationKind-OnOff + s223:EnumerationKind-Phase + s223:EnumerationKind-Position + s223:EnumerationKind-Role + s223:EnumerationKind-RunStatus + s223:EnumerationKind-Speed + s223:EnumerationKind-Substance + ) . + +s223:EnumerationKind-Phase + doc:subclauses( + s223:Phase-Gas + s223:Phase-Liquid + s223:Phase-Solid + s223:Phase-Vapor + s223:hasThermodynamicPhase + ) . + +s223:Electricity-AC + doc:subclauses ( + s223:hasNumberOfElectricalPhases + doc:electricalwiringv2-p1 + doc:electricalwiringv2-p2 + doc:electricalwiringv2-p3 + doc:electricalwiringv2-p4 + doc:electricalwiringv2-p5 + doc:electricalwiringv2-p6 + doc:electricalwiringv2-p7 + doc:electricalwiringv2-p8 + ) . + +doc:electricalwiringv2-p1 + doc:title "1-Phase 3-Wire (LLN) Delta 240V L-L" ; + rdfs:comment """ +This is an example Delta 240 V transformer. + +![Caption](figures/electricalwiringv2-p1.jpg) + +| Medium | # wires | L-L | L-N | Countries | Phase Possibilities | +|:------------------:|:-----:|:----:|:----:|:-------:|:-------------------:| +| AC-240VLL-120VLN-3PH-60Hz | 3 | 240 | 120 | US | AN, BN, AB, ABN | +| AC-240VLL-1PH-60Hz | 2 | 240 | - | US | AB | +| AC-120VLN-1PH-60Hz | 2 | - | 120 | US | AN, BN | +""" . + +doc:electricalwiringv2-p2 + doc:title "3-Phase 3-Wire (LLL) Delta 480V L-L" ; + rdfs:comment """ +This is an example Delta 480 V transformer. + +![Caption](figures/electricalwiringv2-p2.jpg) + +| Medium | # wires | L-L | L-N | Countries | Phase Possibilities | +|:------------------:|:-----:|:----:|:----:|:-------:|:-------------------:| +| AC-480VLL-3PH-60Hz | 3 | 480 | - | US | ABC, AB, BC, AC | +| AC-480VLL-1PH-60Hz | 2 | 480 | - | US | AB, BC, AC | +""" . + +doc:electricalwiringv2-p3 + doc:title "3-Phase 3-Wire (LLL) Delta 600V L-L" ; + rdfs:comment """ +This is an example Delta 600 V transformer. + +![Caption](figures/electricalwiringv2-p3.jpg) + +| Medium | # wires | L-L | L-N | Countries | Phase Possibilities | +|:------------------:|:-----:|:----:|:----:|:-------:|:-------------------:| +| AC-600VLL-3PH-60Hz | 3 | 600 | - | US | ABC, AB, BC, AC | +| AC-600VLL-1PH-60Hz | 2 | 600 | - | US | AB, BC, AC | +""" . + +doc:electricalwiringv2-p4 + doc:title "3-Phase 4-Wire (LLLN) Delta 240V L-L" ; + rdfs:comment """ +This is an example 3-Phase 4-Wire Delta 240 V transformer. + +![Caption](figures/electricalwiringv2-p4.jpg) + +| Medium | # wires | L-L | L-N | Countries | Phase Possibilities | +|:------------------:|:-----:|:----:|:----:|:-------:|:-------------------:| +| AC-240VLL-208VLN-120VLN-3PH-60Hz | 4 | 240 | 208, 120 | US | AN, BN, CN, AB, BC, AC, ABN, BCN, ACN, ABC, ABCN | +| AC-240VLL-3PH-60Hz | 3 | 240 | - | US | ABC | +| AC-240VLL-120VLN-1PH-60Hz | 3 | 240 | 120 | US | ABN, BCN, AN, BN | +| AC-240VLL-1PH-60Hz | 2 | 240 | - | US | AB, BC, AC | +| AC-120VLN-1PH-60Hz | 2 | - | 120 | US | AN, BN | +""" . + +doc:electricalwiringv2-p5 + doc:title "3-Phase 4-Wire (LLLN) Delta 480V L-L" ; + rdfs:comment """ +This is an example 3-Phase 4-Wire Delta 480 V transformer. + +![Caption](figures/electricalwiringv2-p5.jpg) + +| Medium | # wires | L-L | L-N | Countries | Phase Possibilities | +|:------------------:|:-----:|:----:|:----:|:-------:|:-------------------:| +| AC-480VLL-415VLN-240VLN-3PH-60Hz | 4 | 480 | 415, 240 | US | AN, BN, CN, AB, BC, AC, ABN, BCN, ACN, ABC, ABCN | +| AC-480VLL-3PH-60Hz | 3 | 480 | - | US | ABC | +| AC-480VLL-240VLN-1PH-60Hz | 3 | 480 | 240 | US | ABN, BCN, AN, BN | +| AC-480VLL-1PH-60Hz | 2 | 480 | - | US | AB, BC, AC | +| AC-240VLN-1PH-60Hz | 2 | - | 240 | US | AN, BN | +""" . + +doc:electricalwiringv2-p6 + doc:title "3-Phase 4-Wire (LLLN) Wye 208V L-L" ; + rdfs:comment """ +This is an example 3-Phase 4-Wire Wye 208 V transformer. + +![Caption](figures/electricalwiringv2-p6.jpg) + +| Medium | # wires | L-L | L-N | Countries | Phase Possibilities | +|:------------------:|:-----:|:----:|:----:|:-------:|:-------------------:| +| AC-208VLL-120VLN-3PH-60Hz | 4 | 208 | 120 | US | AN, BN, CN, AB, BC, AC, ABN, BCN, ACN, ABC, ABCN | +| AC-208VLL-3PH-60Hz | 3 | 208 | - | US | ABC | +| AC-208VLL-120VLN-1PH-60Hz | 3 | 208 | 120 | US | ABN, BCN, ACN | +| AC-208VLL-1PH-60Hz | 2 | 208 | - | US | AB, BC, AC | +| AC-120VLN-1PH-60Hz | 2 | - | 120 | US | AN, BN, CN | +""" . + +doc:electricalwiringv2-p7 + doc:title "2-Phase 4-Wire (LLLN) Wye 415V L-L" ; + rdfs:comment """ +This is an example 2-Phase 4-Wire Wye 415 V transformer. + +![Caption](figures/electricalwiringv2-p7.jpg) + +| Medium | # wires | L-L | L-N | Countries | Phase Possibilities | +|:------------------:|:-----:|:----:|:----:|:-------:|:-------------------:| +| AC-415VLL-240VLN-3PH-60Hz| 4 | 415 | 240 | ASTL | AN, BN, CN, AB, BC, AC, ABN, BCN, ACN, ABC, ABCN | +| AC-415VLL-3PH-60Hz | 3 | 415 | - | ASTL | ABC | +| AC-415VLL-240VLN-1PH-60Hz | 3 | 415 | 240 | ASTL | ABN, BCN, ACN | +| AC-415VLL-1PH-60Hz | 2 | 415 | - | ASTL | AB, BC, AC | +| AC-240VLN-1PH-60Hz | 2 | - | 240 | ASTL | AN, BN, CN | +""" . + +doc:electricalwiringv2-p8 + doc:title "2-Phase 4-Wire (LLLN) Wye 480V L-L" ; + rdfs:comment """ +This is an example 2-Phase 4-Wire Wye 480 V transformer. + +![Caption](figures/electricalwiringv2-p8.jpg) + +| Medium | # wires | L-L | L-N | Countries | Phase Possibilities | +|:------------------:|:-----:|:----:|:----:|:-------:|:-------------------:| +| AC-480VLL-277VLN-3PH-60Hz | 4 | 480 | 27 | US | AN, BN, CN, AB, BC, AC, ABN, BCN, ACN, ABC, ABCN | +| AC-480VLL-3PH-60Hz | 3 | 480 | - | US | ABC | +| AC-480VLL-277VLN-1PH-60Hz | 3 | 480 | 277 | US | ABN, BCN, ACN | +| AC-480VLL-1PH-60Hz | 2 | 480 | - | US | AB, BC, AC | +| AC-277VLN-1PH-60Hz | 2 | - | 277 | US | AN, BN, CN | +""" . + + +pub:reference-equipment-models +doc:title "REFERENCE FOR EQUIPMENT AND SYSTEMS"; +rdfs:comment """ This clause contains component model templates for commonly found equipment in building."""; +doc:subclauses ( +s223:AirHandlingUnit +s223:Battery +s223:Boiler +s223:ChilledBeam +s223:Chiller +s223:Compressor +s223:CoolingTower +s223:Damper +s223:Door +s223:ElectricBreaker +s223:ElectricMeter +s223:ElectricOutlet +s223:ElectricTransformer +s223:EthernetSwitch +s223:Fan +s223:FanCoilUnit +s223:Filter +s223:FumeHood +s223:Furnace +s223:Generator +s223:HeatExchanger +s223:HeatPump +s223:Humidifier +s223:Humidistat +s223:Inverter +s223:Motor +s223:Luminaire +s223:PhotovoltaicModule +s223:Pump +s223:RadiantHeater +s223:Radiator +s223:ElectricResistanceElement +s223:SolarThermalCollector +s223:TerminalUnit +s223:Thermostat +s223:Turbine +s223:Valve +s223:VariableFrequencyDrive +s223:Window +s223:WindowShade +) +. +s223:Valve +doc:subclauses ( + s223:ThreeWayValve + s223:TwoWayValve + ). + + +s223:HeatExchanger +doc:subclauses( + s223:Coil + s223:CoolingCoil + s223:HeatingCoil +). + +s223:TerminalUnit +doc:subclauses( +s223:DualDuctTerminal +s223:FanPoweredTerminal +s223:SingleDuctTerminal +). + + +pub:AnnexA +doc:title "RDF REPRESENTATION OF THIS STANDARD (NORMATIVE)"; +rdfs:comment """This text of this standard was generated from and RDF Model. An electronic repository containing a normative Turtle representation of the can be found at (URL needed). A user may wish to use electronic tools to browse and study the details of the standard, use the equipment types defined in the standard to build a building-specific information model, apply the SHACL constraints to test a building specific model for conformance to the standard, or other uses. + +""" . + +pub:AnnexB +doc:title "INFORMATIVE ANNEX: G36 EXTENSION"; +rdfs:comment """This extension uses the concepts defined in the 223 standard to model the ASHRAE Guideline 36 air-side equipment (ASHRAE, 2018), +including classes representing the point lists in Section 4 and example model snippets of the control diagrams shown in Appendix A. +The classes represent the point lists in Section 4 using validation rules that can ensure that a model has the metadata necessary to support Guideline 36 sequences. +These classes can be used to create models of Guideline 36 compliant stystems or validate existing models. +Additionally, this section includes example model snippets of the control diagrams shown in Informative Appendix A of Guideline 36. (Will that be here?) +These example models serve as references for use of the standard and this extension. + +""" ; +doc:subclauses( + doc:VAV_4-1 + doc:VAV_4-2 + doc:FPTU_4-3 + doc:DDTU_4-4 + doc:DDTU_4-5 + doc:MZ-VAV-AHU_4-6 + doc:DD-AHU_4-7 + doc:SZ-VAV-AHU_4-8 + doc:g36components +) +. + +doc:VAV_4-1 + doc:title "VAV Terminal Unit - Cooling Only"; + rdfs:comment "This section describes the classes and example model of the VAV Terminal Unit - Cooling Only described in Section 4.1 and Appendix A, Figure A-1 (cite)"; + doc:subclauses( + g36:VAVTerminalCoolingOnly + g36:VAVTerminalCoolingOnlyAnnotation + ) +. + +doc:VAV_4-2 + doc:title "VAV Terminal Unit with Reheat"; + rdfs:comment "This section describes the classes and example model of the VAV Terminal Unit with Reheat described in Section 4.2 and Appendix A, Figure A-2 (cite)"; + doc:subclauses( + g36:VAVTerminalWithReheat + g36:VAVTerminalWithReheatAnnotation + ) +. +doc:FPTU_4-3 + doc:title "Fan Powered Terminal Unit"; + rdfs:comment "This section describes the classes and example model of the Fan Powered Terminal Unit (Series or Parallel, Constant or Variable Speed Fan) described in Section 4.3 and Appendix A, Figures A-3 and A-4 (cite)"; + doc:subclass ( + g36:FanPoweredTerminal + g36:FanPoweredTerminalAnnotation + ) +. +doc:DDTU_4-4 + doc:title "Dual Duct Terminal Unit with Inlet Sensors"; + rdfs:comment "This section describes the classes and example model of the Dual Duct Terminal Unit with Inlet Sensors described in Section 4.4 and Appendix A, Figure A-7(cite)"; + doc:subclass ( + g36:DualDuctTerminalWithInletSensors + g36:DualDuctTerminalWithInletSensorsAnnotation + ) +. +doc:DDTU_4-5 + doc:title "Dual Duct Terminal Unit with Discharge Sensor"; + rdfs:comment "This section describes the classes and example model of the Dual Duct Terminal Unit with Discharge Sensor described in Section 4.5 and Appendix A, Figure A-8(cite)"; + doc:subclass ( + g36:DualDuctTerminalWithDischargeSensor + g36:DualDuctTerminalWithDischargeSensorAnnotation + ) +. +doc:MZ-VAV-AHU_4-6 + doc:title "Multiple Zone VAV Air Handling Unit"; + rdfs:comment "This section describes the classes and example model of the Multiple Zone VAV Air Handling Unit described in Section 4.6 and Appendix A, Figures A-9 and A-10 (cite)"; + doc:subclauses( + g36:MultipleZoneVAVAirHandlingUnit + g36:MultipleZoneVAVAirHandlingUnitAnnotation + g36:MultipleZoneVAVAirHandlingUnit-CommonDamper + g36:MultipleZoneVAVAirHandlingUnit-CommonDamperAnnotation + g36:MultipleZoneVAVAirHandlingUnit-OADandDP + g36:MultipleZoneVAVAirHandlingUnit-OADandDPAnnotation + g36:MultipleZoneVAVAirHandlingUnit-OADandAFMS + g36:MultipleZoneVAVAirHandlingUnit-OADandAFMSAnnotation + g36:MultipleZoneVAVAirHandlingUnit-WithReliefDamper + g36:MultipleZoneVAVAirHandlingUnit-WithReliefDamperAnnotation + g36:MultipleZoneVAVAirHandlingUnit-OADandAFMS + g36:MultipleZoneVAVAirHandlingUnit-OADandAFMSAnnotation + g36:MultipleZoneVAVAirHandlingUnit-WithReliefDamper + g36:MultipleZoneVAVAirHandlingUnit-WithReliefDamperAnnotation +) +. + +doc:DD-AHU_4-7 + doc:title "Dual Fan Dual Duct Air Handling Unit"; + rdfs:comment "This section describes the classes and example model of the Dual Fan Dual Duct Air Handling Unit described in Section 4.7 and Appendix A, Figure A-11 (cite)"; + doc:subclauses( + g36:DualFanDualDuctAirHandlingUnit + g36:DualFanDualDuctAirHandlingUnitAnnotation + ) +. + +doc:SZ-VAV-AHU_4-8 + doc:title "Single Zone VAV Air Handling Unit"; + rdfs:comment "This section describes the classes and example model of the Single Zone VAV Air Handling Unit described in Section 4.8 and Appendix A, Figure A-12 (cite)"; + doc:subclauses( + g36:SingleZoneVAVAirHandlingUnit + g36:SingleZoneVAVAirHandlingUnitAnnotation + g36:SingleZoneVAVAirHandlingUnit-NoReliefFan + g36:SingleZoneVAVAirHandlingUnit-NoReliefFanAnnotation + g36:SingleZoneVAVAirHandlingUnit-WithReliefFan + g36:SingleZoneVAVAirHandlingUnit-WithReliefFanAnnotation + g36:SingleZoneVAVAirHandlingUnit-WithReturnFan + g36:SingleZoneVAVAirHandlingUnit-WithReturnFanAnnotation +) +. +doc:g36components + doc:title "Model Components" ; + rdfs:comment "This section describes the classes representing common components used in each of the Guildine 36 example models and classes." ; + doc:subclauses( + g36:Damper + g36:DamperAnnotation + g36:TwoPositionDamper + g36:TwoPositionDamperAnnotation + g36:HotWaterCoil + g36:HotWaterCoilAnnotation + g36:ElectricHeatingCoil + g36:ElectricHeatingCoilAnnotation + g36:HotWaterValve + g36:HotWaterValveAnnotation + g36:ChilledWaterCoil + g36:ChilledWaterCoilAnnotation + g36:ChilledWaterValve + g36:ChilledWaterValveAnnotation + g36:Zone + g36:ZoneAnnotation + g36:ZoneGroup + g36:ZoneGroupAnnotation + g36:Fan + g36:FanAnnotation + g36:FanWithVFD + g36:FanWithVFDAnnotation + ) +.