From 742e7aebccbb969760f6b0d06cd518af7475ac24 Mon Sep 17 00:00:00 2001 From: Gabe Fierro Date: Thu, 30 Nov 2023 13:34:47 -0700 Subject: [PATCH] update 223 --- libraries/ashrae/223p/ontology/223p.ttl | 5322 +++++++++++++++-------- 1 file changed, 3625 insertions(+), 1697 deletions(-) diff --git a/libraries/ashrae/223p/ontology/223p.ttl b/libraries/ashrae/223p/ontology/223p.ttl index d8f2cff27..a990cdd25 100644 --- a/libraries/ashrae/223p/ontology/223p.ttl +++ b/libraries/ashrae/223p/ontology/223p.ttl @@ -1,124 +1,862 @@ -@prefix g36: . +@prefix bacnet: . @prefix owl: . -@prefix quantitykind: . @prefix qudt: . +@prefix qudtqk: . @prefix rdf: . @prefix rdfs: . -@prefix ref: . @prefix s223: . @prefix sh: . -@prefix sp: . -@prefix spin: . -@prefix spl: . +@prefix unit: . @prefix xsd: . s223:Class a rdfs:Class, sh:NodeShape ; rdfs:label "Class" ; - rdfs:subClassOf rdfs:Class ; - sh:property [ rdfs:comment "This Class must have a label" ; - sh:path rdfs:label ; - sh:sparql [ a sh:SPARQLConstraint ; - sh:message "{$this} must have an rdfs:label" ; - sh:prefixes s223: ; - sh:select """ -SELECT $this -WHERE { -FILTER (NOT EXISTS {$this rdfs:label ?something}) . -} -""" ] ] . - -s223:AC-100V-50Hz a s223:Electricity-AC ; - rdfs:label "Electricity-100V-50Hz" . - -s223:AC-120V-240V-60Hz a s223:Electricity-AC ; - rdfs:label "Electricity-120V-240V-60Hz" . - -s223:AC-120V-60Hz a s223:Electricity-AC ; - rdfs:label "Electricity-120V-60Hz" . - -s223:AC-200V-50Hz a s223:Electricity-AC ; - rdfs:label "Electricity-200V-50Hz" . - -s223:AC-208V-60Hz a s223:Electricity-AC ; - rdfs:label "Electricity-208V-60Hz" . - -s223:AC-220V-50Hz a s223:Electricity-AC ; - rdfs:label "Electricity-220V-50Hz" . - -s223:AC-230V-50Hz a s223:Electricity-AC ; - rdfs:label "Electricity-230V-50Hz" . + rdfs:comment "This is a modeling construct. All classes defined in the 223 standard are instances of s223:Class rather than owl:Class." ; + rdfs:subClassOf rdfs:Class . -s223:AC-240V-50Hz a s223:Electricity-AC ; - rdfs:label "Electricity-240V-50Hz" . - -s223:AC-240V-60Hz a s223:Electricity-AC ; - rdfs:label "Electricity-240V-60Hz" . - -s223:AC-24V-60Hz a s223:Electricity-AC ; - rdfs:label "Electricity-24V-60Hz" . - -s223:AC-277V-60Hz a s223:Electricity-AC ; - rdfs:label "Electricity-277V-60Hz" . - -s223:AC-347V-60Hz a s223:Electricity-AC ; - rdfs:label "Electricity-347V-60Hz" . - -s223:AC-380V-50Hz a s223:Electricity-AC ; - rdfs:label "Electricity-380V-50Hz" . - -s223:AC-400V-50Hz a s223:Electricity-AC ; - rdfs:label "Electricity-400V-50Hz" . - -s223:AC-415V-50Hz a s223:Electricity-AC ; - rdfs:label "Electricity-415V-50Hz" . - -s223:AC-480V-60Hz a s223:Electricity-AC ; - rdfs:label "Electricity-480V-60Hz" . +s223:SymmetricProperty a rdfs:Class, + sh:NodeShape ; + rdfs:label "Symmetric property" ; + rdfs:comment "A SymmetricProperty is modeling construct used to define symmetric behavior for certain properties in the standard such as cnx and connected." ; + rdfs:subClassOf rdf:Property . -s223:AC-575V-60Hz a s223:Electricity-AC ; - rdfs:label "Electricity-575V-60Hz" . +s223:12V-12V-Neg a s223:DC-12V ; + rdfs:label "12V-Neg" ; + s223:hasVoltage s223:DCNegativeVoltage-12.0V, + s223:DCVoltage-DCZeroVoltage . + +s223:12V-12V-Pos a s223:DC-12V ; + rdfs:label "12V-Pos" ; + s223:hasVoltage s223:DCPositiveVoltage-12.0V, + s223:DCVoltage-DCZeroVoltage . + +s223:12V-6V-Neg-6V-Pos a s223:DC-12V ; + rdfs:label "6V-Neg-6V-Pos" ; + s223:hasVoltage s223:DCNegativeVoltage-6.0V, + s223:DCPositiveVoltage-6.0V . + +s223:24V-12V-Neg-12V-Pos a s223:DC-24V ; + rdfs:label "12V-Neg-12V-Pos" ; + s223:hasVoltage s223:DCNegativeVoltage-12.0V, + s223:DCPositiveVoltage-12.0V . + +s223:24V-24V-Neg a s223:DC-24V ; + rdfs:label "24V-Neg" ; + s223:hasVoltage s223:DCNegativeVoltage-24.0V, + s223:DCVoltage-DCZeroVoltage . + +s223:24V-24V-Pos a s223:DC-24V ; + rdfs:label "24V-Pos" ; + s223:hasVoltage s223:DCPositiveVoltage-24.0V, + s223:DCVoltage-DCZeroVoltage . + +s223:380V-190V-Neg-190V-Pos a s223:DC-380V ; + rdfs:label "190V-Neg-190V-Pos" ; + s223:hasVoltage s223:DCNegativeVoltage-190.0V, + s223:DCPositiveVoltage-190.0V . + +s223:380V-380V-Neg a s223:DC-380V ; + rdfs:label "380V-Neg" ; + s223:hasVoltage s223:DCNegativeVoltage-380.0V, + s223:DCVoltage-DCZeroVoltage . + +s223:380V-380V-Pos a s223:DC-380V ; + rdfs:label "380V-Pos" ; + s223:hasVoltage s223:DCPositiveVoltage-380.0V, + s223:DCVoltage-DCZeroVoltage . + +s223:48V-24V-Neg-24V-Pos a s223:DC-48V ; + rdfs:label "24V-Neg-24V-Pos" ; + s223:hasVoltage s223:DCNegativeVoltage-24.0V, + s223:DCPositiveVoltage-24.0V . + +s223:48V-48V-Neg a s223:DC-48V ; + rdfs:label "48V-Neg" ; + s223:hasVoltage s223:DCNegativeVoltage-48.0V, + s223:DCVoltage-DCZeroVoltage . + +s223:48V-48V-Pos a s223:DC-48V ; + rdfs:label "48V-Pos" ; + s223:hasVoltage s223:DCPositiveVoltage-48.0V, + s223:DCVoltage-DCZeroVoltage . + +s223:5V-2.5V-Neg-2.5V-Pos a s223:DC-5V ; + rdfs:label "2.5V-Neg-2.5V-Pos" ; + s223:hasVoltage s223:DCNegativeVoltage-2.5V, + s223:DCPositiveVoltage-2.5V . + +s223:5V-5V-Neg a s223:DC-5V ; + rdfs:label "5V-Neg" ; + s223:hasVoltage s223:DCNegativeVoltage-5.0V, + s223:DCVoltage-DCZeroVoltage . + +s223:5V-5V-Pos a s223:DC-5V ; + rdfs:label "5V-Pos" ; + s223:hasVoltage s223:DCPositiveVoltage-5.0V, + s223:DCVoltage-DCZeroVoltage . + +s223:6V-3V-Neg-3V-Pos a s223:DC-6V ; + rdfs:label "3V-Neg-3V-Pos" ; + s223:hasVoltage s223:DCNegativeVoltage-3.0V, + s223:DCPositiveVoltage-3.0V . + +s223:6V-6V-Neg a s223:DC-6V ; + rdfs:label "6V-Neg" ; + s223:hasVoltage s223:DCNegativeVoltage-6.0V, + s223:DCVoltage-DCZeroVoltage . + +s223:6V-6V-Pos a s223:DC-6V ; + rdfs:label "6V-Pos" ; + s223:hasVoltage s223:DCPositiveVoltage-6.0V, + s223:DCVoltage-DCZeroVoltage . + +s223:AC-10000VLL-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-10000VLL-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-10000V . + +s223:AC-10000VLL-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-10000VLL-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-10000V . + +s223:AC-10000VLL-5770VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-10000VLL-5770VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-10000V, + s223:LineNeutralVoltage-5770V . + +s223:AC-10000VLL-5770VLN-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-10000VLL-5770VLN-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-10000V, + s223:LineNeutralVoltage-5770V . + +s223:AC-110VLN-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-110VLN-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-110V . + +s223:AC-120VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-120VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-120V . + +s223:AC-127VLN-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-127VLN-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-127V . + +s223:AC-139VLN-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-139VLN-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-139V . + +s223:AC-1730VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-1730VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-1730V . + +s223:AC-1900VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-1900VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-1900V . + +s223:AC-190VLL-110VLN-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-190VLL-110VLN-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-190V, + s223:LineNeutralVoltage-110V . + +s223:AC-190VLL-110VLN-3Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-190VLL-110VLN-3Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-190V, + s223:LineNeutralVoltage-110V . + +s223:AC-190VLL-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-190VLL-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-190V . + +s223:AC-190VLL-3Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-190VLL-3Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-190V . + +s223:AC-208VLL-120VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-208VLL-120VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-208V, + s223:LineNeutralVoltage-120V . + +s223:AC-208VLL-120VLN-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-208VLL-120VLN-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-208V, + s223:LineNeutralVoltage-120V . + +s223:AC-208VLL-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-208VLL-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-208V . + +s223:AC-208VLL-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-208VLL-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-208V . + +s223:AC-219VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-219VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-219V . + +s223:AC-220VLL-127VLN-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-220VLL-127VLN-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-220V, + s223:LineNeutralVoltage-127V . + +s223:AC-220VLL-127VLN-3Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-220VLL-127VLN-3Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-220V, + s223:LineNeutralVoltage-127V . + +s223:AC-220VLL-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-220VLL-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-220V . + +s223:AC-220VLL-3Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-220VLL-3Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-220V . + +s223:AC-231VLN-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-231VLN-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-231V . + +s223:AC-2400VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-2400VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-2400V . + +s223:AC-240VLL-120VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-240VLL-120VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-240V, + s223:LineNeutralVoltage-120V . + +s223:AC-240VLL-139VLN-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-240VLL-139VLN-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-240V, + s223:LineNeutralVoltage-139V . + +s223:AC-240VLL-139VLN-3Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-240VLL-139VLN-3Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-240V, + s223:LineNeutralVoltage-139V . + +s223:AC-240VLL-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-240VLL-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-240V . + +s223:AC-240VLL-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-240VLL-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-240V . + +s223:AC-240VLL-208VLN-120VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-240VLL-208VLN-120VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-240V, + s223:LineNeutralVoltage-120V, + s223:LineNeutralVoltage-208V . + +s223:AC-240VLL-208VLN-120VLN-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-240VLL-208VLN-120VLN-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-240V, + s223:LineNeutralVoltage-120V, + s223:LineNeutralVoltage-208V . + +s223:AC-240VLL-3Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-240VLL-3Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-240V . + +s223:AC-240VLL-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-240VLL-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-240V . + +s223:AC-240VLN-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-240VLN-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-240V . + +s223:AC-24VLN-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-24VLN-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-24V . + +s223:AC-24VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-24VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-24V . + +s223:AC-277VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-277VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-277V . + +s223:AC-3000VLL-1730VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-3000VLL-1730VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-3000V, + s223:LineNeutralVoltage-1730V . + +s223:AC-3000VLL-1730VLN-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-3000VLL-1730VLN-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-3000V, + s223:LineNeutralVoltage-1730V . + +s223:AC-3000VLL-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-3000VLL-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-3000V . + +s223:AC-3000VLL-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-3000VLL-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-3000V . + +s223:AC-3300VLL-1900VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-3300VLL-1900VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-3300V, + s223:LineNeutralVoltage-1900V . + +s223:AC-3300VLL-1900VLN-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-3300VLL-1900VLN-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-3300V, + s223:LineNeutralVoltage-1900V . + +s223:AC-3300VLL-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-3300VLL-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-3300V . + +s223:AC-3300VLL-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-3300VLL-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-3300V . + +s223:AC-3460VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-3460VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-3460V . + +s223:AC-347VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-347VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-347V . + +s223:AC-380VLL-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-380VLL-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-380V . + +s223:AC-380VLL-219VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-380VLL-219VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-380V, + s223:LineNeutralVoltage-219V . + +s223:AC-380VLL-219VLN-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-380VLL-219VLN-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-380V, + s223:LineNeutralVoltage-219V . + +s223:AC-380VLL-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-380VLL-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-380V . + +s223:AC-3810VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-3810VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-3810V . + +s223:AC-400VLL-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-400VLL-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-400V . + +s223:AC-400VLL-231VLN-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-400VLL-231VLN-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-400V, + s223:LineNeutralVoltage-231V . + +s223:AC-400VLL-231VLN-3Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-400VLL-231VLN-3Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-400V, + s223:LineNeutralVoltage-231V . + +s223:AC-400VLL-3Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-400VLL-3Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-400V . + +s223:AC-415VLL-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-415VLL-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-415V . + +s223:AC-415VLL-240VLN-1Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-415VLL-240VLN-1Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-415V, + s223:LineNeutralVoltage-240V . + +s223:AC-415VLL-240VLN-3Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-415VLL-240VLN-3Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-415V, + s223:LineNeutralVoltage-240V . + +s223:AC-415VLL-3Ph-50Hz a s223:Electricity-AC ; + rdfs:label "AC-415VLL-3Ph-50Hz" ; + s223:hasFrequency s223:Frequency-50Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-415V . + +s223:AC-4160VLL-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-4160VLL-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-4160V . + +s223:AC-4160VLL-2400VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-4160VLL-2400VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-4160V, + s223:LineNeutralVoltage-2400V . + +s223:AC-4160VLL-2400VLN-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-4160VLL-2400VLN-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-4160V, + s223:LineNeutralVoltage-2400V . + +s223:AC-4160VLL-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-4160VLL-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-4160V . + +s223:AC-480VLL-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-480VLL-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-480V . + +s223:AC-480VLL-277VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-480VLL-277VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-480V, + s223:LineNeutralVoltage-277V . + +s223:AC-480VLL-277VLN-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-480VLL-277VLN-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-480V, + s223:LineNeutralVoltage-277V . + +s223:AC-480VLL-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-480VLL-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-480V . + +s223:AC-5770VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-5770VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineNeutralVoltage-5770V . + +s223:AC-6000VLL-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-6000VLL-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-6000V . + +s223:AC-6000VLL-3460VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-6000VLL-3460VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-6000V, + s223:LineNeutralVoltage-3460V . + +s223:AC-6000VLL-3460VLN-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-6000VLL-3460VLN-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-6000V, + s223:LineNeutralVoltage-3460V . + +s223:AC-6000VLL-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-6000VLL-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-6000V . + +s223:AC-600VLL-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-600VLL-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-600V . + +s223:AC-600VLL-347VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-600VLL-347VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-600V, + s223:LineNeutralVoltage-347V . + +s223:AC-600VLL-347VLN-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-600VLL-347VLN-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-600V, + s223:LineNeutralVoltage-347V . + +s223:AC-600VLL-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-600VLL-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-600V . + +s223:AC-6600VLL-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-6600VLL-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-6600V . + +s223:AC-6600VLL-3810VLN-1Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-6600VLL-3810VLN-1Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ; + s223:hasVoltage s223:LineLineVoltage-6600V, + s223:LineNeutralVoltage-3810V . + +s223:AC-6600VLL-3810VLN-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-6600VLL-3810VLN-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-6600V, + s223:LineNeutralVoltage-3810V . + +s223:AC-6600VLL-3Ph-60Hz a s223:Electricity-AC ; + rdfs:label "AC-6600VLL-3Ph-60Hz" ; + s223:hasFrequency s223:Frequency-60Hz ; + s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ; + s223:hasVoltage s223:LineLineVoltage-6600V . s223:Actuator a s223:Class, sh:NodeShape ; rdfs:label "Actuator" ; + rdfs:comment "A piece of equipment, either electrically, pneumatically, or hydraulically operated, that makes a change in the physical world, such as the position of a valve or damper." ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "An instance of Actuator must be associated with any number of actuatable property instances using the relation 'commanded by Property'." ; + sh:property [ rdfs:comment "If the relation actuates is present it must associate the Actuator with a Equipment." ; + sh:class s223:Equipment ; + sh:path s223:actuates ], + [ rdfs:comment "An Actuator must be associated with at least one ActuatableProperty using the relation commandedByProperty." ; sh:class s223:ActuatableProperty ; sh:minCount 1 ; - sh:path s223:commandedByProperty ], - [ sh:class s223:Equipment ; - sh:path s223:actuates ] . + sh:path s223:commandedByProperty ] . s223:AirHandlingUnit a s223:Class, sh:NodeShape ; - rdfs:label "AHU" ; + rdfs:label "Air handling unit" ; + rdfs:comment "An assembly consisting of sections containing a fan or fans and other necessary equipment to perform one or more of the following functions: circulating, filtration, heating, cooling, heat recovery, humidifying, dehumidifying, and mixing of air. It is usually connected to an air-distribution system." ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "An AirHandlingUnit must provide service using Air." ; - sh:minCount 2 ; + sh:property [ rdfs:comment "An AirHandlingUnit shall have at least one inlet using the medium Air." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "An AirHandlingUnit must provide service using Air." ; + [ rdfs:comment "An AirHandlingUnit shall have at least one outlet using the medium Air." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Air ; sh:path s223:hasMedium ] ] ] ] . +s223:Aspect-Alarm a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Alarm" . + +s223:Aspect-CatalogNumber a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-CatalogNumber" ; + rdfs:comment "The value of the associated Property identifies the catalog number." . + +s223:Aspect-Command a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Command" . + +s223:Aspect-Deadband a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Deadband" . + +s223:Aspect-Delta a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Delta" ; + rdfs:comment "Used to signify the associated Property has a delta (difference) value." . + +s223:Aspect-DryBulb a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-DryBulb" ; + rdfs:comment "The associated Property is a DryBulb temperature." . + +s223:Aspect-Efficiency a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Efficiency" ; + rdfs:comment "The efficiency of something characterized by a dimensionless value of this Property." . + +s223:Aspect-Face a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Face" ; + rdfs:comment "The value of the associated Property identifies a property related to a face, e.g. Coil Face Velocity." . + +s223:Aspect-Fault a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Fault" . + +s223:Aspect-HighLimit a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-High limit" . + +s223:Aspect-Latent a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Latent" ; + rdfs:comment "The latent value of something characterized by this Property." . + +s223:Aspect-Loss a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Loss" ; + rdfs:comment "The magnitude of loss of something characterized by this Property." . + +s223:Aspect-LowLimit a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Low limit" . + +s223:Aspect-Manufacturer a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Manufacturer" ; + rdfs:comment "The value of the associated Property identifies the manufacturer." . + +s223:Aspect-Maximum a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Maximum" ; + rdfs:comment "The maximum allowable level of something characterized by this Property." . + +s223:Aspect-Minimum a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Minimum" ; + rdfs:comment "The minimum allowable level of something characterized by this Property." . + +s223:Aspect-Model a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Model" ; + rdfs:comment "The value of the associated Property identifies the model." . + +s223:Aspect-Nominal a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Nominal" ; + rdfs:comment "The nominal level of something characterized by this Property." . + +s223:Aspect-NominalFrequency a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Nominal Frequency" ; + rdfs:comment "The value of the associated Property identifies the nominal frequency of the medium" . + +s223:Aspect-PhaseAngle a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Phase angle" . + +s223:Aspect-PowerFactor a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-PowerFactor" ; + rdfs:comment "The power factor of something characterized by a dimensionless value of this Property." . + +s223:Aspect-Rated a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Rated" ; + rdfs:comment "The rated value of something characterized by this Property." . + +s223:Aspect-Sensible a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Sensible" ; + rdfs:comment "The sensible value of something characterized by this Property." . + +s223:Aspect-SerialNumber a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-SerialNumber" ; + rdfs:comment "The value of the associated Property identifies the serial number." . + +s223:Aspect-ServiceFactor a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-ServiceFactor" ; + rdfs:comment "The service factor of something characterized by a dimensionless value of this Property." . + +s223:Aspect-Setpoint a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Setpoint" . + +s223:Aspect-StandardConditions a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-StandardConditions" ; + rdfs:comment "Indicates the Property applies under standard conditions (such as standard temperature and pressure)." . + +s223:Aspect-Standby a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Standby" ; + rdfs:comment "The standby value of something characterized by this Property." . + +s223:Aspect-Startup a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Startup" ; + rdfs:comment "The startup value of something characterized by this Property." . + +s223:Aspect-Threshold a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Threshold" ; + rdfs:comment "The threshold value of something characterized by this Property." . + +s223:Aspect-Total a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Total" ; + rdfs:comment "The total amount of something characterized by this Property." . + +s223:Aspect-WetBulb a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-WetBulb" ; + rdfs:comment "The associated Property is a WetBulb temperature." . + +s223:Aspect-Year a s223:EnumerationKind-Aspect ; + rdfs:label "Aspect-Year" ; + rdfs:comment "The value of the associated Property identifies the year of manufacture." . + +s223:BACnetExternalReference a s223:Class, + sh:NodeShape ; + rdfs:label "BACnetExternalReference" ; + rdfs:comment "BACnetExternalReference is a subclass of ExternalReference that contains BACnet protocol parameter values necessary to associate a property with a value." ; + 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." ; + sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:path bacnet:device-identifier ; + sh:pattern "^[A-Za-z0-9-]+,[1-9][0-9]*$" ], + [ 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." ; + sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:path bacnet:device-name ], + [ 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." ; + sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:path bacnet:object-identifier ; + sh:pattern "^[A-Za-z0-9-]+,[1-9][0-9]*$" ], + [ 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." ; + sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:path bacnet:object-name ], + [ a sh:PropertyShape ; + rdfs:comment "If the relation priority-for-writing is present it provides the priority for writing values to the object." ; + sh:datatype xsd:nonNegativeInteger ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:path bacnet:priority-for-writing ], + [ 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." ; + sh:datatype xsd:nonNegativeInteger ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:path bacnet:property-array-index ], + [ 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." ; + sh:datatype xsd:string ; + sh:maxCount 1 ; + sh:minCount 0 ; + sh:path bacnet:property-identifier ] . + s223:Battery a s223:Class, sh:NodeShape ; rdfs:label "Battery" ; + rdfs:comment "A container consisting of one or more cells, in which chemical energy is converted into electricity and used as a source of power." ; rdfs:subClassOf s223:Equipment ; - sh:or ( [ sh:property [ rdfs:comment "A Battery may provide Electricity, or both provide and receive Electricity." ; + sh:or ( [ sh:property [ rdfs:comment "A Battery shall have at least one outlet or bidirectional ConnectionPoint using the medium Electricity." ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Electricity ; - sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "A Battery may provide Electricity, or both provide and receive Electricity." ; + sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "A Battery shall have at least one outlet or bidirectional ConnectionPoint using the medium Electricity." ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; @@ -138,16 +876,17 @@ s223:Binary-Unknown a s223:EnumerationKind-Binary ; s223:Boiler a s223:Class, sh:NodeShape ; rdfs:label "Boiler" ; + 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." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A Boiler must provide service using Water." ; + sh:property [ rdfs:comment "A Boiler shall have at least one inlet using the medium Water." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Water ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Boiler must provide service using Water." ; + [ rdfs:comment "A Boiler shall have at least one outlet using the medium Water." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; @@ -156,58 +895,87 @@ s223:Boiler a s223:Class, s223:ChilledBeam a s223:Class, sh:NodeShape ; - rdfs:label "Chilled Beam" ; + rdfs:label "Chilled beam" ; + rdfs:comment "A structure with a colder surface temperature where air passes through, and air movement is induced in the room to achieve cooling. Cooling medium is generally water." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A ChilledBeam must be associated with the Role-Cooling by hasRole" ; + sh:property [ rdfs:comment "A ChilledBeam shall have at least one inlet using the medium Water." ; sh:minCount 1 ; - sh:path s223:hasRole ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Role-Cooling ] ], - [ rdfs:comment "A ChilledBeam must provide service using Water." ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Water ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A ChilledBeam must provide service using Water." ; + [ rdfs:comment "A ChilledBeam shall have at least one outlet using the medium Water." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Water ; - sh:path s223:hasMedium ] ] ] ] . + sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "A ChilledBeam must be associated with the Role-Cooling using the relation hasRole" ; + sh:minCount 1 ; + sh:path s223:hasRole ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Role-Cooling ] ] . s223:Chiller a s223:Class, sh:NodeShape ; rdfs:label "Chiller" ; + rdfs:comment "A refrigerating machine used to transfer heat from fluids." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A Chiller must provide service using Water." ; + sh:property [ rdfs:comment "A Chiller shall have at least one inlet using the medium Water." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Water ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Chiller must provide service using Water." ; + [ rdfs:comment "A Chiller shall have at least one outlet using the medium Water." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Water ; sh:path s223:hasMedium ] ] ] ] . +s223:ClosedWorldShape a sh:NodeShape ; + sh:severity sh:Info ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Ensure that all instances of a class use only the properties defined for that class." ; + sh:message "Predicate {?p} is not defined for instance {$this}." ; + sh:prefixes ; + sh:select """ +SELECT $this ?p ?o +WHERE { +$this a/rdfs:subClassOf* s223:Concept . +$this ?p ?o . +FILTER(STRSTARTS (str(?p), "http://data.ashrae.org/standard223") || STRSTARTS (str(?p), "http://qudt.org/schema/qudt")) +FILTER NOT EXISTS {$this a sh:NodeShape} +FILTER NOT EXISTS {$this a/rdfs:subClassOf* ?class . + ?class sh:property/sh:path ?p . +} +FILTER NOT EXISTS {$this a/rdfs:subClassOf* ?class . +?class sh:xone/rdf:rest*/rdf:first/sh:property/sh:path ?p . +} +FILTER NOT EXISTS {$this a/rdfs:subClassOf* ?class . +?class sh:or/rdf:rest*/rdf:first/sh:property/sh:path ?p . +} +} +""" ] ; + sh:targetClass s223:Concept . + s223:Compressor a s223:Class, sh:NodeShape ; rdfs:label "Compressor" ; + rdfs:comment "A device for mechanically increasing the pressure of a gas." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A Compressor must be associated with at least 1 InletConnectionPoint using the relation hasConnectionPoint." ; + sh:property [ rdfs:comment "A Compressor shall have at least one inlet." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ], - [ rdfs:comment "A Compressor must be associated with at least 1 OutletConnectionPoint using the relation hasConnectionPoint." ; + [ rdfs:comment "A Compressor shall have at least one outlet." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ] . @@ -221,38 +989,55 @@ s223:ConcentrationSensor a s223:Class, s223:Controller a s223:Class, sh:NodeShape ; rdfs:label "Controller" ; + rdfs:comment "A device for regulation of a system or component in normal operation, which executes a FunctionBlock." ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "An instance of Controller can be associated with any number of Function block instances using the relation 'executes'." ; + sh:property [ rdfs:comment "If the relation executes is present it must associate the Controller with a FunctionBlock." ; sh:class s223:FunctionBlock ; - sh:path s223:executes ] . + sh:path s223:executes ] ; + sh:rule [ a sh:TripleRule ; + rdfs:comment "Infer the hasRole s223:Role-Controller relation for every instance of Controller" ; + sh:object s223:Role-Controller ; + sh:predicate s223:hasRole ; + sh:subject sh:this ] . + +s223:ControllerRoleShape a sh:NodeShape ; + rdfs:comment "Equipment that executes a FunctionBlock must have a s223:hasRole relation to s223:Role-Controller." ; + sh:property [ a sh:PropertyShape ; + sh:hasValue s223:Role-Controller ; + sh:message "Equipment that executes a FunctionBlock must have a s223:hasRole relation to s223:Role-Controller." ; + sh:minCount 1 ; + sh:path s223:hasRole ] ; + sh:targetSubjectsOf s223:executes . s223:CoolingCoil a s223:Class, sh:NodeShape ; rdfs:label "Cooling coil" ; + rdfs:comment "A coil that provides cooling." ; rdfs:subClassOf s223:Coil ; - sh:property [ rdfs:comment "A cooling coil must be related to the role 'HeatExchanger-Cooling' using the relation 'hasRole'." ; - sh:hasValue s223:HeatExchanger-Cooling ; + sh:property [ rdfs:comment "A cooling coil must be related to the role 'Role-Cooling' using the relation 'hasRole'." ; + sh:hasValue s223:Role-Cooling ; sh:minCount 1 ; sh:path s223:hasRole ] ; sh:rule [ a sh:TripleRule ; rdfs:comment "Cooling coils will always have the role Role-Cooling" ; - sh:object s223:HeatExchanger-Cooling ; + sh:object s223:Role-Cooling ; sh:predicate s223:hasRole ; sh:subject sh:this ] . s223:CoolingTower a s223:Class, sh:NodeShape ; rdfs:label "Cooling tower" ; + rdfs:comment "A heat transfer device in which atmospheric air cools warm water, generally by direct contact via evaporation." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A CoolingTower must provide service using Water." ; + sh:property [ rdfs:comment "A CoolingTower shall have at least one inlet using the medium Water." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Water ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A CoolingTower must provide service using Water." ; + [ rdfs:comment "A CoolingTower shall have at least one outlet using the medium Water." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; @@ -262,72 +1047,64 @@ s223:CoolingTower a s223:Class, s223:CorrelatedColorTemperatureSensor a s223:Class, sh:NodeShape ; rdfs:label "Correlated color temperature sensor" ; + rdfs:comment "A subclass of LightSensor that observes the color of light." ; rdfs:subClassOf s223:LightSensor ; - sh:rule [ a sh:SPARQLRule ; - rdfs:comment "A CorrelatedColorTemperatureSensor will always observe a Property that has a QuantityKind of ThermodynamicTemperature." ; - sh:construct """ -CONSTRUCT {?prop qudt:hasQuantityKind qudtqk:ThermodynamicTemperature .} -WHERE { - $this s223:observes ?prop . -} -""" ; - sh:prefixes s223: ] . - -s223:DC-12V a s223:Electricity-DC ; - rdfs:label "DC 12V" . - -s223:DC-24V a s223:Electricity-DC ; - rdfs:label "DC 24V" . - -s223:DC-380V a s223:Electricity-DC ; - rdfs:label "DC 380V" . - -s223:DC-48V a s223:Electricity-DC ; - rdfs:label "DC 48V" . - -s223:DC-5V a s223:Electricity-DC ; - rdfs:label "DC 5V" . + sh:property [ rdfs:comment "A CorrelatedColorTemperatureSensor must always observe a Property that has a QuantityKind of ThermodynamicTemperature." ; + sh:path s223:observes ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Property ; + sh:node [ sh:property [ sh:hasValue qudtqk:ThermodynamicTemperature ; + sh:path qudt:hasQuantityKind ] ] ] ] . s223:DifferentialSensor a s223:Class, sh:NodeShape ; rdfs:label "Differential sensor" ; + rdfs:comment "A sensor that measures the difference of a quantity between any two points in the system." ; rdfs:subClassOf s223:AbstractSensor ; - sh:property [ rdfs:comment "A Differential Sensor must be defined in terms of the QuantityKind that is being measured" ; - sh:class qudt:QuantityKind ; - sh:minCount 1 ; - sh:path ( s223:observes qudt:hasQuantityKind ) ], - [ rdfs:comment "Ensure that the values of hasMeasurementLocationHigh and hasMeasurementLocationLow are distinct." ; - sh:path s223:hasMeasurementLocationHigh ; + sh:property [ rdfs:comment "A Differential Sensor must have different values for hasObservationLocationHigh and hasObservationLocationLow." ; + sh:path s223:hasObservationLocationHigh ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Ensure that the values of hasMeasurementLocationHigh and hasMeasurementLocationLow are distinct." ; - sh:message "{$this} cannot have the same value, {?high}, for both hasMeasurementLocationHigh and hasMeasurementLocationLow" ; - sh:prefixes s223: ; + rdfs:comment "Ensure that the values of hasObservationLocationHigh and hasObservationLocationLow are distinct." ; + sh:message "{$this} cannot have the same value, {?high}, for both hasObservationLocationHigh and hasObservationLocationLow" ; + sh:prefixes ; sh:select """ SELECT $this ?high WHERE { - ?this s223:hasMeasurementLocationHigh ?high . - ?this s223:hasMeasurementLocationLow ?low . + $this s223:hasObservationLocationHigh ?high . + $this s223:hasObservationLocationLow ?low . FILTER (?high = ?low) . } -""" ] ] ; - sh:xone ( [ sh:property [ rdfs:comment "A DifferentialSensor must be associated with exactly 1 of Connectable, Connection, Segment, or ConnectionPoint by hasMeasurementLocationLow." ; +""" ] ], + [ rdfs:comment "A Differential Sensor must be defined in terms of the QuantityKind that is being measured." ; + sh:class qudt:QuantityKind ; + sh:minCount 1 ; + sh:path ( s223:observes qudt:hasQuantityKind ) ] ; + sh:xone ( [ sh:property [ rdfs:comment "A DifferentialSensor must be associated with exactly 1 of Connectable, Connection, or ConnectionPoint using the relation hasObservationLocationHigh." ; sh:class s223:Connectable ; - sh:path s223:hasMeasurementLocationLow ] ] [ sh:property [ rdfs:comment "A DifferentialSensor must be associated with exactly 1 of Connectable, Connection, Segment, or ConnectionPoint by hasMeasurementLocationLow." ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasObservationLocationHigh ] ] [ sh:property [ rdfs:comment "A DifferentialSensor must be associated with exactly 1 of Connectable, Connection, or ConnectionPoint using the relation hasObservationLocationHigh." ; sh:class s223:Connection ; - sh:path s223:hasMeasurementLocationLow ] ] [ sh:property [ rdfs:comment "A DifferentialSensor must be associated with exactly 1 of Connectable, Connection, Segment, or ConnectionPoint by hasMeasurementLocationLow." ; - sh:class s223:Segment ; - sh:path s223:hasMeasurementLocationLow ] ] [ sh:property [ rdfs:comment "A DifferentialSensor must be associated with exactly 1 of Connectable, Connection, Segment, or ConnectionPoint by hasMeasurementLocationLow." ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasObservationLocationHigh ] ] [ sh:property [ rdfs:comment "A DifferentialSensor must be associated with exactly 1 of Connectable, Connection, or ConnectionPoint using the relation hasObservationLocationHigh." ; sh:class s223:ConnectionPoint ; - sh:path s223:hasMeasurementLocationLow ] ] ), - ( [ sh:property [ rdfs:comment "A DifferentialSensor must be associated with exactly 1 of Connectable, Connection, Segment, or ConnectionPoint by hasMeasurementLocationHigh." ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasObservationLocationHigh ] ] ), + ( [ sh:property [ rdfs:comment "A DifferentialSensor must be associated with exactly 1 of Connectable, Connection, or ConnectionPoint using the relation hasObservationLocationLow." ; sh:class s223:Connectable ; - sh:path s223:hasMeasurementLocationHigh ] ] [ sh:property [ rdfs:comment "A DifferentialSensor must be associated with exactly 1 of Connectable, Connection, Segment, or ConnectionPoint by hasMeasurementLocationHigh." ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasObservationLocationLow ] ] [ sh:property [ rdfs:comment "A DifferentialSensor must be associated with exactly 1 of Connectable, Connection, or ConnectionPoint using the relation hasObservationLocationLow." ; sh:class s223:Connection ; - sh:path s223:hasMeasurementLocationHigh ] ] [ sh:property [ rdfs:comment "A DifferentialSensor must be associated with exactly 1 of Connectable, Connection, Segment, or ConnectionPoint by hasMeasurementLocationHigh." ; - sh:class s223:Segment ; - sh:path s223:hasMeasurementLocationHigh ] ] [ sh:property [ rdfs:comment "A DifferentialSensor must be associated with exactly 1 of Connectable, Connection, Segment, or ConnectionPoint by hasMeasurementLocationHigh." ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasObservationLocationLow ] ] [ sh:property [ rdfs:comment "A DifferentialSensor must be associated with exactly 1 of Connectable, Connection, or ConnectionPoint using the relation hasObservationLocationLow." ; sh:class s223:ConnectionPoint ; - sh:path s223:hasMeasurementLocationHigh ] ] ) . + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasObservationLocationLow ] ] ) . s223:Direction-Bidirectional a s223:EnumerationKind-Direction ; rdfs:label "Direction-Bidirectional" ; @@ -354,6 +1131,10 @@ s223:Domain-Fire a s223:EnumerationKind-Domain ; rdfs:label "Domain-Fire" ; rdfs:comment "The domain Fire represents equipment used to provide fire detection and protection within a building. Example equipment that might be fall within a Fire domain include smoke detectors, alarm annunciators, and emergency public address systems. " . +s223:Domain-HVAC a s223:EnumerationKind-Domain ; + rdfs:label "Domain-HVAC" ; + rdfs:comment "The domain HVAC represents equipment used to provide space conditioning and ventilation within a building. Example equipment that might fall within an HVAC domain include fans, pumps, air-handling units, and variable air volume boxes. " . + s223:Domain-Lighting a s223:EnumerationKind-Domain ; rdfs:label "Domain-Lighting" ; rdfs:comment "The domain Lighting represents equipment used to provide illumination within or outside a building. Example equipment that might fall within a Lighting domain includes luminaires, daylight sensors, and movable sun shades." . @@ -381,31 +1162,24 @@ s223:Domain-Refrigeration a s223:EnumerationKind-Domain ; s223:Door a s223:Class, sh:NodeShape ; rdfs:label "Door" ; + rdfs:comment "A hinged, sliding, or revolving barrier at the entrance to a building or room." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A Door must have ConnectionPoints with the medium Medium-Air." ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Medium-Air ; - sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Door must have ConnectionPoints with the medium Medium-Air." ; + sh:property [ rdfs:comment "A Door shall have at least two bidirectional connection points using the medium Air." ; + sh:minCount 2 ; sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:qualifiedMinCount 2 ; + sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Air ; sh:path s223:hasMedium ] ] ] ] . s223:DualDuctTerminal a s223:Class, sh:NodeShape ; - rdfs:label "A dual duct air terminal mixes two independent sources of primary air.", - "Dual duct air terminal." ; + rdfs:label "Dual duct air terminal." ; + rdfs:comment "A dual duct air terminal mixes two independent sources of primary air." ; rdfs:seeAlso s223:TerminalUnit ; rdfs:subClassOf s223:TerminalUnit ; - sh:property [ sh:minCount 3 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A DualDuctTerminal must absorb 2 sources of Air." ; + sh:property [ rdfs:comment "A DualDuctTerminal shall have at least two inlets using the medium Air." ; + sh:minCount 2 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 2 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; @@ -421,16 +1195,14 @@ s223:Duct a s223:Class, s223:DuvSensor a s223:Class, sh:NodeShape ; rdfs:label "Duv sensor" ; + rdfs:comment "A subclass of LightSensor that observes the deviation of the light spectrum from pure blackbody." ; rdfs:subClassOf s223:LightSensor ; - sh:rule [ a sh:SPARQLRule ; - rdfs:comment "A DuvSensor will always observe a Property that has a QuantityKind of Duv." ; - sh:construct """ -CONSTRUCT {?prop qudt:hasQuantityKind qudtqk:Duv .} -WHERE { - $this s223:observes ?prop . -} -""" ; - sh:prefixes s223: ] . + sh:property [ rdfs:comment "A DuvSensor must always observe a Property that has a QuantityKind of Duv." ; + sh:path s223:observes ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Property ; + sh:node [ sh:property [ sh:hasValue qudtqk:Duv ; + sh:path qudt:hasQuantityKind ] ] ] ] . s223:EM-Microwave a s223:Medium-EM ; rdfs:label "EM-Microwave" . @@ -438,35 +1210,16 @@ s223:EM-Microwave a s223:Medium-EM ; s223:EM-RF a s223:Medium-EM ; rdfs:label "EM-RF" . -s223:Economizer a s223:Class, - sh:NodeShape ; - rdfs:label "Economizer" ; - rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "An Economizer must provide service using Air." ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Medium-Air ; - sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "An Economizer must provide service using Air." ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Medium-Air ; - sh:path s223:hasMedium ] ] ] ] . - -s223:Effectiveness-Active a s223:EnumerationKind-Effectiveness ; +s223:Effectiveness-Active a s223:Aspect-Effectiveness ; rdfs:label "Active" . s223:ElectricBreaker a s223:Class, sh:NodeShape ; rdfs:label "Electric breaker" ; + rdfs:comment "A piece of equipment designed to open the circuit automatically at a predetermined overcurrent without damage to itself (when properly applied within its rating)." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 1 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "An ElectricBreaker must provide Electricity." ; + sh:property [ rdfs:comment "An ElectricBreaker shall have at least one outlet using the medium Electricity." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; @@ -476,40 +1229,44 @@ s223:ElectricBreaker a s223:Class, s223:ElectricMeter a s223:Class, sh:NodeShape ; rdfs:label "Electric meter" ; + rdfs:comment "A device that measures the properties of electric energy." ; rdfs:subClassOf s223:Equipment . s223:ElectricOutlet a s223:Class, sh:NodeShape ; - rdfs:label "ElectricOutlet" ; + rdfs:label "Electric outlet" ; + rdfs:comment "A device to which a piece of electrical equipment can be connected in order to provide it with electricity" ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "An ElectricOutlet must provide service using Electricity." ; + sh:property [ rdfs:comment "An ElectricOutlet shall have at least one outlet using the medium Electricity." ; + 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:Medium-Electricity ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "An ElectricOutlet must provide service using Electricity." ; + [ rdfs:comment "An ElectricOutlet shall have exactly one inlet using the medium Electricity." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; + sh:qualifiedMaxCount 1 ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Electricity ; sh:path s223:hasMedium ] ] ] ] . s223:ElectricTransformer a s223:Class, sh:NodeShape ; - rdfs:label "Transformer" ; + rdfs:label "Electric transformer" ; + rdfs:comment "A piece of electrical equipment used to convert alternative current (AC) electric power from one voltage to another voltage." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "An ElectricTransformer must provide service using Electricity." ; + sh:property [ rdfs:comment "An ElectricTransformer shall have at least one inlet using the medium Electricity." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Electricity ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "An ElectricTransformer must provide service using Electricity." ; + [ rdfs:comment "An ElectricTransformer shall have at least one outlet using the medium Electricity." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; @@ -521,60 +1278,127 @@ s223:ElectricWire a s223:Class, rdfs:label "Electric wire" ; rdfs:comment "An ElectricWire is a subclass of Connection, that represents one or more electrical conductors used to convey electricity." ; rdfs:subClassOf s223:Connection ; - sh:property [ rdfs:comment "An ElectricWire must be associated with one Medium-Electricity using the relation hasMedium" ; + sh:property [ rdfs:comment "If the relation hasElectricalPhase is present it must associate the ElectricWire with an ElectricalPhaseIdentifier or ElectricalVoltagePhases." ; + sh:or ( [ sh:class s223:Aspect-ElectricalPhaseIdentifier ] [ sh:class s223:Aspect-ElectricalVoltagePhases ] ) ; + sh:path s223:hasElectricalPhase ], + [ rdfs:comment "An ElectricWire must be associated with exactly one Medium-Electricity using the relation hasMedium." ; sh:class s223:Medium-Electricity ; sh:maxCount 1 ; sh:minCount 1 ; sh:path s223:hasMedium ] . +s223:ElectricalPhaseIdentifier-A a s223:Aspect-ElectricalPhaseIdentifier ; + rdfs:label "Electrical Phase Identifier A" ; + rdfs:comment "The value of the associated Property identifies the electrical phase A of the Connection." . + +s223:ElectricalPhaseIdentifier-AB a s223:Aspect-ElectricalPhaseIdentifier ; + rdfs:label "Electrical Phase Identifier AB" ; + rdfs:comment "The value of the associated Property identifies the electrical phase AB of the Connection." . + +s223:ElectricalPhaseIdentifier-ABC a s223:Aspect-ElectricalPhaseIdentifier ; + rdfs:label "Electrical Phase Identifier ABC" ; + rdfs:comment "The value of the associated Property identifies the electrical phase ABC of the Connection." . + +s223:ElectricalPhaseIdentifier-B a s223:Aspect-ElectricalPhaseIdentifier ; + rdfs:label "Electrical Phase Identifier B" ; + rdfs:comment "The value of the associated Property identifies the electrical phase B of the Connection." . + +s223:ElectricalPhaseIdentifier-BC a s223:Aspect-ElectricalPhaseIdentifier ; + rdfs:label "Electrical Phase Identifier BC" ; + rdfs:comment "The value of the associated Property identifies the electrical phase BC of the Connection." . + +s223:ElectricalPhaseIdentifier-C a s223:Aspect-ElectricalPhaseIdentifier ; + rdfs:label "Electrical Phase Identifier C" ; + rdfs:comment "The value of the associated Property identifies the electrical phase C of the Connection." . + +s223:ElectricalPhaseIdentifier-CA a s223:Aspect-ElectricalPhaseIdentifier ; + rdfs:label "Electrical Phase Identifier CA" ; + rdfs:comment "The value of the associated Property identifies the electrical phase CA of the Connection." . + +s223:ElectricalVoltagePhases-ABLineLineVoltage a s223:Aspect-ElectricalVoltagePhases ; + rdfs:label "ElectricalVoltagePhases-ABLineLineVoltage" ; + rdfs:comment "Identifies the Line-to-line voltage is between phases A and B" . + +s223:ElectricalVoltagePhases-ANLineNeutralVoltage a s223:Aspect-ElectricalVoltagePhases ; + rdfs:label "ElectricalVoltagePhases-ANLineNeutralVoltage" ; + rdfs:comment "Identifies the Line-to-neutral voltage is between phases A and N" . + +s223:ElectricalVoltagePhases-BCLineLineVoltage a s223:Aspect-ElectricalVoltagePhases ; + rdfs:label "ElectricalVoltagePhases-BCLineLineVoltage" ; + rdfs:comment "Identifies the Line-to-line voltage is between phases B and C" . + +s223:ElectricalVoltagePhases-BNLineNeutralVoltage a s223:Aspect-ElectricalVoltagePhases ; + rdfs:label "ElectricalVoltagePhases-BNLineNeutralVoltage" ; + rdfs:comment "Identifies the Line-to-neutral voltage is between phases B and N" . + +s223:ElectricalVoltagePhases-CALineLineVoltage a s223:Aspect-ElectricalVoltagePhases ; + rdfs:label "ElectricalVoltagePhases-CALineLineVoltage" ; + rdfs:comment "Identifies the Line-to-line voltage is between phases C and A" . + +s223:ElectricalVoltagePhases-CNLineNeutralVoltage a s223:Aspect-ElectricalVoltagePhases ; + rdfs:label "ElectricalVoltagePhases-CNLineNeutralVoltage" ; + rdfs:comment "Identifies the Line-to-neutral voltage is between phases C and N" . + +s223:Electricity-Earth a s223:Medium-Electricity ; + rdfs:label "Electricity-Earth" . + +s223:Electricity-Neutral a s223:Medium-Electricity ; + rdfs:label "Electricity-Neutral" . + +s223:EnumeratedActuatableProperty a s223:Class, + sh:NodeShape ; + rdfs:label "Enumerated actuatable property" ; + rdfs:comment "An EnumeratedActuatableProperty is a property with an enumerated (fixed) set of possible values that can be changed (actuated)." ; + rdfs:subClassOf s223:ActuatableProperty, + s223:EnumerableProperty . + s223:EthernetSwitch a s223:Class, sh:NodeShape ; rdfs:label "Ethernet switch" ; + rdfs:comment "A device that connects wired devices such as computers, laptops, routers, servers, and printers to one another." ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "An EthernetSwitch must have at least one bidirectional connection point." ; + sh:property [ rdfs:comment "An EthernetSwitch shall have at least one BidirectionalConnectionPoint using the medium Electricity." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Electricity ; sh:path s223:hasMedium ] ] ] ] . -s223:ExternalSource a s223:Class, - sh:NodeShape ; - rdfs:label "External source" ; - rdfs:subClassOf s223:Concept . - s223:FanCoilUnit a s223:Class, sh:NodeShape ; rdfs:label "Fan coil unit" ; + rdfs:comment "A device consisting of a heat exchanger (coil) and a fan to regulate the temperature of one or more spaces." ; rdfs:subClassOf s223:Equipment ; - sh:or ( sh:property [ sh:path s223:contains ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Coil ] ] sh:property [ sh:path s223:contains ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Coil ] ] ) ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A FanCoilUnit must at least have the role Role-Heating or Role-Cooling." ; + sh:property [ rdfs:comment "A FanCoilUnit must be associated with at least 1 Coil using the relation contains." ; sh:minCount 1 ; - sh:path s223:hasRole ; + sh:path s223:contains ; sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:in ( s223:Role-Heating s223:Role-Cooling ) ] ], - [ sh:minCount 2 ; + sh:qualifiedValueShape [ sh:class s223:Coil ] ], + [ rdfs:comment "A FanCoilUnit must be associated with at least 1 Fan using the relation contains." ; + sh:minCount 1 ; sh:path s223:contains ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:Fan ] ], - [ rdfs:comment "A FanCoilUnit must provide service using Air." ; + [ rdfs:comment "A FanCoilUnit shall have at least one inlet using the medium Air." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A FanCoilUnit must provide service using Air." ; + [ rdfs:comment "A FanCoilUnit shall have at least one outlet using the medium Air." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Air ; - sh:path s223:hasMedium ] ] ] ] . + sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "A FanCoilUnit must at least have the role Role-Heating or Role-Cooling." ; + sh:minCount 1 ; + sh:path s223:hasRole ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:in ( s223:Role-Heating s223:Role-Cooling ) ] ] . s223:FanPoweredTerminal a s223:Class, sh:NodeShape ; @@ -590,14 +1414,42 @@ s223:FanPoweredTerminal a s223:Class, s223:Filter a s223:Class, sh:NodeShape ; rdfs:label "Filter" ; + rdfs:comment "A device that removes contaminants from gases or liquids." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A Filter must be associated with at least 1 InletConnectionPoint using the relation hasConnectionPoint." ; + sh:property [ rdfs:comment "A filter should have one common constituent between the inlet and outlet" ; + sh:path s223:hasConnectionPoint ; + sh:severity sh:Warning ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Ensure that the filter inlet and outlet have compatible mediums." ; + sh:message "{$this} with inlet medium {?m2} is incompatible with outlet medium {?m1}." ; + sh:prefixes ; + sh:select """ +SELECT $this ?m2 ?m1 +WHERE { +$this s223:cnx ?cp, ?cp2 . +?cp a s223:InletConnectionPoint . +?cp2 a s223:OutletConnectionPoint . +?cp s223:hasMedium ?m1 . +?cp2 s223:hasMedium ?m2 . +FILTER (?m1 != ?m2 ) . +FILTER (NOT EXISTS {?m2 a/rdfs:subClassOf* ?m1}) . +FILTER (NOT EXISTS {?m1 a/rdfs:subClassOf* ?m2}) . +FILTER (NOT EXISTS { + SELECT $this ?con3 ?m1 ?m2 + WHERE { + ?m1 s223:hasConstituent/s223:ofSubstance ?con3 . + ?m2 s223:hasConstituent/s223:ofSubstance ?con3 . + } +} ) . +} +""" ] ], + [ rdfs:comment "A Filter shall have at least one inlet." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ], - [ rdfs:comment "A Filter must be associated with at least 1 OutletConnectionPoint using the relation hasConnectionPoint." ; + [ rdfs:comment "A Filter shall have at least one outlet." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ] . @@ -611,16 +1463,17 @@ s223:FlowSensor a s223:Class, s223:FumeHood a s223:Class, sh:NodeShape ; rdfs:label "Fume hood" ; + rdfs:comment "A fume-collection device mounted over a work space, table, or shelf and serving to conduct unwanted gases away from an area." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A FumeHood must provide service using Air." ; + sh:property [ rdfs:comment "A FumeHood shall have at least one inlet using the medium Air." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A FumeHood must provide service using Air." ; + [ rdfs:comment "A FumeHood shall have at least one outlet using the medium Air." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; @@ -630,18 +1483,20 @@ s223:FumeHood a s223:Class, s223:Furnace a s223:Class, sh:NodeShape ; rdfs:label "Furnace" ; + rdfs:comment "An enclosed chamber or structure in which heat is produced, as by burning fuel or by converting electrical energy. " ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A Furnace must provide Air." ; + sh:property [ rdfs:comment "A Furnace shall have at least one inlet using the medium Air." ; + 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:Medium-Air ; sh:path s223:hasMedium ] ] ] ], - [ sh:path s223:hasConnectionPoint ; + [ rdfs:comment "A Furnace shall have at least one outlet using the medium Air." ; + 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:Medium-Air ; sh:path s223:hasMedium ] ] ] ] . @@ -651,16 +1506,48 @@ s223:Gas-SuperHeated a s223:Phase-Gas ; s223:Generator a s223:Class, sh:NodeShape ; rdfs:label "Generator" ; + rdfs:comment "An energy transducer that transforms non-electric energy into electric energy." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 1 ; + sh:property [ rdfs:comment "A Generator must be associated with at least one ConnectionPoint using the relation hasConnectionPoint." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A Generator must provide Electricity." ; + [ rdfs:comment "A Generator shall have at least one outlet using the medium Electricity." ; sh:class s223:OutletConnectionPoint ; sh:minCount 1 ; sh:node [ sh:property [ sh:class s223:Medium-Electricity ; sh:path s223:hasMedium ] ] ; sh:path s223:hasConnectionPoint ] . +s223:GlycolSolution-15Percent a s223:Water-GlycolSolution ; + rdfs:label "GlycolSolution-15Percent" ; + s223:hasConstituent [ a s223:QuantifiableProperty ; + rdfs:label "Glycol conc" ; + s223:hasValue 15.0 ; + s223:ofSubstance s223:Medium-Glycol ; + qudt:hasQuantityKind qudtqk:VolumeFraction ; + qudt:hasUnit unit:PERCENT ], + [ a s223:QuantifiableProperty ; + rdfs:label "Water conc" ; + s223:hasValue 85.0 ; + s223:ofSubstance s223:Medium-Water ; + qudt:hasQuantityKind qudtqk:VolumeFraction ; + qudt:hasUnit unit:PERCENT ] . + +s223:GlycolSolution-30Percent a s223:Water-GlycolSolution ; + rdfs:label "GlycolSolution-30Percent" ; + s223:hasConstituent [ a s223:QuantifiableProperty ; + rdfs:label "Glycol conc" ; + s223:hasValue 30.0 ; + s223:ofSubstance s223:Medium-Glycol ; + qudt:hasQuantityKind qudtqk:VolumeFraction ; + qudt:hasUnit unit:PERCENT ], + [ a s223:QuantifiableProperty ; + rdfs:label "Water conc" ; + s223:hasValue 70.0 ; + s223:ofSubstance s223:Medium-Water ; + qudt:hasQuantityKind qudtqk:VolumeFraction ; + qudt:hasUnit unit:PERCENT ] . + s223:HVACOperatingMode-Auto a s223:EnumerationKind-HVACOperatingMode ; rdfs:label "Auto" . @@ -691,28 +1578,20 @@ s223:HVACOperatingStatus-Off a s223:EnumerationKind-HVACOperatingStatus ; s223:HVACOperatingStatus-Ventilating a s223:EnumerationKind-HVACOperatingStatus ; rdfs:label "Ventilating" . -s223:HasDomainLookingUpRule a sh:NodeShape ; - sh:rule [ a sh:TripleRule ; - rdfs:comment "Traverse up the contains hierarchy to determine the domain" ; - sh:object [ sh:path ( [ sh:zeroOrMorePath [ sh:inversePath s223:contains ] ] s223:hasDomain ) ] ; - sh:predicate s223:hasDomain ; - sh:subject sh:this ] ; - sh:targetClass s223:DomainSpace, - s223:Zone . - s223:HeatPump a s223:Class, sh:NodeShape ; rdfs:label "HeatPump" ; + rdfs:comment "A device that can heat or cool by transferring thermal energy using a reversible refrigeration cycle." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A HeatPump must provide service using Air." ; + sh:property [ rdfs:comment "A HeatPump shall have at least one inlet using the medium Air." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A HeatPump must provide service using Air." ; + [ rdfs:comment "A HeatPump shall have at least one outlet using the medium Air." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; @@ -722,25 +1601,28 @@ s223:HeatPump a s223:Class, s223:HeatingCoil a s223:Class, sh:NodeShape ; rdfs:label "Heating coil" ; + rdfs:comment "A coil that provides heating." ; rdfs:subClassOf s223:Coil ; - sh:property [ rdfs:comment "A heating coil must be related to the role 'HeatExchanger-Heating' using the relation 'hasRole'." ; - sh:hasValue s223:HeatExchanger-Heating ; + sh:property [ rdfs:comment "A heating coil must be related to the role 'Role-Heating' using the relation 'hasRole'." ; + sh:hasValue s223:Role-Heating ; sh:minCount 1 ; sh:path s223:hasRole ] ; sh:rule [ a sh:TripleRule ; rdfs:comment "Heating coils will always have the role Role-Heating" ; - sh:object s223:HeatExchanger-Heating ; + sh:object s223:Role-Heating ; sh:predicate s223:hasRole ; sh:subject sh:this ] . s223:Humidifier a s223:Class, sh:NodeShape ; rdfs:label "Humidifier" ; + rdfs:comment "A piece of equipment to add moisture to a gas such as air." ; rdfs:subClassOf s223:Equipment . s223:Humidistat a s223:Class, sh:NodeShape ; rdfs:label "Humidistat" ; + rdfs:comment "An automatic control device used to maintain humidity at a fixed or adjustable setpoint." ; rdfs:subClassOf s223:Equipment . s223:HumiditySensor a s223:Class, @@ -749,28 +1631,26 @@ s223:HumiditySensor a s223:Class, rdfs:comment "A HumiditySensor is a specialization of a Sensor that observes a QuantifiableObservableProperty that represents a humidity measurement. " ; rdfs:subClassOf s223:Sensor ; sh:rule [ a sh:SPARQLRule ; - rdfs:comment "A HumiditySensor will always observe a Property that has a QuantityKind of RelativeHumidity." ; + rdfs:comment "A HumiditySensor must always observe a Property that has a QuantityKind of RelativeHumidity." ; sh:construct """ CONSTRUCT {?prop qudt:hasQuantityKind qudtqk:RelativeHumidity .} WHERE { $this s223:observes ?prop . } """ ; - sh:prefixes s223: ] . + sh:prefixes ] . s223:IlluminanceSensor a s223:Class, sh:NodeShape ; rdfs:label "Illuminance sensor" ; + rdfs:comment "A subclass of LightSensor that observes the level of illuminance." ; rdfs:subClassOf s223:LightSensor ; - sh:rule [ a sh:SPARQLRule ; - rdfs:comment "A IlluminanceSensor will always observe a Property that has a QuantityKind of Illuminance." ; - sh:construct """ -CONSTRUCT {?prop qudt:hasQuantityKind qudtqk:Illuminance .} -WHERE { - $this s223:observes ?prop . -} -""" ; - sh:prefixes s223: ] . + sh:property [ rdfs:comment "An IlluminanceSensor will always observe a Property that has a QuantityKind of Illuminance." ; + sh:path s223:observes ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Property ; + sh:node [ sh:property [ sh:hasValue qudtqk:Illuminance ; + sh:path qudt:hasQuantityKind ] ] ] ] . s223:InversePropertyShape a sh:NodeShape ; sh:rule [ a sh:SPARQLRule ; @@ -784,26 +1664,27 @@ WHERE { ?p s223:inverseOf ?invP . } """ ; - sh:prefixes s223: ] ; + sh:prefixes ] ; sh:targetClass s223:Concept . s223:Inverter a s223:Class, sh:NodeShape ; rdfs:label "Inverter" ; + rdfs:comment "An electric energy converter that changes direct electric current to alternating current." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "An Inverter must provide service using Electricity." ; + sh:property [ rdfs:comment "An Inverter shall have at least one inlet using the medium Electricity-DC." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Medium-Electricity ; + sh:node [ sh:property [ sh:class s223:Electricity-DC ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "An Inverter must provide service using Electricity." ; + [ rdfs:comment "An Inverter shall have at least one outlet using the medium Electricity-AC." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Medium-Electricity ; + sh:node [ sh:property [ sh:class s223:Electricity-AC ; sh:path s223:hasMedium ] ] ] ] . s223:Light-Infrared a s223:EM-Light ; @@ -821,40 +1702,32 @@ s223:Liquid-SubCooled a s223:Phase-Liquid ; s223:Luminaire a s223:Class, sh:NodeShape ; rdfs:label "Luminaire" ; + rdfs:comment "A complete lighting unit consisting of a lamp or lamps together with the housing designed to distribute the light, position and protect the lamps, and connect the lamps to the power supply." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A Luminaire must absorb Electricity." ; + sh:property [ rdfs:comment "A Luminaire shall have at least one inlet using the medium Electricity." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Electricity ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Luminaire must provide Light." ; + [ rdfs:comment "A Luminaire shall have at least one outlet using the medium EM-Light." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Medium-Light ; + sh:node [ sh:property [ sh:class s223:EM-Light ; sh:path s223:hasMedium ] ] ] ] . -s223:ManualDamper a s223:Class ; - rdfs:label "Manual damper" ; - rdfs:subClassOf s223:Damper . - s223:MeasuredPropertyRule a sh:NodeShape ; - rdfs:comment "Associate the object of hasMeasurementLocation directly with the observed Property." ; - # TODO: what is this suppsoed to do? Does it need a condition? + rdfs:comment "Associate the object of hasObservationLocation directly with the observed Property." ; sh:rule [ a sh:TripleRule ; - rdfs:comment "Associate the object of hasMeasurementLocation directly with the observed Property." ; - sh:condition [ sh:node [ sh:class s223:Property ] ] ; - sh:object [ sh:path ( [ sh:inversePath s223:hasMeasurementLocation ] s223:observes ) ] ; + rdfs:comment "Associate the object of hasObservationLocation directly with the observed Property." ; + sh:object [ sh:path ( [ sh:inversePath s223:hasObservationLocation ] s223:observes ) ] ; sh:predicate s223:hasProperty ; sh:subject sh:this ] ; sh:targetClass s223:Concept . -s223:Medium-Glycol a s223:EnumerationKind-Medium ; - rdfs:label "Medium-Glycol" . - s223:Modulated-0-10V a s223:Signal-Modulated ; rdfs:label "Modulated 0-10V" . @@ -867,19 +1740,18 @@ s223:Motion-False a s223:Occupancy-Motion ; s223:Motion-True a s223:Occupancy-Motion ; rdfs:label "Motion-True" . -s223:MotorizedDamper a s223:Class ; - rdfs:label "Motorized damper" ; - rdfs:subClassOf s223:Damper . - -s223:MotorizedThreeWayValve a s223:Class, +s223:Motor a s223:Class, sh:NodeShape ; - rdfs:label "Motorized three way valve" ; - rdfs:subClassOf s223:MotorizedValve . - -s223:MotorizedTwoWayValve a s223:Class, - sh:NodeShape ; - rdfs:label "Motorized two way valve" ; - rdfs:subClassOf s223:MotorizedValve . + rdfs:label "Motor" ; + rdfs:comment "A machine in which power is applied to do work by the conversion of various forms of energy into mechanical force and motion." ; + rdfs:subClassOf s223:Equipment ; + sh:property [ rdfs:comment "A Motor shall have at least one inlet using the medium Electricity." ; + sh:minCount 1 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Medium-Electricity ; + sh:path s223:hasMedium ] ] ] ] . s223:Occupancy-Occupied a s223:EnumerationKind-Occupancy ; rdfs:label "Occupied" . @@ -893,45 +1765,44 @@ s223:Occupancy-Unoccupied a s223:EnumerationKind-Occupancy ; s223:OccupantCounter a s223:Class, sh:NodeShape ; rdfs:label "Occupant counter" ; + rdfs:comment "A subclass of OccupancySensor that counts the population within its sensing region." ; rdfs:subClassOf s223:OccupancySensor ; - sh:rule [ a sh:SPARQLRule ; - rdfs:comment "A OccupantCounter will always observe a Property that has a QuantityKind of Population." ; - sh:construct """ -CONSTRUCT {?prop qudt:hasQuantityKind qudtqk:Population . -?prop qudt:unit unit:NUM .} -WHERE { - $this s223:observes ?prop . -} -""" ; - sh:prefixes s223: ] . + sh:property [ rdfs:comment "An OccupantCounter must always observe a QuantifiableObservableProperty that has a QuantityKind of Population and a Unit of unit:NUM." ; + sh:class s223:QuantifiableObservableProperty ; + sh:minCount 1 ; + sh:node [ sh:property [ sh:hasValue qudtqk:Population ; + sh:maxCount 1 ; + sh:path qudt:hasQuantityKind ], + [ sh:hasValue unit:NUM ; + sh:maxCount 1 ; + sh:path qudt:hasUnit ] ] ; + sh:path s223:observes ] . s223:OccupantMotionSensor a s223:Class, sh:NodeShape ; rdfs:label "Occupant motion sensor" ; + rdfs:comment "A subclass of OccupancySensor that observes motion within its sensing region." ; rdfs:subClassOf s223:OccupancySensor ; - sh:rule [ a sh:SPARQLRule ; - rdfs:comment "A OccupantMotionSensor will always observe a Property that has an EnumerationKind of Occupancy-Motion." ; - sh:construct """ -CONSTRUCT {?prop s223:hasEnumerationKind s223:Occupancy-Motion .} -WHERE { - $this s223:observes ?prop . -} -""" ; - sh:prefixes s223: ] . + sh:property [ rdfs:comment "An OccupantMotionSensor must always observe an EnumeratedObservableProperty that has an EnumerationKind of Occupancy-Motion." ; + sh:class s223:EnumeratedObservableProperty ; + sh:minCount 1 ; + sh:node [ sh:property [ sh:class s223:Occupancy-Motion ; + sh:maxCount 1 ; + sh:path s223:hasEnumerationKind ] ] ; + sh:path s223:observes ] . s223:OccupantPresenceSensor a s223:Class, sh:NodeShape ; rdfs:label "Occupant presence sensor" ; + rdfs:comment "A subclass of OccupancySensor that observes presence within its sensing region." ; rdfs:subClassOf s223:OccupancySensor ; - sh:rule [ a sh:SPARQLRule ; - rdfs:comment "A OccupantPresenceSensor will always observe a Property that has an EnumerationKind of Occupancy-Presence." ; - sh:construct """ -CONSTRUCT {?prop s223:hasEnumerationKind s223:Occupancy-Presence .} -WHERE { - $this s223:observes ?prop . -} -""" ; - sh:prefixes s223: ] . + sh:property [ rdfs:comment "An OccupantPresenceSensor will always observe an EnumeratedObservableProperty that has an EnumerationKind of Occupancy-Presence." ; + sh:class s223:EnumeratedObservableProperty ; + sh:minCount 1 ; + sh:node [ sh:property [ sh:class s223:Occupancy-Presence ; + sh:maxCount 1 ; + sh:path s223:hasEnumerationKind ] ] ; + sh:path s223:observes ] . s223:OnOff-Off a s223:EnumerationKind-OnOff ; rdfs:label "Off" . @@ -942,6 +1813,12 @@ s223:OnOff-On a s223:EnumerationKind-OnOff ; s223:OnOff-Unknown a s223:EnumerationKind-OnOff ; rdfs:label "Unknown" . +s223:OutsidePhysicalSpace a s223:Class, + sh:NodeShape ; + rdfs:label "Outside physical space" ; + rdfs:comment "An OutsidePhysicalSpace is a subclass of PhysicalSpace to represent any physical spaces outside of a facility where, for example, ambient properties might be measured (within a suitably defined DomainSpace)." ; + rdfs:subClassOf s223:PhysicalSpace . + s223:Particulate-PM1.0 a s223:Substance-Particulate ; rdfs:label "Particulate-PM1.0" . @@ -956,9 +1833,9 @@ s223:ParticulateSensor a s223:Class, rdfs:label "Particulate sensor" ; rdfs:comment "A ParticulateSensor is a specialization of a Sensor that observes a QuantifiableObservableProperty that represents a particulate concentration measurement." ; rdfs:subClassOf s223:Sensor ; - sh:property [ rdfs:comment "A ParticulateSensor can be associated with a Substance-Particulate by measuresSubstance" ; + sh:property [ rdfs:comment "If the relation ofSubstance is present it must associate the ParticulateSensor with a Substance-Particulate." ; sh:class s223:Substance-Particulate ; - sh:path s223:measuresSubstance ] . + sh:path s223:ofSubstance ] . s223:Phase-Solid a s223:EnumerationKind-Phase ; rdfs:label "Phase-Solid" . @@ -966,19 +1843,39 @@ s223:Phase-Solid a s223:EnumerationKind-Phase ; s223:Phase-Vapor a s223:EnumerationKind-Phase ; rdfs:label "Phase-Vapor" . +s223:PhotovoltaicModule a s223:Class, + sh:NodeShape ; + rdfs:label "Photovoltaic module" ; + rdfs:comment "A piece of equipment that converts sunlight into electricity." ; + rdfs:subClassOf s223:Equipment ; + sh:property [ rdfs:comment "An PhotovoltaicModule must have at least one inlet using the medium EM-Light." ; + sh:minCount 1 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:EM-Light ; + sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "An PhotovoltaicModule shall have at least one outlet using the medium Electricity." ; + sh:minCount 1 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Medium-Electricity ; + sh:path s223:hasMedium ] ] ] ] . + s223:Pipe a s223:Class, sh:NodeShape ; rdfs:label "Pipe" ; rdfs:comment "A Pipe is a subclass of Connection, that represents a hollow cylinder of metal or other material used to convey a Medium." ; rdfs:subClassOf s223:Connection . -s223:PositionStatus-Closed a s223:EnumerationKind-PositionStatus ; +s223:Position-Closed a s223:EnumerationKind-Position ; rdfs:label "Closed" . -s223:PositionStatus-Open a s223:EnumerationKind-PositionStatus ; +s223:Position-Open a s223:EnumerationKind-Position ; rdfs:label "Open" . -s223:PositionStatus-Unknown a s223:EnumerationKind-PositionStatus ; +s223:Position-Unknown a s223:EnumerationKind-Position ; rdfs:label "Unknown" . s223:Presence-False a s223:Occupancy-Presence ; @@ -996,52 +1893,87 @@ s223:PressureSensor a s223:Class, s223:Pump a s223:Class, sh:NodeShape ; rdfs:label "Pump" ; - rdfs:subClassOf s223:FlowEquipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A Pump must provide service using Water." ; + 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." ; + rdfs:subClassOf s223:Equipment ; + sh:property [ rdfs:comment "The non-electrical ConnectionPoints of a Pump must have compatible Media." ; + sh:path s223:hasConnectionPoint ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "The non-electrical ConnectionPoints of a Pump must have compatible Media." ; + sh:message "{?cpa} and {?cpb} on the Pump {$this} have incompatible Media {$mediuma} and {$mediumb}." ; + sh:prefixes ; + sh:select """ +SELECT $this ?cpa ?cpb ?mediuma ?mediumb +WHERE { + $this s223:hasConnectionPoint ?cpa . + $this s223:hasConnectionPoint ?cpb . + FILTER (?cpa != ?cpb) . + ?cpa s223:hasMedium ?mediuma . + FILTER (NOT EXISTS {?mediuma a/rdfs:subClassOf* s223:Medium-Electricity}) . + ?cpb s223:hasMedium ?mediumb . + FILTER (NOT EXISTS {?mediumb a/rdfs:subClassOf* s223:Medium-Electricity}) . + FILTER (?mediuma != ?mediumb) . + FILTER (NOT EXISTS {?mediumb a/rdfs:subClassOf* ?mediuma}) . + FILTER (NOT EXISTS {?mediuma a/rdfs:subClassOf* ?mediumb}) . +} +""" ] ], + [ rdfs:comment "A Pump shall have at least one inlet using the medium Water, Oil or Refrigerant." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Medium-Water ; - sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Pump must provide service using Water." ; + sh:node [ sh:or ( [ sh:property [ sh:class s223:Medium-Water ; + sh:path s223:hasMedium ] ] [ sh:property [ sh:class s223:Medium-Refrigerant ; + sh:path s223:hasMedium ] ] [ sh:property [ sh:class s223:Medium-Oil ; + sh:path s223:hasMedium ] ] ) ] ] ], + [ rdfs:comment "A Pump shall have at least one outlet using the medium Water, Oil or Refrigerant." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Medium-Water ; - sh:path s223:hasMedium ] ] ] ] . + sh:node [ sh:or ( [ sh:property [ sh:class s223:Medium-Water ; + sh:path s223:hasMedium ] ] [ sh:property [ sh:class s223:Medium-Refrigerant ; + sh:path s223:hasMedium ] ] [ sh:property [ sh:class s223:Medium-Oil ; + sh:path s223:hasMedium ] ] ) ] ] ] . + +s223:QuantifiableActuatableProperty a s223:Class, + sh:NodeShape ; + rdfs:label "Quantifiable Actuatable Property" ; + rdfs:comment "This class is for quantifiable properties of which numerical values are specified to be modifiable by a user or a machine outside of the model, like a setpoint." ; + rdfs:subClassOf s223:ActuatableProperty, + s223:QuantifiableProperty . s223:RadiantPanel a s223:Class, sh:NodeShape ; - rdfs:label "RadiantPanel" ; + rdfs:label "Radiant panel" ; + rdfs:comment "A heating or cooling surface that delivers 50% or more of its heat transfer by radiation." ; rdfs:subClassOf s223:Equipment ; - sh:or ( [ sh:property [ rdfs:comment "A radiant panel may provide service using electricity, natural gas, or water" ; + sh:or ( [ sh:property [ rdfs:comment "A radiant panel shall have at least one inlet using the medium Electricity, NaturalGas, or Water." ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Electricity ; - sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "A radiant panel may provide service using electricity, natural gas, or water" ; + sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "A radiant panel shall have at least one inlet using the medium Electricity, NaturalGas, or Water." ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-NaturalGas ; - sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "A radiant panel may provide service using electricity, natural gas, or water" ; - sh:minCount 2 ; + sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "A radiant panel shall have at least one inlet using the medium Electricity, NaturalGas, or Water." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Water ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A radiant panel may provide service using electricity, natural gas, or water" ; + [ rdfs:comment "A radiant panel shall have at least one outlet using the medium Water." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Water ; sh:path s223:hasMedium ] ] ] ] ] ) ; - sh:property [ rdfs:comment "A radiant panel may provide service using electricity, natural gas, or water" ; + sh:property [ rdfs:comment "A radiant panel must hasRole Role-Heating." ; sh:minCount 1 ; sh:path s223:hasRole ; sh:qualifiedMinCount 1 ; @@ -1052,21 +1984,21 @@ s223:Radiator a s223:Class, rdfs:label "Radiator" ; rdfs:comment "A radiator provides heating to a room using electricity, steam or water (e.g., electric baseboard heaters)." ; rdfs:subClassOf s223:Equipment ; - sh:or ( [ sh:property [ rdfs:comment "A radiator may provide service using electricity, steam, or water." ; + sh:or ( [ sh:property [ rdfs:comment "A Radiator shall have at least one inlet using the medium Electricity or Water." ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Electricity ; - sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "A radiator may provide service using electricity, steam, or water." ; + sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "A Radiator shall have at least one inlet using the medium Electricity or Water." ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Water ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A radiator may provide service using electricity, steam, or water." ; - sh:minCount 2 ; + [ rdfs:comment "A Radiator shall have at least one outlet using the medium Water." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; @@ -1084,23 +2016,118 @@ s223:Refrigerant-R-22 a s223:Medium-Refrigerant ; s223:Refrigerant-R-410A a s223:Medium-Refrigerant ; rdfs:label "Refrigerant-R-410A" . +s223:RequiredCommentsShape a sh:NodeShape ; + sh:severity sh:Info ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Ensure that any instance of s223:Class is also a rdfs:subClassOf* s223:Concept." ; + sh:message "Class {$this} must be within the rdfs:subClassOf hierarchy under s223:Concept." ; + sh:prefixes ; + sh:select """ +SELECT $this +WHERE { +FILTER NOT EXISTS {$this rdfs:subClassOf* rdf:Property} . +FILTER NOT EXISTS {$this rdfs:subClassOf* s223:Concept} . +} +""" ], + [ a sh:SPARQLConstraint ; + rdfs:comment "Ensure that any instance of s223:Class is also an instance of sh:NodeShape." ; + sh:message "Class {$this} must be declared as an instance of sh:NodeShape." ; + sh:prefixes ; + sh:select """ +SELECT $this +WHERE { +FILTER NOT EXISTS {$this a sh:NodeShape} . +} +""" ], + [ a sh:SPARQLConstraint ; + rdfs:comment "Ensure that any instance of s223:Class must have an rdfs:comment." ; + sh:message "Class {$this} must have an rdfs:comment." ; + sh:prefixes ; + sh:select """ +SELECT $this +WHERE { +FILTER NOT EXISTS {$this rdfs:comment ?comment} . +} +""" ], + [ a sh:SPARQLConstraint ; + rdfs:comment "Ensure that any property shape must have an rdfs:comment." ; + sh:message "The SPARQLConstraint for path {?path} for Class {$this} must have an rdfs:comment." ; + sh:prefixes ; + sh:select """ +SELECT $this ?path +WHERE { +$this sh:property ?propshape . +?propshape sh:sparql ?sparqlconstraint . +?propshape sh:path ?path . +FILTER NOT EXISTS {?sparqlconstraint rdfs:comment ?comment} . +} +""" ], + [ a sh:SPARQLConstraint ; + rdfs:comment "Ensure that any property shape must have an rdfs:comment." ; + sh:message "The property shape with path {?path} for Class {$this} must have an rdfs:comment." ; + sh:prefixes ; + sh:select """ +SELECT $this ?path +WHERE { +$this sh:property ?propshape . +?propshape sh:path ?path . +FILTER NOT EXISTS {?propshape rdfs:comment ?comment} . +} +""" ], + [ a sh:SPARQLConstraint ; + rdfs:comment "Every Class must have a label." ; + sh:message "{$this} must have an rdfs:label" ; + sh:prefixes ; + sh:select """ +SELECT $this +WHERE { +FILTER (NOT EXISTS {$this rdfs:label ?something}) . +} +""" ], + [ a sh:SPARQLConstraint ; + rdfs:comment "Ensure that every TripleRule must have an rdfs:comment." ; + sh:message "The TripleRule inferring {?pred} for Class {$this} must have an rdfs:comment." ; + sh:prefixes ; + sh:select """ +SELECT $this ?pred +WHERE { +$this sh:rule ?rule . +?rule a sh:TripleRule . +?rule sh:predicate ?pred . +FILTER NOT EXISTS {?rule rdfs:comment ?comment} . +} +""" ], + [ a sh:SPARQLConstraint ; + rdfs:comment "Ensure that every SPARQLRule must have an rdfs:comment." ; + sh:message "Every SPARQLRule for Class {$this} must have an rdfs:comment." ; + sh:prefixes ; + sh:select """ +SELECT $this +WHERE { +$this sh:rule ?rule . +?rule a sh:SPARQLRule . +FILTER NOT EXISTS {?rule rdfs:comment ?comment} . +} +""" ] ; + sh:targetClass s223:Class . + s223:ResistanceHeater a s223:Class, sh:NodeShape ; - rdfs:label "Electrical Resistance Heater" ; + rdfs:label "Electrical resistance heater" ; rdfs:comment "Resistance heaters provide electrical resistance heating, for example an electric heating coil within a Fan Coil Unit." ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "ResistanceHeaters must have the role Role-Heating." ; - sh:minCount 1 ; - sh:path s223:hasRole ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Role-Heating ] ], - [ rdfs:comment "A ResistanceHeater must receive Electricity." ; + sh:property [ rdfs:comment "A ResistanceHeater shall have at least one inlet using the medium Electricity." ; sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Electricity ; - sh:path s223:hasMedium ] ] ] ] . + sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "ResistanceHeaters must have the role Role-Heating." ; + sh:minCount 1 ; + sh:path s223:hasRole ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Role-Heating ] ] . s223:Role-Condenser a s223:EnumerationKind-Role ; rdfs:label "Role-Condenser" . @@ -1117,6 +2144,9 @@ s223:Role-Evaporator a s223:EnumerationKind-Role ; s223:Role-Exhaust a s223:EnumerationKind-Role ; rdfs:label "Role-Exhaust" . +s223:Role-Expansion a s223:EnumerationKind-Role ; + rdfs:label "Role-Expansion" . + s223:Role-Generator a s223:EnumerationKind-Role ; rdfs:label "Role-Generator" . @@ -1132,6 +2162,9 @@ s223:Role-Primary a s223:EnumerationKind-Role ; s223:Role-Recirculating a s223:EnumerationKind-Role ; rdfs:label "Role-Recirculating" . +s223:Role-Relief a s223:EnumerationKind-Role ; + rdfs:label "Role-Relief" . + s223:Role-Return a s223:EnumerationKind-Role ; rdfs:label "Role-Return" . @@ -1162,14 +2195,55 @@ s223:Signal-IEC14908 a s223:Electricity-Signal ; s223:Signal-USB a s223:Electricity-Signal ; rdfs:label "Signal USB" . -s223:State a s223:Class, +s223:SingleDuctTerminal a s223:Class, + sh:NodeShape ; + rdfs:label "Single Duct Terminal." ; + rdfs:comment "An air-terminal unit assembly having one ducted air inlet and a damper for regulating the airflow rate." ; + rdfs:subClassOf s223:TerminalUnit ; + sh:property [ rdfs:comment "A SingleDuctTerminal must be associated with at least 1 Damper by contains." ; + sh:minCount 1 ; + sh:path s223:contains ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Damper ] ] . + +s223:SolarThermalCollector a s223:Class, sh:NodeShape ; - rdfs:label "State" ; - rdfs:subClassOf s223:Concept . + rdfs:label "Solar thermal collector" ; + rdfs:comment "A device that converts sunlight into thermal energy." ; + rdfs:subClassOf s223:Equipment ; + sh:property [ rdfs:comment "A SolarThermalCollector shall have at least one inlet using the medium EM-Light." ; + sh:minCount 1 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:EM-Light ; + sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "A SolarThermalCollector shall have at least one outlet using the medium Water." ; + sh:minCount 1 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Medium-Water ; + sh:path s223:hasMedium ] ] ] ] . + +s223:Speed-High a s223:EnumerationKind-Speed ; + rdfs:label "High" . + +s223:Speed-Low a s223:EnumerationKind-Speed ; + rdfs:label "Low" . + +s223:Speed-Medium a s223:EnumerationKind-Speed ; + rdfs:label "Medium" . + +s223:Speed-Off a s223:EnumerationKind-Speed ; + rdfs:label "Off" . s223:Substance-CO a s223:EnumerationKind-Substance ; rdfs:label "Substance-CO" . +s223:Substance-CO2 a s223:EnumerationKind-Substance ; + rdfs:label "Substance-CO2" . + s223:Substance-Soot a s223:EnumerationKind-Substance ; rdfs:label "Substance-Soot" . @@ -1185,7 +2259,7 @@ WHERE { ?p a s223:SymmetricProperty . } """ ; - sh:prefixes s223: ] ; + sh:prefixes ] ; sh:targetClass s223:Concept . s223:TemperatureSensor a s223:Class, @@ -1193,56 +2267,77 @@ s223:TemperatureSensor a s223:Class, rdfs:label "Temp sensor" ; rdfs:comment "A TemperatureSensor is a specialization of a Sensor that observes a QuantifiableObservableProperty that represents a temperature measurement." ; rdfs:subClassOf s223:Sensor ; - sh:rule [ a sh:SPARQLRule ; - rdfs:comment "A TemperatureSensor will always observe a Property that has a QuantityKind of Temperature." ; - sh:construct """ -CONSTRUCT {?prop qudt:hasQuantityKind qudtqk:Temperature .} -WHERE { - $this s223:observes ?prop . -} -""" ; - sh:prefixes s223: ] . + sh:property [ rdfs:comment "A TemperatureSensor must always observe a Property that has a QuantityKind of Temperature." ; + sh:path s223:observes ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Property ; + sh:node [ sh:property [ sh:hasValue qudtqk:Temperature ; + sh:path qudt:hasQuantityKind ] ] ] ] . s223:Thermostat a s223:Class, sh:NodeShape ; rdfs:label "Thermostat" ; + rdfs:comment "An automatic control device used to maintain temperature at a fixed or adjustable setpoint." ; rdfs:subClassOf s223:Equipment . -s223:ThreeSpeedSetting-High a s223:EnumerationKind-ThreeSpeedSetting ; - rdfs:label "High" . - -s223:ThreeSpeedSetting-Low a s223:EnumerationKind-ThreeSpeedSetting ; - rdfs:label "Low" . - -s223:ThreeSpeedSetting-Medium a s223:EnumerationKind-ThreeSpeedSetting ; - rdfs:label "Medium" . - -s223:ThreeSpeedSetting-Off a s223:EnumerationKind-ThreeSpeedSetting ; - rdfs:label "Off" . - s223:ThreeWayValve a s223:Class, sh:NodeShape ; rdfs:label "Three way valve" ; - rdfs:subClassOf s223:ManualValve . + rdfs:comment "A Valve that can divert a fluid in one of three directions." ; + rdfs:subClassOf s223:Valve ; + sh:property [ rdfs:comment "A ThreeWayValve must have at least three ConnectionPoints using the relation hasConnectionPoint." ; + sh:minCount 3 ; + sh:path s223:hasConnectionPoint ] . + +s223:Turbine a s223:Class, + sh:NodeShape ; + rdfs:label "Turbine" ; + rdfs:comment "An energy transducer that converts mechanical energy into electric energy." ; + rdfs:subClassOf s223:Equipment ; + sh:property [ rdfs:comment "A Turbine must be associated with at least one ConnectionPoint using the relation hasConnectionPoint." ; + sh:minCount 1 ; + sh:path s223:hasConnectionPoint ], + [ rdfs:comment "A Turbine shall have at least one outlet using the medium Electricity." ; + sh:class s223:OutletConnectionPoint ; + sh:minCount 1 ; + sh:node [ sh:property [ sh:class s223:Medium-Electricity ; + sh:path s223:hasMedium ] ] ; + sh:path s223:hasConnectionPoint ] . s223:TwoWayValve a s223:Class, sh:NodeShape ; rdfs:label "Two way valve" ; - rdfs:subClassOf s223:ManualValve . + rdfs:comment "A Valve that can divert a fluid in one of two directions." ; + rdfs:subClassOf s223:Valve ; + sh:property [ rdfs:comment "A TwoWayValve shall have at least one inlet." ; + 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." ; + sh:minCount 1 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ] . -s223:VFD a s223:Class, +s223:VariableFrequencyDrive a s223:Class, sh:NodeShape ; - rdfs:label "VFD" ; + rdfs:label "VariableFrequencyDrive" ; + 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." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A VFD must provide service using Electricity." ; + sh:property [ rdfs:comment "If the relation connectedTo is present it must associate the VariableFrequencyDrive with a Equipment." ; + sh:class s223:Equipment ; + sh:path s223:connectedTo ], + [ rdfs:comment "A VariableFrequencyDrive shall have at least one inlet using the medium Electricity." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Electricity ; - sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A VFD must provide service using Electricity." ; + sh:path s223:hasMedium ] ] ] ; + sh:severity sh:Warning ], + [ rdfs:comment "A VariableFrequencyDrive shall have at least one outlet using the medium Electricity." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; @@ -1279,281 +2374,357 @@ s223:Weekend-Saturday a s223:DayOfWeek-Weekend ; s223:Weekend-Sunday a s223:DayOfWeek-Weekend ; rdfs:label "Sunday" . +s223:Window a s223:Class, + sh:NodeShape ; + rdfs:label "Window" ; + rdfs:comment "A daylight opening on a vertical or nearly vertical area of a room envelope" ; + rdfs:subClassOf s223:Equipment ; + sh:property [ rdfs:comment "A Window shall have at least one inlet using the medium Light." ; + sh:minCount 1 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:EM-Light ; + sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "A Window shall have at least one outlet using the medium Light." ; + 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:path s223:hasMedium ] ] ] ] . + s223:WindowShade a s223:Class, sh:NodeShape ; - rdfs:label "WindowShade" ; + rdfs:label "Window shade" ; + rdfs:comment "A window covering that can be moved to block out or allow in light. " ; rdfs:subClassOf s223:Equipment . +s223:ZoneGroup a s223:Class, + sh:NodeShape ; + rdfs:label "Zone group" ; + rdfs:comment "A ZoneGroup is a logical grouping (collection) of Zones for some functional or system reason, to identify a domain of control, such as a Lighting Zone, or a heating zone." ; + rdfs:subClassOf s223:Concept ; + sh:property [ rdfs:comment "A ZoneGroup must be associated with exactly one EnumerationKind-Domain using the relation hasDomain." ; + sh:class s223:EnumerationKind-Domain ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasDomain ], + [ rdfs:comment "A ZoneGroup must be associated with at least one Zone using the relation hasZone." ; + sh:class s223:Zone ; + sh:minCount 1 ; + sh:path s223:hasZone ] ; + sh:rule [ a sh:TripleRule ; + rdfs:comment "Infer a hasDomain relation by checking any enclosed Zones to determine the domain." ; + sh:object [ sh:path ( s223:hasZone s223:hasDomain ) ] ; + sh:predicate s223:hasDomain ; + sh:subject sh:this ] . + s223:abstract a rdf:Property ; rdfs:label "abstract" ; + rdfs:comment "If the relation abstract has a value of true, the associated class cannot be instantiated. " ; rdfs:range xsd:boolean . -s223:countConnectedSystemCPs a sh:SPARQLFunction ; - rdfs:comment "Given a SystemConnectionPoint, return the number in the connected set. This is not foolproof yet" ; - sh:parameter [ a sh:Parameter ; - sh:description "The starting SystemConnectionPoint" ; - sh:path s223:scp ] ; - sh:prefixes s223: ; - sh:returnType xsd:integer ; - sh:select """SELECT (COUNT (DISTINCT ?others)AS ?count) -WHERE { -{ -$scp s223:systemConnected+ ?others . -} -UNION -{ -$scp ^s223:systemConnected+ ?others . -} -UNION -{ -$scp s223:systemConnected+/^s223:systemConnected+ ?others . -} -UNION -{ -$scp ^s223:systemConnected+/s223:systemConnected+ ?others . -} -} -GROUP BY $scp - """ . - -s223:hasTemperature a rdf:Property ; - rdfs:label "hasTemperature" ; - rdfs:subPropertyOf s223:hasProperty . +s223:hasSetpoint a rdf:Property ; + rdfs:label "has setpoint" ; + rdfs:comment "This relation binds a control setpoint to the quantifiable property indicating the desired value which the control process is trying to maintain." . s223:inverseOf a rdf:Property ; - rdfs:label "inverse of" . - -s223:lnxConnected a sh:SPARQLFunction ; - rdfs:comment "Given two entities (Junctions or ConnectionPoints), return a Junction in the lnx network, if a path exists." ; - sh:parameter [ a sh:Parameter ; - sh:description "The starting entity" ; - sh:path s223:entity1 ], - [ a sh:Parameter ; - sh:description "The ending entity" ; - sh:path s223:entity2 ] ; - sh:prefixes s223: ; - sh:returnType s223:Junction ; - sh:select """SELECT ?others -WHERE { -$entity1 s223:lnx+ $entity2 . -$entity1 s223:lnx+ ?others . -?others a s223:Junction . -FILTER(?others != $entity1) . -FILTER(?others != $entity2) . -} - """ . - -s223:networkCrossesSystemBoundary a sh:SPARQLFunction ; - rdfs:comment "Given a ConnectionPoint, determine if its contiguous lnx network crosses the containing System boundary. This assumes the network is complete." ; - sh:ask """ -ASK { -$arg1 s223:isConnectionPointOf/^s223:contains ?homeSystem . -$arg1 s223:lnx* ?member . -?class rdfs:subClassOf* s223:ConnectionPoint . -?member a ?class . -?member s223:isConnectionPointOf ?dev . -?dev ^s223:contains ?system . -FILTER (?system != ?homeSystem) . -} - """ ; - sh:parameter [ a sh:Parameter ; - sh:description "The starting ConnectionPoint" ; - sh:path s223:arg1 ] ; - sh:prefixes s223: ; - sh:returnType xsd:boolean . - - rdfs:comment "This graph contains some SPARQLFunction definitions, which are part of SHACL Advanced Features (SHACL AF). Thus, they may not be supported by all SHACL implementations." ; - owl:versionInfo "Created with TopBraid Composer" . - -g36:AirFlowStationAnnotation a sh:NodeShape ; - sh:rule [ a sh:TripleRule ; - sh:condition g36:AirFlowStationRule ; - sh:object g36:AirFlowStation ; - sh:predicate rdf:type ; - sh:subject sh:this ] ; - sh:targetClass s223:Sensor . - -g36:BinaryIn a s223:Class, - sh:NodeShape ; - rdfs:label "Binary in" ; - rdfs:subClassOf s223:EnumeratedObservableProperty ; - sh:rule [ a sh:TripleRule ; - rdfs:comment "An instance of g36:BinaryIn has a value that is a member of the EnumerationKind g36:RunStatus." ; - sh:object g36:RunStatus ; - sh:predicate s223:hasEnumerationKind ; - sh:subject sh:this ] . - -g36:BinaryOut a s223:Class, - sh:NodeShape ; - rdfs:label "Binary out" ; - rdfs:subClassOf s223:EnumeratedActuatableProperty ; - sh:rule [ a sh:TripleRule ; - rdfs:comment "An instance of g36:BinaryOut has a value that is a member of the EnumerationKind g36:RunCommand." ; - sh:object g36:RunCommand ; - sh:predicate s223:hasEnumerationKind ; - sh:subject sh:this ] . - -g36:Damper a s223:Class, - sh:Nodeshape ; - rdfs:label "Damper" ; - rdfs:subClassOf s223:Damper ; - sh:node g36:DamperRule . - -g36:RunCommand-Start a g36:RunCommand ; - rdfs:label "Start" . - -g36:RunCommand-Stop a g36:RunCommand ; - rdfs:label "Stop" . + rdfs:label "inverse of" ; + rdfs:comment "The relation inverseOf is a modeling construct to associate relations that are inverses of one another, such as connectedTo and connectedFrom." . -g36:RunStatus-Off a g36:RunStatus ; - rdfs:label "Off" . - -g36:RunStatus-On a g36:RunStatus ; - rdfs:label "On" . - -g36:RunStatus-Unknown a g36:RunStatus ; - rdfs:label "Unknown" . - -g36:VAV_4-1 a s223:Class, - sh:NodeShape ; - sh:class g36:VAV ; - rdfs:label "g36 vav 4-1" ; - sh:property [ sh:class s223:DomainSpace ; - sh:minCount 1 ; - sh:node [ sh:property [ sh:class g36:Zone ; - sh:minCount 1 ; - sh:path [ sh:inversePath s223:contains ] ] ] ; - sh:path s223:connectedTo ] . - -spin:allProperties a spin:MagicProperty ; - rdfs:label "Find all Properties" ; - spin:body [ a sp:Select ; - sp:resultVariables ( [ sp:varName "value" ] ) ; - sp:where ( [ a sp:TriplePath ; - sp:object s223:hasProperty ; - sp:path [ a sp:ModPath ; - sp:modMax -2 ; - sp:modMin 0 ; - sp:subPath rdfs:subPropertyOf ] ; - sp:subject [ sp:varName "property" ] ] [ sp:object [ sp:varName "value" ] ; - sp:predicate [ sp:varName "property" ] ; - sp:subject spin:_arg1 ] ) ] ; - spin:constraint [ a spl:Argument ; - spl:optional false ; - spl:predicate sp:arg1 ; - rdfs:comment "The resource that has Properties" ] ; - spin:returnType rdfs:Class ; - rdfs:subClassOf spin:MagicProperties . - -s223:Constant a s223:Class, - sh:NodeShape ; - rdfs:label "Constant" ; - rdfs:comment "A constant is a parameter with constant value, used by the function block to produce one or more output (ex. pi)." ; - rdfs:subClassOf s223:Concept, - s223:Parameter ; - sh:property [ rdfs:comment "An instance of Constant can be associated with any number of Property instances using the relation 'uses'." ; - sh:class s223:Property ; - sh:path s223:uses ] . + a owl:Ontology ; + sh:declare [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; + sh:prefix "s223" ], + [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; + sh:prefix "rdfs" ], + [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; + sh:prefix "s223" ], + [ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ; + sh:prefix "rdf" ], + [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; + sh:prefix "rdfs" ], + [ sh:namespace "http://www.w3.org/ns/shacl#"^^xsd:anyURI ; + sh:prefix "sh" ], + [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; + sh:prefix "rdfs" ], + [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; + sh:prefix "s223" ], + [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; + sh:prefix "s223" ], + [ sh:namespace "http://data.ashrae.org/standard223/1.0/vocab/role#"^^xsd:anyURI ; + sh:prefix "role" ], + [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; + sh:prefix "qudtqk" ], + [ sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ; + sh:prefix "unit" ], + [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; + sh:prefix "rdfs" ], + [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; + sh:prefix "qudt" ], + [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; + sh:prefix "quantitykind" ], + [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; + sh:prefix "s223" ], + [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; + sh:prefix "s223" ], + [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; + sh:prefix "qudt" ] . -s223:Domain-HVAC a s223:EnumerationKind-Domain ; - rdfs:label "Domain-HVAC" ; - rdfs:comment "The domain HVAC represents equipment used to provide space conditioning and ventilation within a building. Example equipment that might fall within an HVAC domain include fans, pumps, air-handling units, and variable air volume boxes. " . +bacnet:device-identifier a rdf:Property ; + rdfs:label "Device Identifier" ; + rdfs:comment "The Object_Identifier property of the device object within the BACnet device. See ASHRAE 135-2020 Clause 12.11.1." . + +bacnet:device-name a rdf:Property ; + rdfs:label "Device Name" ; + rdfs:comment "The name of the BACnet device being referenced, more formally the Object_Name property of the device object within the BACnet device. See ASHRAE 135-2020 Clause 12.11.2." . + +bacnet:object-identifier a rdf:Property ; + rdfs:label "object-identifier" ; + rdfs:comment "The Object_Identifier property of the object being referenced. For example, for the object identifier of an Analog Value Object, see ASHRAE 135-2020 Clause 12.4.1." . + +bacnet:object-name a rdf:Property ; + rdfs:label "Object Name" ; + rdfs:comment "The Object_Name property of the object being referenced. For example, for the object name of an Analog Value Object, see ASHRAE 135-2020 Clause 12.4.2." . + +bacnet:priority-for-writing a rdf:Property ; + rdfs:label "Priority for Writing" ; + rdfs:comment """This parameter shall be an integer in the range 1..16, which indicates the priority assigned to the WriteProperty service. If an attempt +is made to write to a commandable property without specifying the bacnet:priority-for-writing, a default priority of 16 (the lowest priority) shall +be assumed. If an attempt is made to write to a property that is not commandable with a specified priority, the priority shall be +ignored. See ASHRAE 135-2020 Clause 15.9.1.1.5.""" . + +bacnet:property-array-index a rdf:Property ; + rdfs:label "Property Array Index" ; + rdfs:comment """If the property identified is of datatype array, this optional property of type Unsigned shall indicate the array index of +the element of the property referenced by the ReadProperty service or the Read Access Specification of the ReadPropertyMultiple service. If the bacnet:property-array-index is omitted, this shall mean that the entire +array shall be referenced. See ASHRAE 135-2020 Clause 15.5.1.1.3 and Clause 15.7.1.1.1.""" . + +bacnet:property-identifier a rdf:Property ; + rdfs:label "Property Identifier" ; + rdfs:comment "The Object_Identifier property of the object being referenced. For example, for the object identifier of an Analog Value Object, see ASHRAE 135-2020 Clause 12.4.1." . + +s223:DCNegativeVoltage-190.0V a s223:DCVoltage-DCNegativeVoltage ; + rdfs:label "DCNegativeVoltage-190.0V" ; + s223:hasVoltage s223:Voltage-190V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCNegativeVoltage-190.0V" . + +s223:DCNegativeVoltage-2.5V a s223:DCVoltage-DCNegativeVoltage ; + rdfs:label "DCNegativeVoltage-2.5V" ; + s223:hasVoltage s223:Voltage-2V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCNegativeVoltage-2.5V" . + +s223:DCNegativeVoltage-3.0V a s223:DCVoltage-DCNegativeVoltage ; + rdfs:label "DCNegativeVoltage-3.0V" ; + s223:hasVoltage s223:Voltage-3V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCNegativeVoltage-3.0V" . + +s223:DCNegativeVoltage-380.0V a s223:DCVoltage-DCNegativeVoltage ; + rdfs:label "DCNegativeVoltage-380.0V" ; + s223:hasVoltage s223:Voltage-380V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCNegativeVoltage-380.0V" . + +s223:DCNegativeVoltage-48.0V a s223:DCVoltage-DCNegativeVoltage ; + rdfs:label "DCNegativeVoltage-48.0V" ; + s223:hasVoltage s223:Voltage-48V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCNegativeVoltage-48.0V" . + +s223:DCNegativeVoltage-5.0V a s223:DCVoltage-DCNegativeVoltage ; + rdfs:label "DCNegativeVoltage-5.0V" ; + s223:hasVoltage s223:Voltage-5V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCNegativeVoltage-5.0V" . + +s223:DCPositiveVoltage-190.0V a s223:DCVoltage-DCPositiveVoltage ; + rdfs:label "DCPositiveVoltage-190.0V" ; + s223:hasVoltage s223:Voltage-190V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCPositiveVoltage-190.0V" . + +s223:DCPositiveVoltage-2.5V a s223:DCVoltage-DCPositiveVoltage ; + rdfs:label "DCPositiveVoltage-2.5V" ; + s223:hasVoltage s223:Voltage-2V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCPositiveVoltage-2.5V" . + +s223:DCPositiveVoltage-3.0V a s223:DCVoltage-DCPositiveVoltage ; + rdfs:label "DCPositiveVoltage-3.0V" ; + s223:hasVoltage s223:Voltage-3V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCPositiveVoltage-3.0V" . + +s223:DCPositiveVoltage-380.0V a s223:DCVoltage-DCPositiveVoltage ; + rdfs:label "DCPositiveVoltage-380.0V" ; + s223:hasVoltage s223:Voltage-380V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCPositiveVoltage-380.0V" . + +s223:DCPositiveVoltage-48.0V a s223:DCVoltage-DCPositiveVoltage ; + rdfs:label "DCPositiveVoltage-48.0V" ; + s223:hasVoltage s223:Voltage-48V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCPositiveVoltage-48.0V" . + +s223:DCPositiveVoltage-5.0V a s223:DCVoltage-DCPositiveVoltage ; + rdfs:label "DCPositiveVoltage-5.0V" ; + s223:hasVoltage s223:Voltage-5V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCPositiveVoltage-5.0V" . -s223:EnumeratedActuatableProperty a s223:Class, - sh:NodeShape ; - rdfs:label "Enumerated actuatable property" ; - rdfs:comment "An EnumeratedActuatableProperty is a property with an enumerated (fixed) set of possible values that can be changed (actuated)" ; - rdfs:subClassOf s223:ActuatableProperty, - s223:EnumerableProperty . - -s223:FlowEquipment a s223:Class, +s223:Damper a s223:Class, sh:NodeShape ; - rdfs:label "Flow Equipment" ; + rdfs:label "Damper" ; + rdfs:comment "An element inserted into an air-distribution system or element of an air-distribution system permitting modification of the air resistance of the system and consequently changing the airflow rate or shutting off the airflow." ; rdfs:subClassOf s223:Equipment ; - sh:property [ a sh:PropertyShape ; - rdfs:comment "An instance of Flow Equipment must be associated with any number of ConnectionPoint instances using the relation 'has connection point'." ; - sh:class s223:ConnectionPoint ; - sh:minCount 2 ; - sh:name "Inlet or Outlet point property" ; - sh:path s223:hasConnectionPoint ; - sh:severity sh:Info ] . - -s223:FunctionInput a s223:Class, - sh:NodeShape ; - rdfs:label "Input" ; - rdfs:comment "A Function Input is an input to a Function Block. It can be related to a property by s223:uses." ; - rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "An instance of Input must be associated with one Property instance using the relation 'uses'." ; - sh:class s223:Property ; - sh:maxCount 1 ; - sh:message "This Function Input must be associated with exactly one property by s223:uses predicate." ; - sh:minCount 1 ; - sh:path s223:uses ], - [ sh:class s223:FunctionBlock ; - sh:maxCount 1 ; - sh:message "This Input must be associated with exactly one FunctionBlock." ; - sh:minCount 1 ; - sh:path [ sh:inversePath s223:hasInput ] ] . - -s223:FunctionOutput a s223:Class, - sh:NodeShape ; - rdfs:label "Output" ; - rdfs:comment "A Function Output is an output from a Function Block and represents the action the function block has on the value its Function Input propert(ies). It is related to a property by s223:produces." ; - rdfs:subClassOf s223:Concept ; - sh:property [ sh:class s223:FunctionBlock ; - sh:maxCount 1 ; - sh:message "This Output must be associated with exactly one FunctionBlock." ; + sh:property [ rdfs:comment "A Damper shall have at least one inlet using the medium Air.", + "Does this need to allow bidirectional connection points?" ; sh:minCount 1 ; - sh:path [ sh:inversePath s223:hasOutput ] ], - [ rdfs:comment "An instance of Output must be associated with any number of Property instances using the relation 'produces'." ; - sh:class s223:Property ; - sh:maxCount 1 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Medium-Air ; + sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "A Damper shall have at least one outlet using the medium Air." ; sh:minCount 1 ; - sh:path s223:produces ] . + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Medium-Air ; + sh:path s223:hasMedium ] ] ] ] . s223:HeatExchanger a s223:Class, sh:NodeShape ; rdfs:label "Heat exchanger" ; + rdfs:comment "A component intended to transfer heat from one medium to another while keeping the two media separate" ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 4 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A HeatExchanger must be associated with at least 2 InletConnectionPoint using the relation hasConnectionPoint." ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 2 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ], - [ rdfs:comment "A HeatExchanger must be associated with at least 2 OutletConnectionPoint using the relation hasConnectionPoint." ; + sh:property [ rdfs:comment "Heat Exchangers should have the same number of non-electrical inlet and outlet connection points." ; sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 2 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ], - [ rdfs:comment "A HeatExchanger can only have HeatExchanger roles" ; - sh:class s223:Role-HeatExchanger ; + sh:severity sh:Warning ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Heat Exchangers should have the same number of non-electrical inlet and outlet connection points." ; + sh:message "Number of inlets {?incount} are not equivalent with number of outlets {?outcount}." ; + sh:prefixes ; + sh:select """ +SELECT DISTINCT $this ?incount ?outcount +WHERE { +{ +SELECT $this (COUNT (?cpin) AS ?incount) +WHERE { +?cpin a/rdfs:subClassOf* s223:InletConnectionPoint . +$this s223:hasConnectionPoint ?cpin . +?cpin s223:hasMedium ?inmedium . +FILTER NOT EXISTS { + ?inmedium a/rdfs:subClassOf* s223:Medium-Electricity . + } +} +GROUP BY $this +} +{ +SELECT $this (COUNT (?cpout) AS ?outcount) +WHERE { +?cpout a/rdfs:subClassOf* s223:OutletConnectionPoint . +$this s223:hasConnectionPoint ?cpout . +?cpout s223:hasMedium ?outmedium . +FILTER NOT EXISTS { + ?outmedium a/rdfs:subClassOf* s223:Medium-Electricity . + } +} +GROUP BY $this +} +FILTER (?incount != ?outcount) +} +""" ] ], + [ rdfs:comment "A heat exchanger shall have at least 4 connection points." ; + sh:minCount 4 ; + sh:path s223:hasConnectionPoint ], + [ rdfs:comment "If the relation hasRole is present it must associate the HeatExchanger with a EnumerationKind-Role." ; + sh:class s223:EnumerationKind-Role ; sh:path s223:hasRole ] . -s223:Setpoint a s223:Class, +s223:Junction a s223:Class, sh:NodeShape ; - rdfs:label "Setpoint" ; - rdfs:subClassOf s223:Property, - qudt:Quantity ; - sh:property [ rdfs:comment "A Setpoint can be associated with a decimal value using the relation hasDeadband" ; - sh:datatype xsd:decimal ; - sh:path s223:hasDeadband ], - [ rdfs:comment "A Setpoint can be assicated with a decimal value using the relation hasValue" ; - sh:datatype xsd:decimal ; - sh:path s223:hasValue ] ; - sh:rule [ a sh:SPARQLRule ; - rdfs:comment "Infer the hasQuantityKind relationship for a Setpoint if it is unambiguous" ; - sh:construct """ -CONSTRUCT {$this qudt:hasQuantityKind ?qk .} + rdfs:label "Junction" ; + rdfs:comment "A Junction is a modeling construct used when a branching point within a Connection (see `s223:Connection`) is of significance, such as specifying the observation location of a Sensor. When a Junction is used, what might have been modeled as a single, branched Connection is separated into three or more separate Connections, all tied together with the Junction and its associated ConnectionPoints." ; + rdfs:subClassOf s223:Connectable ; + sh:or ( [ sh:property [ rdfs:comment "A Junction shall have at least three ConnectionPoints including (a) at least one inlet and one outlet, or (b) at least one bidirectional connection point." ; + sh:minCount 3 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ; + sh:qualifiedValueShapesDisjoint true ], + [ rdfs:comment "A Junction shall have at least three ConnectionPoints including (a) at least one inlet and one outlet, or (b) at least one bidirectional connection point." ; + sh:minCount 3 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ; + sh:qualifiedValueShapesDisjoint true ] ] [ sh:property [ rdfs:comment "A Junction shall have at least three ConnectionPoints including (a) at least one inlet and one outlet, or (b) at least one bidirectional connection point." ; + sh:minCount 3 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ] ; + sh:qualifiedValueShapesDisjoint true ] ] ) ; + 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." ; + sh:name "Test for compatible declared Medium" ; + sh:path s223:hasMedium ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the associated Junction." ; + sh:message "{$this} with Medium {?m2} is incompatible with {?cp} with Medium {?m1}." ; + sh:prefixes ; + sh:select """ +SELECT $this ?m2 ?cp ?m1 WHERE { -FILTER (NOT EXISTS {$this qudt:hasQuantityKind ?something}) . -$this ^s223:hasSetpoint ?property . -?property qudt:hasQuantityKind ?qk . +$this s223:cnx ?cp . +?cp a/rdfs:subClassOf* s223:ConnectionPoint . +?cp s223:hasMedium ?m1 . +$this s223:hasMedium ?m2 . +FILTER (?m1 != ?m2 ) . +FILTER (NOT EXISTS {?m2 a/rdfs:subClassOf* ?m1}) . +FILTER (NOT EXISTS {?m1 a/rdfs:subClassOf* ?m2}) . } -""" ; - sh:prefixes s223: ] . - -s223:Substance-CO2 a s223:EnumerationKind-Substance ; - rdfs:label "Substance-CO2" . +""" ] ], + [ rdfs:comment "Ensure that the Medium identified by all the associated ConnectionPoints via the s223:hasMedium relation are compatible with one another." ; + sh:name "Test for compatible declared Medium" ; + sh:path s223:hasMedium ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Ensure that the Medium identified by all the associated ConnectionPoints via the s223:hasMedium relation are compatible with one another." ; + sh:message "{?cp1} with Medium {?m1} is incompatible with {?cp2} with Medium {?m2}." ; + sh:prefixes ; + sh:select """ +SELECT $this ?cp1 ?m1 ?cp2 ?m2 +WHERE { +$this s223:cnx ?cp1 . +?cp1 a/rdfs:subClassOf* s223:ConnectionPoint . +?cp1 s223:hasMedium ?m1 . +$this s223:cnx ?cp2 . +?cp2 a/rdfs:subClassOf* s223:ConnectionPoint . +?cp2 s223:hasMedium ?m2 . +FILTER (?m1 != ?m2 ) . +FILTER (NOT EXISTS {?m2 a/rdfs:subClassOf* ?m1}) . +FILTER (NOT EXISTS {?m1 a/rdfs:subClassOf* ?m2}) . +} +""" ] ], + [ rdfs:comment "A Junction must be associated with exactly one EnumerationKind-Medium using the relation hasMedium." ; + sh:class s223:Substance-Medium ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasMedium ] . s223:System a s223:Class, sh:NodeShape ; @@ -1561,37 +2732,241 @@ s223:System a s223:Class, rdfs:comment "A System is a logical grouping (collection) of Equipment for some functional or system reason, such as a chilled water system, or HVAC system. A System does not participate in Connections." ; rdfs:subClassOf s223:Concept ; sh:property [ a sh:PropertyShape ; - rdfs:comment "A System can be associated with zero or any number of other instances of Equipment or System using the relation hasMember" ; - sh:minCount 0 ; + rdfs:comment "A System can be associated with at least two instances of Equipment or System using the relation hasMember" ; + sh:minCount 2 ; sh:or ( [ sh:class s223:Equipment ] [ sh:class s223:System ] ) ; - sh:path s223:hasMember ], - [ rdfs:comment "A System can be associated with any number of EnumerationKind-Roles using the relation hasRole" ; + sh:path s223:hasMember ; + sh:severity sh:Warning ], + [ rdfs:comment "If the relation hasRole is present, it must associate the System with an EnumerationKind-Role." ; sh:class s223:EnumerationKind-Role ; - sh:path s223:hasRole ], - s223:hasPropertyShape . + sh:path s223:hasRole ] . -s223:Window a s223:Class, +s223:Voltage-0V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "0V Voltage" ; + s223:hasValue 0.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-10000V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "10000V Voltage" ; + s223:hasValue 10000.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-110V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "110V Voltage" ; + s223:hasValue 110.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-120V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "120V Voltage" ; + s223:hasValue 120.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-127V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "127V Voltage" ; + s223:hasValue 127.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-139V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "139V Voltage" ; + s223:hasValue 139.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-1730V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "1730V Voltage" ; + s223:hasValue 1730.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-1900V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "1900V Voltage" ; + s223:hasValue 1900.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-219V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "219V Voltage" ; + s223:hasValue 219.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-220V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "220V Voltage" ; + s223:hasValue 220.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-231V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "231V Voltage" ; + s223:hasValue 231.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-2400V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "2400V Voltage" ; + s223:hasValue 2400.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-277V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "277V Voltage" ; + s223:hasValue 277.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-3000V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "3000V Voltage" ; + s223:hasValue 3000.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-3300V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "3300V Voltage" ; + s223:hasValue 3300.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-3460V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "3460V Voltage" ; + s223:hasValue 3460.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-347V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "347V Voltage" ; + s223:hasValue 347.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-3810V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "3810V Voltage" ; + s223:hasValue 3810.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-400V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "400V Voltage" ; + s223:hasValue 400.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-415V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "415V Voltage" ; + s223:hasValue 415.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-4160V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "4160V Voltage" ; + s223:hasValue 4160.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-480V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "480V Voltage" ; + s223:hasValue 480.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-5770V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "5770V Voltage" ; + s223:hasValue 5770.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-6000V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "6000V Voltage" ; + s223:hasValue 6000.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-600V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "600V Voltage" ; + s223:hasValue 600.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-6600V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "6600V Voltage" ; + s223:hasValue 6600.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Zone a s223:Class, sh:NodeShape ; - rdfs:label "Window" ; - rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A Window must provide service using Light." ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Medium-Light ; - sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Window must provide service using Light." ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Medium-Light ; - sh:path s223:hasMedium ] ] ] ] . + rdfs:label "Zone" ; + 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" ; + 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." ; + 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." ; + sh:message "Zone {$this} has a Domain of {?domain}, but it contains a DomainSpace {?ds} which has a Domain of {?dsdomain}. These should be the same." ; + sh:prefixes ; + sh:select """ +SELECT DISTINCT $this ?domain ?ds ?dsdomain +WHERE { +$this a s223:Zone . +$this s223:hasDomain ?domain . +$this s223:contains ?ds . +?ds s223:hasDomain ?dsdomain . +FILTER (?domain != ?dsdomain) +} +""" ] ], + [ rdfs:comment "A Zone must be associated with exactly one EnumerationKind-Domain using the relation hasDomain." ; + sh:class s223:EnumerationKind-Domain ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasDomain ], + [ rdfs:comment "A Zone must be associated with at least one DomainSpace using the relation hasDomainSpace." ; + sh:class s223:DomainSpace ; + sh:minCount 1 ; + sh:path s223:hasDomainSpace ] ; + sh:rule [ a sh:TripleRule ; + rdfs:comment "Infer a hasDomain relation by checking any enclosed DomainSpaces to determine the domain." ; + sh:object [ sh:path ( s223:hasDomainSpace s223:hasDomain ) ] ; + sh:predicate s223:hasDomain ; + sh:subject sh:this ], + [ a sh:TripleRule ; + rdfs:comment "Infer a hasDomain relation by checking any enclosing ZoneGroup to determine the domain." ; + sh:object [ sh:path ( [ sh:inversePath s223:hasZone ] s223:hasDomain ) ] ; + sh:predicate s223:hasDomain ; + sh:subject sh:this ] . s223:actuates a rdf:Property ; rdfs:label "actuates" ; - rdfs:comment "The relation actuates binds an Actuator to the Equipment that it actuates. The Equipment will have the ActuatableProperty that commands the actuator (see `s223:commandedByProperty`)." . + rdfs:comment "The relation actuates binds an Actuator to the Equipment that it actuates. The Equipment will have the ActuatableProperty that commands the Actuator (see `s223:commandedByProperty`)." . s223:connectsFrom a rdf:Property ; rdfs:label "connects from" ; @@ -1599,142 +2974,47 @@ s223:connectsFrom a rdf:Property ; s223:connectsTo a rdf:Property ; rdfs:label "connects to" ; - rdfs:comment "The connectsTo relation binds a specific ConnectionPoint to a Connection; See Figure x.y. The relation connectsTo binds a Connectable thing to a Connection with an implied directionality. A connectsTo B indicates a flow from A to B." . - -s223:executes a rdf:Property ; - rdfs:label "executes" ; - rdfs:comment "The relation executes is used to specify that a controller (see `s223:Controller`) is responsible for the execution of a function block (see `s223:FunctionBlock`). " . + rdfs:comment "The relation connectsTo binds a Connection to a Connectable thing to a Connection with an implied directionality. A connectsTo B indicates a flow from A to B." . s223:hasAspect a rdf:Property ; rdfs:label "has aspect" ; rdfs:comment "hasAspect is used to establish the context of a Property. The value must be an instance of EnumerationKind. For example, if a Property has a Temperature value of 45.3, the hasAspect relation is used to state what that represents, such as a Temperature limit during working hours, etc. A Property can have any number of hasAspect relations, as needed to establish the context." . -s223:hasConstant a rdf:Property ; - rdfs:label "has constant" ; - rdfs:comment "The relation hasConstant is used to relate a constant (see `s223:Constant`) to a function block (see `s223:FunctionBlock`)." . +s223:hasExternalReference a rdf:Property ; + rdfs:label "has external reference" ; + rdfs:comment "The relation hasExternalReference is used to relate a Property to an external telemetry source." . -s223:hasDeadband a rdf:Property ; - rdfs:label "has deadband" . +s223:hasFrequency a rdf:Property ; + rdfs:label "has frequency" ; + rdfs:comment "The relation hasFrequency is used to identify the frequency of an AC electricity enumeration kind. " . + +s223:hasInput a rdf:Property ; + rdfs:label "has function input" ; + rdfs:comment "The relation hasInput is used to relate a FunctionBlock (see `s223:FunctionBlock`) to a Property (see `s223:Property`) that is used as input." . s223:hasMeasurementResolution a rdf:Property ; rdfs:label "has measurement resolution" ; rdfs:comment "The hasMeasurementResolution relation is used to link to a numerical property whose value indicates the smallest recognizable change in engineering units that the sensor can indicate. " . s223:hasMember a rdf:Property ; - rdfs:label "has member" . + rdfs:label "has member" ; + rdfs:comment "The relation hasMember associates a System with its component Equipment and/or Systems." . -s223:hasPhase a rdf:Property ; - rdfs:label "has phase" ; - rdfs:comment "The relation hasPhase is used to indicate the intended phase of the Medium inside a Connection." . +s223:hasNumberOfElectricalPhases a rdf:Property ; + rdfs:label "has number of electrical phases" ; + rdfs:comment "The relation hasNumberOfElectricalPhases is used to identify the number of electrical phases in an AC electricity enumeration kind. " . s223:hasPhysicalLocation a rdf:Property ; rdfs:label "has Physical Location" ; - rdfs:comment "The relation hasPhysicalLocation is used to indicate the physical space (see `s223:PhysicalSpace`) where a piece of equipment (see `s223:Equipment`) is located." . + rdfs:comment "The relation hasPhysicalLocation is used to indicate the PhysicalSpace (see `s223:PhysicalSpace`) where a piece of Equipment (see `s223:Equipment`) is located." . -s223:hasSetpoint a rdf:Property ; - rdfs:label "has setpoint" ; - rdfs:comment "This relation binds a control setpoint to the quantifiable property indicating the desired value which the control process is trying to maintain." . +s223:hasThermodynamicPhase a rdf:Property ; + rdfs:label "has thermodynamic phase" ; + rdfs:comment "The relation hasThermodynamicPhase is used to indicate the thermodynamic phase of the Medium inside a Connection." . s223:ofMedium a rdf:Property ; - rdfs:label "of medium" . - -s223:produces a rdf:Property ; - rdfs:label "produces" ; - rdfs:comment "The relation produces is used to relate a function output (see `s223:FunctionOutput`) to a property (see `s223:Property`). This allows one to specify that the value of this property is produced by the function block output, allowing the users of the model to understand that the value of the property is the result of the algorithm defined by the function block. " . - -s223:scp a rdf:Property . - -g36:AirFlowStation a s223:Class, - sh:NodeShape ; - rdfs:label "Air Flow Station" ; - rdfs:subClassOf s223:Sensor ; - sh:node g36:AirFlowStationRule . - -g36:AnalogOut a s223:Class, - sh:NodeShape ; - rdfs:label "Analog out" ; - rdfs:subClassOf s223:QuantifiableActuatableProperty ; - sh:rule [ a sh:TripleRule ; - rdfs:comment "An AnalogOut is a QuantifiableActuatableProperty." ; - sh:object s223:QuantifiableActuatableProperty ; - sh:predicate rdf:type ; - sh:subject sh:this ] . - -g36:DamperRule a sh:NodeShape ; - sh:class s223:Damper ; - sh:property [ sh:path s223:hasProperty ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class g36:AnalogOut ; - sh:property [ sh:hasValue s223:QuantityKind-RelativePosition ; - sh:path qudt:hasQuantityKind ] ] ] . - -g36:EnumerationKind-Position a s223:Class, - g36:EnumerationKind-Position, - sh:NodeShape ; - rdfs:label "For properties related to position" ; - rdfs:comment "Would like to move this to vocab with other property enumeration kinds" ; - rdfs:subClassOf s223:EnumerationKind . - -g36:VAV a s223:Class, - sh:NodeShape ; - rdfs:label "VAV" ; - rdfs:subClassOf s223:SingleDuctTerminal ; - sh:node g36:VAVRule . - -g36:VAVRule a sh:NodeShape ; - sh:class s223:SingleDuctTerminal ; - sh:property [ sh:class s223:Damper ; - sh:path s223:contains ], - [ sh:path s223:hasProperty ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class g36:AnalogIn ; - sh:property [ sh:hasValue quantitykind:VolumeFlowRate ; - sh:path qudt:hasQuantityKind ] ] ] . - -g36:Zone a s223:Class, - sh:Nodeshape ; - rdfs:label "Zone with relevant points" ; - rdfs:subClassOf s223:Zone ; - sh:node g36:ZoneRule . - -g36:ZoneRule a sh:NodeShape ; - sh:class s223:Zone ; - sh:property [ sh:hasValue s223:Domain-HVAC ; - sh:minCount 1 ; - sh:path s223:hasDomain ], - [ rdfs:comment "Zone Temp" ; - sh:path s223:hasProperty ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class g36:AnalogIn ; - sh:node [ sh:property [ sh:hasValue quantitykind:Temperature ; - sh:path qudt:hasQuantityKind ] ] ] ], - [ rdfs:comment "Zone CO2" ; - sh:path s223:hasProperty ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class g36:AnalogIn ; - sh:node [ sh:property [ sh:hasValue quantitykind:Concentration ; - sh:path qudt:hasQuantityKind ], - [ sh:hasValue s223:Substance-CO2 ; - sh:path s223:ofSubstance ] ] ] ], - [ rdfs:comment "Zone Occupancy" ; - sh:path s223:hasProperty ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class g36:AnalogIn ; - sh:node [ sh:property [ sh:class s223:QuantityKind-Occupancy ; - sh:path qudt:QuantityKind ] ] ] ], - [ rdfs:comment "Window Switch (Should there be an Open/Close Enumeratable property?) " ; - sh:path s223:contains ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:DomainSpace ; - sh:node [ sh:property [ sh:class s223:Window ; - sh:node [ sh:property [ sh:class s223:Sensor ; - sh:path [ sh:inversePath s223:hasMeasurementLocation ] ] ] ; - sh:path s223:connectedTo ] ] ] ] . - - -rdfs:comment a rdf:Property ; - rdfs:label "Description of constraints for s223" ; - rdfs:subPropertyOf rdfs:comment . + rdfs:label "of medium" ; + rdfs:comment "The relation ofMedium is used to associate a Property with a specific Medium." . s223:AbstractSensor a s223:Class, sh:NodeShape ; @@ -1742,53 +3022,96 @@ s223:AbstractSensor a s223:Class, s223:abstract true ; rdfs:comment "This is an abstract class that represents properties that are common to all sensor types." ; rdfs:subClassOf s223:Equipment ; - sh:property [ rdfs:comment "A Sensor can be associated with a QuantifiableProperty by hasMeasurementResolution" ; + sh:property [ rdfs:comment "If the relation hasMeasurementResolution is present it must associate the AbstractSensor with a QuantifiableProperty." ; sh:class s223:QuantifiableProperty ; sh:path s223:hasMeasurementResolution ], - [ rdfs:comment "A Sensor can be associated with at most 1 ObservableProperty by observes" ; + [ rdfs:comment "An AbstractSensor must be associated with exactly one ObservableProperty using the relation observes." ; sh:class s223:ObservableProperty ; sh:maxCount 1 ; sh:minCount 1 ; - sh:path s223:observes ], - [ sh:name "Test for compatible declared Substances" ; - sh:path s223:measuresSubstance ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Ensure that the Substance identified by a sensor via the s223:measuresSubstance relation is compatible with the Substance identified by the Property being measured via the s223:ofSubstance relation." ; - sh:message "Sensor {$this} measures substance {?a}, but the measured Property identifies an incompatible substance of {?b} via the s223:ofSubstance relation." ; - sh:prefixes s223: ; - sh:select """ -SELECT DISTINCT $this ?a ?b -WHERE { -$this s223:measuresSubstance ?a . -$this s223:observes/s223:ofSubstance ?b . -?a a/rdfs:subClassOf* s223:EnumerationKind . -?b a/rdfs:subClassOf* s223:EnumerationKind . -FILTER (?a != ?b ) . -FILTER (NOT EXISTS {?b a/rdfs:subClassOf* ?a}) . -FILTER (NOT EXISTS {?a a/rdfs:subClassOf* ?b}) . -} -""" ] ] . + sh:path s223:observes ] . + +s223:Aspect-Effectiveness a s223:Aspect-Effectiveness, + s223:Class, + sh:NodeShape ; + rdfs:label "Aspect-Effectiveness" ; + rdfs:comment "This class enumerates the possible states of effectiveness" ; + rdfs:subClassOf s223:EnumerationKind-Aspect . + +s223:DCNegativeVoltage-12.0V a s223:DCVoltage-DCNegativeVoltage ; + rdfs:label "DCNegativeVoltage-12.0V" ; + s223:hasVoltage s223:Voltage-12V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCNegativeVoltage-12.0V" . + +s223:DCNegativeVoltage-24.0V a s223:DCVoltage-DCNegativeVoltage ; + rdfs:label "DCNegativeVoltage-24.0V" ; + s223:hasVoltage s223:Voltage-24V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCNegativeVoltage-24.0V" . + +s223:DCNegativeVoltage-6.0V a s223:DCVoltage-DCNegativeVoltage ; + rdfs:label "DCNegativeVoltage-6.0V" ; + s223:hasVoltage s223:Voltage-6V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCNegativeVoltage-6.0V" . + +s223:DCPositiveVoltage-12.0V a s223:DCVoltage-DCPositiveVoltage ; + rdfs:label "DCPositiveVoltage-12.0V" ; + s223:hasVoltage s223:Voltage-12V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCPositiveVoltage-12.0V" . + +s223:DCPositiveVoltage-24.0V a s223:DCVoltage-DCPositiveVoltage ; + rdfs:label "DCPositiveVoltage-24.0V" ; + s223:hasVoltage s223:Voltage-24V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCPositiveVoltage-24.0V" . + +s223:DCPositiveVoltage-6.0V a s223:DCVoltage-DCPositiveVoltage ; + rdfs:label "DCPositiveVoltage-6.0V" ; + s223:hasVoltage s223:Voltage-6V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "DCPositiveVoltage-6.0V" . -s223:BidirectionalConnectionPoint a s223:Class, +s223:DomainSpace a s223:Class, sh:NodeShape ; - rdfs:label "Bidirectional Connection Point" ; - rdfs:comment "A BidirectionalConnectionPoint is a predefined subclass of ConnectionPoint. Using a BidirectionalConnectionPoint implies that the flow direction is not fixed in one direction. It depends on the status of some other part of the system, such as a valve position, that is expected to change during operation (see `s223:Direction-Bidirectional`) or to model energy transfer occurring without specific flow direction." ; - rdfs:subClassOf s223:ConnectionPoint . + rdfs:label "Domain Space" ; + 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." ; + rdfs:subClassOf s223:Connectable ; + sh:property [ rdfs:comment "A DomainSpace must be enclosed by a PhysicalSpace." ; + sh:message "A DomainSpace must be enclosed by a PhysicalSpace." ; + 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." ; + sh:class s223:EnumerationKind-Domain ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasDomain ] ; + sh:rule [ a sh:TripleRule ; + rdfs:comment "Infer a hasDomain relation by checking any enclosing Zone to determine the domain." ; + sh:object [ sh:path ( [ sh:inversePath s223:hasDomainSpace ] s223:hasDomain ) ] ; + sh:predicate s223:hasDomain ; + sh:subject sh:this ] . s223:EnumerableProperty a s223:Class, sh:NodeShape ; rdfs:label "Enumerable Property" ; + rdfs:comment "An EnumerableProperty is a property with an enumerated (fixed) set of possible values." ; rdfs:subClassOf s223:Property ; - sh:property [ rdfs:comment "An EnumerableProperty must be associated with one EnumerationKind using the relation hasEnumerationKind" ; - sh:class s223:EnumerationKind ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:path s223:hasEnumerationKind ], - [ rdfs:comment "Checks for valid enumeration value" ; + sh:property [ rdfs:comment "Checks for valid enumeration value consistent with the stated EnumerationKind." ; sh:path s223:hasValue ; sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Checks for valid enumeration value consistent with the stated EnumerationKind." ; sh:message "{$this} has an enumeration value of {?value} which is not a valid {?kind}." ; - sh:prefixes s223: ; + sh:prefixes ; sh:select """ SELECT $this ?value ?kind WHERE { @@ -1796,184 +3119,185 @@ $this s223:hasValue ?value . $this s223:hasEnumerationKind ?kind . FILTER (NOT EXISTS {?value a/rdfs:subClassOf* ?kind}) . } -""" ] ] . - -s223:EnumeratedObservableProperty a s223:Class, - sh:NodeShape ; - rdfs:label "Enumerated observable property" ; - rdfs:comment "An EnumeratedActuatableProperty is a property with an enumerated (fixed) set of possible values that can only be observed (not changed)" ; - rdfs:subClassOf s223:EnumerableProperty, - s223:ObservableProperty . +""" ] ], + [ rdfs:comment "An EnumerableProperty must be associated with exactly one EnumerationKind using the relation hasEnumerationKind." ; + sh:class s223:EnumerationKind ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasEnumerationKind ] . -s223:EnumerationKind-Effectiveness a s223:Class, - s223:EnumerationKind-Effectiveness, +s223:ExternalReference a s223:Class, sh:NodeShape ; - rdfs:label "Effectiveness" ; - rdfs:subClassOf s223:EnumerationKind . + rdfs:label "ExternalReference" ; + s223:abstract true ; + rdfs:comment "ExternalReference is an abstract class that represents a thing that contains API or protocol parameter values necessary to associate a property with a value." ; + rdfs:subClassOf s223:Concept . s223:Fan a s223:Class, sh:NodeShape ; rdfs:label "Fan" ; + rdfs:comment "A machine used to create flow within a gas such as air. " ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A Fan must provide service using Air." ; + sh:property [ rdfs:comment "A Fan shall have at least one inlet using the medium Air." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Fan must provide service using Air." ; + [ rdfs:comment "A Fan shall have at least one outlet using the medium Air." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Air ; sh:path s223:hasMedium ] ] ] ] . -s223:Junction a s223:Class, - sh:NodeShape ; - rdfs:label "Junction" ; - rdfs:comment "A Junction is used to join two or more Segments together. This might be where a duct splits or joins." ; - rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "A Junction should be associated with at least two Segments using the relation lnx" ; - sh:class s223:Segment ; - sh:message "Junction is missing one or more Segments" ; - sh:minCount 2 ; - sh:path s223:lnx ; - sh:severity sh:Info ] . +s223:LineNeutralVoltage-208V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "208V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-208V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . -s223:ManualValve a s223:Class, - sh:NodeShape ; - rdfs:label "Manual Valve" ; - rdfs:subClassOf s223:Valve . +s223:LineNeutralVoltage-24V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "24V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-24V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . s223:Medium-NaturalGas a s223:Class, - s223:Medium-NaturalGas ; - rdfs:label "Medium-NaturalGas" ; - rdfs:subClassOf s223:EnumerationKind-Medium . - -s223:MotorizedValve a s223:Class, - sh:NodeShape ; - rdfs:label "Motorized Valve" ; - rdfs:subClassOf s223:Valve . - -s223:Parameter a s223:Class, + s223:Medium-NaturalGas, sh:NodeShape ; - rdfs:label "Parameter" ; - rdfs:comment "A parameter belongs to exactly one Function Block." ; - rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "An instance of Parameter can be associated with any number of Property instances using the relation 'uses'." ; - sh:class s223:Property ; - sh:path s223:uses ], - [ sh:class s223:FunctionBlock ; - sh:maxCount 1 ; - sh:message "This Parameter must be associated with exactly one FunctionBlock." ; - sh:minCount 1 ; - sh:path [ sh:inversePath s223:hasParameter ] ] . + rdfs:label "Medium-NaturalGas" ; + rdfs:comment "This class has enumerated instances of natural gas in various states." ; + rdfs:subClassOf s223:Substance-Medium . s223:Phase-Gas a s223:Class, s223:Phase-Gas, sh:NodeShape ; rdfs:label "Phase-Gas" ; + rdfs:comment "This class has enumerated instances of gas in various thermodynamic states." ; rdfs:subClassOf s223:EnumerationKind-Phase . s223:Phase-Liquid a s223:Class, s223:Phase-Liquid, sh:NodeShape ; rdfs:label "Phase-Liquid" ; + rdfs:comment "This class has enumerated instances of liquid in various thermodynamic states." ; rdfs:subClassOf s223:EnumerationKind-Phase . -s223:PhysicalSpace a s223:Class, - sh:NodeShape ; - rdfs:label "Physical Space" ; - rdfs:comment "A PhysicalSpace is an architectural concept representing a room, a collection of rooms such as a floor, a part of a room, or any physical space that might not even be thought of as a room, such as a patio space or a roof." ; - rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "A PhysicalSpace can be associated with any number of other PhysicalSpaces using the relation contains" ; - sh:class s223:PhysicalSpace ; - sh:path s223:contains ], - [ rdfs:comment "A PhysicalSpace can be associated with any number of DomainSpaces using the relation encloses" ; - sh:class s223:DomainSpace ; - sh:path s223:encloses ] . - -s223:QuantifiableActuatableProperty a s223:Class, +s223:QuantifiableObservableProperty a s223:Class, sh:NodeShape ; - rdfs:label "Quantifiable Actuatable Property" ; - rdfs:comment "This class is for quantifiable properties of which numerical values are specified to be modifiable by a user or a machine outside of the model, like a setpoint." ; - rdfs:subClassOf s223:ActuatableProperty, + rdfs:label "Quantifiable Observable Property" ; + rdfs:comment "This class is for quantifiable properties of which numerical values cannot be modified by a user or a machine outside of the model, but only observed, like a temperature reading or a voltage measure." ; + rdfs:subClassOf s223:ObservableProperty, s223:QuantifiableProperty . -s223:QuantityKind-Occupancy a s223:Class, - s223:QuantityKind-Occupancy, - qudt:QuantityKind ; - rdfs:label "quantitykind-occupancy" . - -s223:QuantityKind-RelativePosition a s223:Class, - s223:QuantityKind-RelativePosition, - qudt:QuantityKind ; - rdfs:label "quantitykind-relativeposition" . - -s223:Role-Cooling a s223:EnumerationKind-Role ; - rdfs:label "Role-Cooling" . - -s223:SingleDuctTerminal a s223:Class, - sh:NodeShape ; - rdfs:label "A single duct air terminal that contains a damper." ; - rdfs:subClassOf s223:TerminalUnit ; - sh:property [ rdfs:comment "A SingleDuctTerminal must be associated with at least 1 Damper by contains." ; - sh:minCount 1 ; - sh:path s223:contains ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:Damper ] ] . +s223:Role-Controller a s223:EnumerationKind-Role ; + rdfs:label "Role-Controller" . s223:Valve a s223:Class, sh:NodeShape ; rdfs:label "Valve" ; + rdfs:comment "A device to regulate or stop the flow of fluid in a pipe or a duct by throttling." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A Valve must be associated with at least 1 InletConnectionPoint using the relation hasConnectionPoint." ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ], - [ rdfs:comment "A Valve must be associated with at least 1 OutletConnectionPoint using the relation hasConnectionPoint." ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ] . + sh:or ( [ sh:property [ rdfs:comment "A Valve shall have at least one inlet and one outlet or two bidirectional connection points." ; + sh:minCount 1 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ; + sh:qualifiedValueShapesDisjoint true ], + [ rdfs:comment "A Valve shall have at least one inlet and one outlet or two bidirectional connection points." ; + sh:minCount 1 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ; + sh:qualifiedValueShapesDisjoint true ] ] [ sh:property [ rdfs:comment "A Valve shall have at least one inlet and one outlet or two bidirectional connection points." ; + sh:minCount 2 ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 2 ; + sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ] ; + sh:qualifiedValueShapesDisjoint true ] ] ) . + +s223:Voltage-208V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "208V Voltage" ; + s223:hasValue 208.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-240V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "240V Voltage" ; + s223:hasValue 240.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-2V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "2V Voltage" ; + s223:hasValue 2.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-3V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "3V Voltage" ; + s223:hasValue 3.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . s223:commandedByProperty a rdf:Property ; rdfs:label "commanded by Property" ; rdfs:comment "The relation commandedByProperty binds an Actuator to the ActuatableProperty that it responds to. This Property will be owned by the equipment that it actuates (see `s223:actuates`)." . s223:connectedThrough a rdf:Property ; - rdfs:label "connected through" . + rdfs:label "connected through" ; + rdfs:comment "The relation connectedThrough associates a Connectable with a Connection." . s223:encloses a rdf:Property ; rdfs:label "encloses" ; rdfs:comment "The relation encloses is used to indicate that a domain space (see: `s223:DomainSpace`) can be found inside a physical space (see `s223:PhysicalSpace`). " . -s223:hasInput a rdf:Property ; - rdfs:label "has function input" ; - rdfs:comment "The relation hasInput is used to relate a function input (see `s223:FunctionInput`) to a function block (see `s223:FunctionBlock`). " . +s223:hasElectricalPhase a rdf:Property ; + rdfs:label "has electrical phase" ; + rdfs:comment "The relation hasElectricalPhase is used to indicate the electrical phase identifier or the relevant electrical phases for a voltage difference for AC electricity inside a Connection." . s223:hasOutput a rdf:Property ; rdfs:label "has function output" ; - rdfs:comment "The relation hasOutput is used to relate a function output (see `s223:FunctionOutput`) to a function block (see `s223:FunctionBlock`). " . + rdfs:comment "The relation hasOutput is used to relate a FunctionBlock (see `s223:FunctionBlock`) to a Property (see `s223:Property`) that is calculated by the FunctionBlock." . -s223:hasParameter a rdf:Property ; - rdfs:label "has parameter" ; - rdfs:comment "A Parameter (`s223:Parameter`) is associated to a function block (`s223:FunctionBlock`) using the relation hasParameter. " . +rdfs:comment a rdf:Property ; + rdfs:label "comment" ; + rdfs:comment "Description of constraints for s223." ; + rdfs:subPropertyOf rdfs:comment . -s223:ofSubstance a rdf:Property ; - rdfs:label "of substance" . +s223:Aspect-DayOfWeek a s223:Aspect-DayOfWeek, + s223:Class, + sh:NodeShape ; + rdfs:label "Day of Week" ; + rdfs:comment "This class has enumerated instances of Monday, Tuesday, Wednesday, Thursday, Friday, Saturday and Sunday. The Weekend and Weekday EnumerationKinds define subsets of this EnumerationKind for Mon-Fri and Sat,Sun, respectively" ; + rdfs:subClassOf s223:EnumerationKind-Aspect . -g36:AirFlowStationRule a sh:NodeShape ; - sh:class s223:Sensor ; - sh:property [ sh:class s223:QuantifiableObservableProperty ; +s223:Coil a s223:Class, + sh:NodeShape ; + rdfs:label "Coil" ; + rdfs:comment "A cooling or heating element made of pipe or tube that may or may not be finned and formed into helical or serpentine shape." ; + rdfs:subClassOf s223:HeatExchanger ; + sh:property [ rdfs:comment "A Coil shall have at least one inlet using the medium Air." ; sh:minCount 1 ; - sh:path s223:observes ], - [ sh:class s223:Medium-Air ; + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Medium-Air ; + sh:path s223:hasMedium ] ] ] ], + [ rdfs:comment "A Coil shall have at least one outlet using the medium Air." ; sh:minCount 1 ; - sh:path s223:measuresSubstance ] . + sh:path s223:hasConnectionPoint ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; + sh:node [ sh:property [ sh:class s223:Medium-Air ; + sh:path s223:hasMedium ] ] ] ] . s223:DayOfWeek-Weekend a s223:Class, s223:DayOfWeek-Weekend, @@ -1981,14 +3305,27 @@ s223:DayOfWeek-Weekend a s223:Class, rdfs:label "Day of week-Weekend", "Weekend" ; rdfs:comment "This class defines the EnumerationKind values of Saturday and Sunday" ; - rdfs:subClassOf s223:EnumerationKind-DayOfWeek . + rdfs:subClassOf s223:Aspect-DayOfWeek . -s223:EnumerationKind-DayOfWeek a s223:Class, - s223:EnumerationKind-DayOfWeek, +s223:EnumeratedObservableProperty a s223:Class, sh:NodeShape ; - rdfs:label "Day of Week" ; - rdfs:comment "This class has enumerated instances of Monday, Tuesday, Wednesday, Thursday, Friday, Saturday and Sunday. The Weekend and Weekday EnumerationKinds define subsets of this EnumerationKind for Mon-Fri and Sat,Sun, respectively" ; - rdfs:subClassOf s223:EnumerationKind . + rdfs:label "Enumerated observable property" ; + rdfs:comment "An EnumeratedObservableProperty is a property with an enumerated (fixed) set of possible values that cannot be changed (can only be observed)." ; + rdfs:subClassOf s223:EnumerableProperty, + s223:ObservableProperty . + +s223:FunctionBlock a s223:Class, + sh:NodeShape ; + rdfs:label "Function block" ; + rdfs:comment "A FunctionBlock 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." ; + rdfs:subClassOf s223:Concept ; + sh:or ( [ sh:property [ rdfs:comment "A Function block must be associated with at least one Property using the relation hasInput." ; + sh:class s223:Property ; + sh:minCount 1 ; + sh:path s223:hasInput ] ] [ sh:property [ rdfs:comment "A Function block must be associated with at least one Property using the relation hasOutput." ; + sh:class s223:Property ; + sh:minCount 1 ; + sh:path s223:hasOutput ] ] ) . s223:LightSensor a s223:Class, sh:NodeShape ; @@ -1996,185 +3333,242 @@ s223:LightSensor a s223:Class, rdfs:comment "A LightSensor is a specialization of a Sensor that observes a QuantifiableObservableProperty that represents a luminance measurement." ; rdfs:subClassOf s223:Sensor . -s223:Medium-Refrigerant a s223:Class, - s223:Medium-Refrigerant, - sh:NodeShape ; - rdfs:label "Medium-Refrigerant" ; - rdfs:subClassOf s223:EnumerationKind-Medium . +s223:LineNeutralVoltage-110V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "110V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-110V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineNeutralVoltage-127V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "127V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-127V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineNeutralVoltage-139V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "139V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-139V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineNeutralVoltage-1730V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "1730V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-1730V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineNeutralVoltage-1900V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "1900V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-1900V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineNeutralVoltage-219V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "219V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-219V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineNeutralVoltage-231V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "231V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-231V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineNeutralVoltage-2400V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "2400V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-2400V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineNeutralVoltage-240V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "240V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-240V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineNeutralVoltage-277V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "277V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-277V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineNeutralVoltage-3460V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "3460V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-3460V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineNeutralVoltage-347V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "347V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-347V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineNeutralVoltage-3810V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "3810V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-3810V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineNeutralVoltage-5770V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "5770V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-5770V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Medium-Oil a s223:Class, + s223:Medium-Oil, + sh:NodeShape ; + rdfs:label "Medium-Oil" ; + rdfs:comment "This class has enumerated instances of oil." ; + rdfs:subClassOf s223:Substance-Medium . s223:ObservableProperty a s223:Class, sh:NodeShape ; rdfs:label "Observable Property" ; - rdfs:comment "This class describes non-numeric properties of which real-time value cannot be modified by a user or a machine outside of the model. Sensors reading are typically observable properties as their value naturally fluctuate, but is not meant to be modified by a user." ; + rdfs:comment "This class describes non-numeric properties of which real-time value cannot be modified by a user or a machine outside of the model. Sensor readings are typically observable properties as their values naturally fluctuate, but are not meant to be modified by a user." ; rdfs:subClassOf s223:Property . -s223:Occupancy-Motion a s223:Class, - s223:Occupancy-Motion, - sh:NodeShape ; - rdfs:label "Occupancy Motion" ; - rdfs:subClassOf s223:EnumerationKind-Occupancy . - -s223:Occupancy-Presence a s223:Class, - s223:Occupancy-Presence, - sh:NodeShape ; - rdfs:label "Occupancy Presence" ; - rdfs:subClassOf s223:EnumerationKind-Occupancy . - s223:OccupancySensor a s223:Class, sh:NodeShape ; rdfs:label "Occupancy sensor" ; - rdfs:comment "An OccuppancySensor is a specialization of a Sensor that observes a Property that represents measurement of occupancy in a space." ; + rdfs:comment "An OccupancySensor is a subclass of a Sensor that observes a Property that represents measurement of occupancy in a space." ; rdfs:subClassOf s223:Sensor . -s223:QuantifiableProperty a s223:Class, +s223:PhysicalSpace a s223:Class, sh:NodeShape ; - rdfs:label "Quantifiable Property" ; - 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." ; - rdfs:subClassOf s223:Property, - qudt:Quantity ; - sh:property [ rdfs:comment "A QuantifiableProperty can be associated with any number of Setpoints using the relation hasSetpoint" ; - sh:class s223:Setpoint ; - sh:path s223:hasSetpoint ], - [ rdfs:comment "A QuantifiableProperty can be associated with a decimal value using the relation hasValue" ; - sh:datatype xsd:decimal ; - sh:path s223:hasValue ], - [ rdfs:comment "A QuantifiableProperty must be associated with at least one quantitykind using the relation hasQuantityKind." ; - sh:minCount 1 ; - sh:path qudt:hasQuantityKind ], - [ rdfs:comment "A QuantifiableProperty should be associated with at least one unit using the relation unit." ; - sh:minCount 1 ; - sh:path qudt:unit ; - sh:severity sh:Info ], - [ rdfs:comment "This QuantifiableProperty and the Setpoint associated with it have non-commensurate QuantityKinds" ; - sh:path qudt:hasQuantityKind ; - sh:sparql [ a sh:SPARQLConstraint ; - sh:message "{$this} uses QuantityKind {?pqk} with DimensionVector {?pdv}, while Setpoint {?setpoint} uses QuantityKind {?sqk} with DimensionVector {?sdv}. These are non-commensurate" ; - sh:prefixes s223: ; - sh:select """ -SELECT $this ?setpoint ?pqk ?sqk ?pdv ?sdv -WHERE { -$this qudt:hasQuantityKind ?pqk . -$this s223:hasSetpoint ?setpoint . -?setpoint qudt:hasQuantityKind ?sqk . -?pqk qudt:hasDimensionVector ?pdv . -?sqk qudt:hasDimensionVector ?sdv . -FILTER (?pqk != ?sqk) . -FILTER (?pdv != ?sdv) . -} -""" ] ], - [ rdfs:comment "This QuantifiableProperty and the associated Setpoint use non-commensurate Units" ; - sh:path qudt:unit ; - sh:sparql [ a sh:SPARQLConstraint ; - sh:message "{$this} uses Unit {?punit}, while Setpoint {?setpoint} uses Unit {?sunit}. These are non-commensurate." ; - sh:prefixes s223: ; - sh:select """ -SELECT $this ?setpoint ?punit ?sunit -WHERE { -$this qudt:unit ?punit . -$this s223:hasSetpoint ?setpoint . -?setpoint qudt:unit ?sunit . -?punit qudt:hasDimensionVector ?pdv . -?sunit qudt:hasDimensionVector ?sdv . -FILTER (?punit != ?sunit) . -FILTER (?pdv != ?sdv) . -} -""" ] ], - [ rdfs:comment "This QuantifiableProperty uses a different Unit than the Setpoint associated with it" ; - sh:path qudt:unit ; - sh:severity sh:Info ; - sh:sparql [ a sh:SPARQLConstraint ; - sh:message "{$this} uses Unit {?punit}, while Setpoint {?setpoint} uses Unit {?sunit}. Be careful." ; - sh:prefixes s223: ; - sh:select """ -SELECT $this ?setpoint ?punit ?sunit -WHERE { -$this qudt:unit ?punit . -$this s223:hasSetpoint ?setpoint . -?setpoint qudt:unit ?sunit . -?punit qudt:hasDimensionVector ?pdv . -?sunit qudt:hasDimensionVector ?sdv . -FILTER (?punit != ?sunit) . -FILTER (?pdv = ?sdv) . -} -""" ] ] ; - sh:rule [ a sh:SPARQLRule ; - rdfs:comment "Infer the hasQuantityKind relationship if it is unambiguous" ; - sh:construct """ -CONSTRUCT { -$this qudt:hasQuantityKind ?uniqueqk -} -WHERE { -{ -SELECT $this (COUNT (DISTINCT (?qk)) AS ?count) -WHERE { -FILTER (NOT EXISTS {$this qudt:hasQuantityKind ?something}) . -$this qudt:unit/qudt:hasQuantityKind ?qk . -} -GROUP BY $this -} -FILTER (?count = 1) -$this qudt:unit/qudt:hasQuantityKind ?uniqueqk . -} -""" ; - sh:prefixes s223: ] ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Checks for consistent dimension vectors for a QuantityKind and the Unit" ; - sh:message "Inconsistent dimensionalities among the Property's Unit and Property's Quantity Kind" ; - sh:prefixes s223: ; - sh:select """ -SELECT $this ?count -WHERE { -{ SELECT $this (COUNT (DISTINCT ?qkdv) AS ?count) - WHERE -{ - { - $this qudt:hasQuantityKind/qudt:hasDimensionVector ?qkdv . - } - UNION - { - $this qudt:unit/qudt:hasDimensionVector ?qkdv . - } -} - GROUP BY $this -} -FILTER (?count > 1) . -} -""" ] . + rdfs:label "Physical Space" ; + rdfs:comment "A PhysicalSpace is an architectural concept representing a room, a collection of rooms such as a floor, a part of a room, or any physical space that might not even be thought of as a room, such as a patio space or a roof." ; + rdfs:subClassOf s223:Concept ; + sh:property [ rdfs:comment "If the relation contains is present it must associate the PhysicalSpace with a PhysicalSpace." ; + sh:class s223:PhysicalSpace ; + sh:path s223:contains ], + [ rdfs:comment "If the relation encloses is present it must associate the PhysicalSpace with a DomainSpace." ; + sh:class s223:DomainSpace ; + sh:path s223:encloses ] . s223:Signal-Modulated a s223:Class, s223:Signal-Modulated, sh:NodeShape ; rdfs:label "Signal-Modulated" ; + rdfs:comment "This class has enumerated instances of electric signals at various voltage ranges." ; rdfs:subClassOf s223:Electricity-Signal . -s223:SymmetricProperty a s223:Class, - sh:NodeShape ; - rdfs:label "Symmetric property" ; - rdfs:comment "Symmetric properties used to associate adjacent entities. See s223:cnx, s223:connected, s223:lnx" ; - rdfs:subClassOf rdf:Property . +s223:Voltage-12V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "12V Voltage" ; + s223:hasValue 12.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-190V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "190V Voltage" ; + s223:hasValue 190.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-48V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "48V Voltage" ; + s223:hasValue 48.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-5V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "5V Voltage" ; + s223:hasValue 5.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-6V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "6V Voltage" ; + s223:hasValue 6.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Water-GlycolSolution a s223:Class, + s223:Water-GlycolSolution, + sh:NodeShape ; + rdfs:label "Water-GlycolSolution" ; + s223:hasConstituent [ a s223:QuantifiableProperty ; + rdfs:label "Unspecified" ; + s223:ofSubstance s223:Medium-Glycol ; + qudt:hasQuantityKind qudtqk:VolumeFraction ; + qudt:hasUnit unit:PERCENT ], + [ a s223:QuantifiableProperty ; + rdfs:label "Unspecified" ; + s223:ofSubstance s223:Medium-Water ; + qudt:hasQuantityKind qudtqk:VolumeFraction ; + qudt:hasUnit unit:PERCENT ] ; + rdfs:comment "This class has enumerated instances of water-glycol solutions in various concentrations." ; + rdfs:subClassOf s223:Medium-Water ; + sh:property [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Medium-Water." ; + sh:path s223:hasConstituent ; + 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 Medium-Water." ; + sh:hasValue s223:Medium-Water ; + sh:path s223:ofSubstance ], + [ rdfs:comment "The quantity kind of the constituent must be VolumeFraction." ; + sh:hasValue qudtqk:VolumeFraction ; + sh:path qudt:hasQuantityKind ] ] ] ], + [ rdfs:comment "There must be at least two QuantifiableProperties that characterize the constituents of a Water-GlycolSolution." ; + sh:class s223:QuantifiableProperty ; + sh:minCount 2 ; + sh:path s223:hasConstituent ], + [ rdfs:comment "One of the constituents of a Water-GlycolSolution must be Medium-Glycol." ; + sh:path s223:hasConstituent ; + 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 Medium-Glycol." ; + sh:hasValue s223:Medium-Glycol ; + sh:path s223:ofSubstance ], + [ rdfs:comment "The quantity kind of the constituent must be VolumeFraction." ; + sh:hasValue qudtqk:VolumeFraction ; + sh:path qudt:hasQuantityKind ] ] ] ] . s223:connected a s223:SymmetricProperty, rdf:Property ; rdfs:label "connected" ; rdfs:comment "The relation connected indicates that two connectable things are connected without regard to any directionality of a process flow. " . +s223:executes a rdf:Property ; + rdfs:label "executes" ; + rdfs:comment "The relation executes is used to specify that a Controller (see `s223:Controller`) is responsible for the execution of a FunctionBlock (see `s223:FunctionBlock`). " . + +s223:hasDomainSpace a rdf:Property ; + rdfs:label "has domain space" ; + rdfs:comment "The relation hasDomainSpace is used to associate a Zone with the DomainSpace(s) that make up that Zone." . + s223:hasEnumerationKind a rdf:Property ; rdfs:label "has enumeration kind" ; - rdfs:comment "The relation hasEnumerationKind associates an EnumerableProperty with a class of enumeration values. This is used to, for example, identify what kind of substance is transported along a Connection or which day of the week a setpoint is active" . + rdfs:comment "The relation hasEnumerationKind associates an EnumerableProperty with a class of enumeration values. This is used to, for example, identify what kind of substance is transported along a Connection or which day of the week a setpoint is active." . + +s223:hasObservationLocationLow a rdf:Property ; + rdfs:label "has observation location low" ; + rdfs:comment "The relation hasObservationLocationLow associates a differential sensor to one of the topological locations where a differential property is observed (see `s223:observes`)." ; + rdfs:subPropertyOf s223:hasObservationLocation . -s223:lnx a s223:SymmetricProperty ; - rdfs:label "lnx" ; - rdfs:comment "The lnx property is a symmetric property associating adjacent entities in a Segment-Junction Network." . +s223:hasProperty a rdf:Property ; + rdfs:label "has Property" ; + rdfs:comment "The relation hasProperty associates any 223 Concept with a Property." . -s223:measuresSubstance a rdf:Property ; - rdfs:label "measures Substance" ; - rdfs:comment "The relation measuresSubstance is used to relate a sensor (see `s223:Sensor`) to a substance (see `s223:EnumerationKind-Substance`). Some sensors measure a specific property inside a medium and this substance can be defined by relating the sensor to it using the relation measuresSubstance (ex. Substance-CO2 in Medium-Air). " . +s223:hasValue a rdf:Property ; + rdfs:label "hasValue" ; + rdfs:comment "hasValue is used to contain a fixed value that is part of a 223 model, rather than a computed, measured, or externally derived variable." . -s223:uses a rdf:Property ; - rdfs:label "uses" ; - rdfs:comment "The relation uses is used to relate a function block input (see `s223:FunctionInput`) to a property (see `s223:Property`). This allows one to specify that the value of this property is used by the function block. " . +s223:hasZone a rdf:Property ; + rdfs:label "has zone" ; + rdfs:comment "The relation hasZone is used to associate a ZoneGroup with the Zones that make up that ZoneGroup." . -qudt:unit rdfs:comment "A reference to the unit of measure of a QuantifiableProperty of interest." . +s223:isConnectionPointOf a rdf:Property ; + rdfs:label "is connection point of" ; + s223:inverseOf s223:hasConnectionPoint ; + rdfs:comment "The relation isConnectionPointOf is part of a pair of relations that bind a ConnectionPoint to a Connectable thing. It is the inverse of the relation hasConnectionPoint (see `s223:hasConnectionPoint`)." . s223:ActuatableProperty a s223:Class, sh:NodeShape ; @@ -2182,28 +3576,59 @@ s223:ActuatableProperty a s223:Class, rdfs:comment "This class describes non-numeric properties of which real-time value can be modified by a user or a machine outside of the model." ; rdfs:subClassOf s223:Property . -s223:Coil a s223:Class, +s223:DC-12V a s223:Class, + s223:DC-12V, + s223:Electricity-DC, + sh:NodeShape ; + rdfs:label "12V" ; + s223:hasVoltage s223:Voltage-12V ; + rdfs:comment "This class has enumerated instances of all polarities of 12 volt electricity." ; + rdfs:subClassOf s223:Electricity-DC . + +s223:DC-24V a s223:Class, + s223:DC-24V, + s223:Electricity-DC, + sh:NodeShape ; + rdfs:label "24V" ; + s223:hasVoltage s223:Voltage-24V ; + rdfs:comment "This class has enumerated instances of all polarities of 24 volt electricity." ; + rdfs:subClassOf s223:Electricity-DC . + +s223:DC-380V a s223:Class, + s223:DC-380V, + s223:Electricity-DC, + sh:NodeShape ; + rdfs:label "380V" ; + s223:hasVoltage s223:Voltage-380V ; + rdfs:comment "This class has enumerated instances of all polarities of 380 volt electricity." ; + rdfs:subClassOf s223:Electricity-DC . + +s223:DC-48V a s223:Class, + s223:DC-48V, + s223:Electricity-DC, + sh:NodeShape ; + rdfs:label "48V" ; + s223:hasVoltage s223:Voltage-48V ; + rdfs:comment "This class has enumerated instances of all polarities of 48 volt electricity." ; + rdfs:subClassOf s223:Electricity-DC . + +s223:DC-5V a s223:Class, + s223:DC-5V, + s223:Electricity-DC, sh:NodeShape ; - rdfs:label "Coil" ; - rdfs:subClassOf s223:HeatExchanger ; - sh:property [ rdfs:comment "A Coil must provide service using Air." ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Medium-Air ; - sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Coil must provide service using Air." ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Medium-Air ; - sh:path s223:hasMedium ] ] ] ] . + rdfs:label "5V" ; + s223:hasVoltage s223:Voltage-5V ; + rdfs:comment "This class has enumerated instances of all polarities of 5 volt electricity." ; + rdfs:subClassOf s223:Electricity-DC . -s223:EM-Light a s223:Class, - s223:EM-Light, +s223:DC-6V a s223:Class, + s223:DC-6V, + s223:Electricity-DC, sh:NodeShape ; - rdfs:label "EM-Light" ; - rdfs:subClassOf s223:Medium-EM . + rdfs:label "6V" ; + s223:hasVoltage s223:Voltage-6V ; + rdfs:comment "This class has enumerated instances of all polarities of 6 volt electricity." ; + rdfs:subClassOf s223:Electricity-DC . s223:EnumerationKind-Binary a s223:Class, s223:EnumerationKind-Binary, @@ -2223,92 +3648,180 @@ s223:EnumerationKind-OnOff a s223:Class, s223:EnumerationKind-OnOff, sh:NodeShape ; rdfs:label "OnOff enumeration" ; + rdfs:comment "This class has enumerated instances of states of either on or off." ; rdfs:subClassOf s223:EnumerationKind . -s223:EnumerationKind-PositionStatus a s223:Class, - s223:EnumerationKind-PositionStatus, +s223:EnumerationKind-Position a s223:Class, + s223:EnumerationKind-Position, sh:NodeShape ; - rdfs:label "Position status" ; + rdfs:label "Position" ; + rdfs:comment "This class has enumerated instances of position such as closed or open." ; rdfs:subClassOf s223:EnumerationKind . s223:EnumerationKind-RunStatus a s223:Class, s223:EnumerationKind-RunStatus, sh:NodeShape ; rdfs:label "Run status" ; + rdfs:comment "This class is a more general form of EnumerationKind-OnOff, allowing for additional status values beyond on or off." ; rdfs:subClassOf s223:EnumerationKind . -s223:FunctionBlock a s223:Class, - sh:NodeShape ; - rdfs:label "Function block" ; - rdfs:comment "A FunctionBlock 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." ; - rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "An instance of Function block can be associated with any number of Constant instances using the relation 'has constant'." ; - sh:class s223:Constant ; - sh:path s223:hasConstant ], - [ rdfs:comment "An instance of Function block can be associated with any number of Input instances using the relation 'has function input'." ; - sh:class s223:FunctionInput ; - sh:path s223:hasInput ], - [ rdfs:comment "An instance of Function block can be associated with any number of Output instances using the relation 'has function output'." ; - sh:class s223:FunctionOutput ; - sh:path s223:hasOutput ], - [ rdfs:comment "An instance of Function block can be associated with any number of Parameter instances using the relation 'has parameter'." ; - sh:class s223:Parameter ; - sh:path s223:hasParameter ] . +s223:LineLineVoltage-10000V a s223:Numerical-LineLineVoltage ; + rdfs:label "10000V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-10000V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineLineVoltage-190V a s223:Numerical-LineLineVoltage ; + rdfs:label "190V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-190V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineLineVoltage-208V a s223:Numerical-LineLineVoltage ; + rdfs:label "208V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-208V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineLineVoltage-220V a s223:Numerical-LineLineVoltage ; + rdfs:label "220V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-220V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineLineVoltage-3000V a s223:Numerical-LineLineVoltage ; + rdfs:label "3000V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-3000V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineLineVoltage-3300V a s223:Numerical-LineLineVoltage ; + rdfs:label "3300V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-3300V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineLineVoltage-380V a s223:Numerical-LineLineVoltage ; + rdfs:label "380V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-380V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineLineVoltage-400V a s223:Numerical-LineLineVoltage ; + rdfs:label "400V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-400V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineLineVoltage-415V a s223:Numerical-LineLineVoltage ; + rdfs:label "415V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-415V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineLineVoltage-4160V a s223:Numerical-LineLineVoltage ; + rdfs:label "4160V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-4160V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineLineVoltage-480V a s223:Numerical-LineLineVoltage ; + rdfs:label "480V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-480V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineLineVoltage-6000V a s223:Numerical-LineLineVoltage ; + rdfs:label "6000V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-6000V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineLineVoltage-600V a s223:Numerical-LineLineVoltage ; + rdfs:label "600V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-600V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:LineLineVoltage-6600V a s223:Numerical-LineLineVoltage ; + rdfs:label "6600V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-6600V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . s223:Medium-EM a s223:Class, s223:Medium-EM, sh:NodeShape ; rdfs:label "Electromagnetic Wave" ; - rdfs:subClassOf s223:EnumerationKind-Medium . + rdfs:comment "This class has enumerated instances of electromagnetic energy at any frequency range." ; + rdfs:subClassOf s223:Substance-Medium . -s223:QuantifiableObservableProperty a s223:Class, +s223:Medium-Glycol a s223:Substance-Medium ; + rdfs:label "Medium-Glycol" . + +s223:Numerical-DCVoltage a s223:Class, + s223:EnumerationKind-Numerical, sh:NodeShape ; - rdfs:label "Quantifiable Observable Property" ; - rdfs:comment "This class is for quantifiable properties of which numerical values cannot be modified by a user or a machine outside of the model, but only observed, like a temperature reading or a voltage measure." ; - rdfs:subClassOf s223:ObservableProperty, - s223:QuantifiableProperty . + rdfs:label "Numerical-DCVoltage" ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "This class has enumerated instances of common positive and negative voltages, plus zero volts." ; + rdfs:subClassOf s223:EnumerationKind-Numerical ; + sh:property [ rdfs:comment "A DC-Voltage must have a voltage" ; + sh:class s223:Numerical-Voltage ; + sh:minCount 1 ; + sh:path s223:hasVoltage ] . -s223:Role-Heating a s223:EnumerationKind-Role ; - rdfs:label "Role-Heating" . +s223:Occupancy-Motion a s223:Class, + s223:Occupancy-Motion, + sh:NodeShape ; + rdfs:label "Occupancy Motion" ; + rdfs:comment "This class has enumerated instances indicating whether motion is detected or not." ; + rdfs:subClassOf s223:EnumerationKind-Occupancy . + +s223:Occupancy-Presence a s223:Class, + s223:Occupancy-Presence, + sh:NodeShape ; + rdfs:label "Occupancy Presence" ; + rdfs:comment "This class has enumerated instances indicating whether physical presence is detected or not." ; + rdfs:subClassOf s223:EnumerationKind-Occupancy . + +s223:Role-Cooling a s223:EnumerationKind-Role ; + rdfs:label "Role-Cooling" . s223:TerminalUnit a s223:Class, sh:NodeShape ; - rdfs:label "An air terminal that modulates the volume of air delivered to a space." ; + rdfs:label "Terminal Unit" ; + rdfs:comment "An air terminal that modulates the volume of air delivered to a space." ; rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A TerminalUnit must provide service using Air." ; + sh:property [ rdfs:comment "A TerminalUnit shall have at least one inlet ConnectionPoint using the medium Air." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Air ; sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A TerminalUnit must provide service using Air." ; + [ rdfs:comment "A TerminalUnit shall have at least one outlet ConnectionPoint using the medium Air." ; + sh:minCount 1 ; sh:path s223:hasConnectionPoint ; sh:qualifiedMinCount 1 ; sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; sh:node [ sh:property [ sh:class s223:Medium-Air ; sh:path s223:hasMedium ] ] ] ] . -s223:Zone a s223:Class, - sh:NodeShape ; - rdfs:label "Zone" ; - 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" ; - rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "A Zone can be associated with any number of other DomainSpaces or Zones using the relation contains" ; - sh:or ( [ sh:class s223:DomainSpace ] [ sh:class s223:Zone ] ) ; - sh:path s223:contains ], - [ rdfs:comment "A Zone must be associated with one EnumerationKind-Domain using the relation hasDomain" ; - sh:class s223:EnumerationKind-Domain ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:path s223:hasDomain ], - s223:hasPropertyShape ; - sh:rule [ a sh:TripleRule ; - rdfs:comment "Traverse down the contains hierarchy to determine the domain" ; - sh:object [ sh:path ( [ sh:zeroOrMorePath s223:contains ] s223:hasDomain ) ] ; - sh:predicate s223:hasDomain ; - sh:subject sh:this ] . +s223:Voltage-24V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "24V Voltage" ; + s223:hasValue 24.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Voltage-380V a s223:Numerical-Voltage, + s223:QuantifiableProperty ; + rdfs:label "380V Voltage" ; + s223:hasValue 380.0 ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . s223:connectedFrom a rdf:Property ; rdfs:label "connected from" ; @@ -2321,115 +3834,84 @@ s223:connectsAt a rdf:Property ; s223:inverseOf s223:connectsThrough ; rdfs:comment "The connectsAt relation binds a Connection to a specific ConnectionPoint. See Figure x.y." . -s223:connectsThrough a rdf:Property ; - rdfs:label "connects through" ; - s223:inverseOf s223:connectsAt ; - rdfs:comment "The relation connectedThrough binds a Connectable thing to a Connection without regard to the direction of flow. It is used to discover what connection links two connectable things." . - -s223:hasMeasurementLocationLow a rdf:Property ; - rdfs:label "has measurement location low" ; - rdfs:comment "The relation hasMeasurementLocationLow associates a differential sensor to one of the topological locations where a differential property is measured." ; - rdfs:subPropertyOf s223:hasMeasurementLocation . - -s223:hasValue a rdf:Property ; - rdfs:label "hasValue" ; - rdfs:comment "hasValue is used to contain a fixed value that is part of a 223 model, rather than a computed, measured, or externally derived variable." . - -g36:AnalogIn a s223:Class, - sh:NodeShape ; - rdfs:label "Analog in" ; - rdfs:subClassOf s223:QuantifiableObservableProperty ; - sh:rule [ a sh:TripleRule ; - rdfs:comment "An AnalogIn is a QuantifiableObervableProperty.", - "Getting validation reports about AnalogIn not being Property or ObservableProperty. Should probably move this rule up." ; - sh:object s223:QuantifiableObservableProperty ; - sh:predicate rdf:type ; - sh:subject sh:this ] . +s223:hasObservationLocationHigh a rdf:Property ; + rdfs:label "has observation location high" ; + rdfs:comment "The relation hasObservationLocationHigh associates a differential sensor to one of the topological locations where a differential property is observed (see `s223:observes`)." ; + rdfs:subPropertyOf s223:hasObservationLocation . -g36:RunCommand a s223:Class, - g36:RunCommand, +s223:EnumerationKind-Speed a s223:Class, + s223:EnumerationKind-Speed, sh:NodeShape ; - rdfs:label "Run command" ; + rdfs:label "Speed" ; + rdfs:comment "This class has enumerated instances of speed settings of High, Medium, Low (plus Off)." ; rdfs:subClassOf s223:EnumerationKind . -s223:DomainSpace a s223:Class, - sh:NodeShape ; - rdfs:label "Domain Space" ; - 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." ; - rdfs:subClassOf s223:Connectable ; - sh:property [ rdfs:comment "A DomainSpace must be associated with one EnumerationKind-Domain using the relation hasDomain" ; - sh:class s223:EnumerationKind-Domain ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:path s223:hasDomain ], - [ rdfs:comment "This DomainSpace must eventually be enclosed by a PhysicalSpace." ; - sh:message "This DomainSpace must eventually be enclosed by a PhysicalSpace." ; - sh:minCount 1 ; - sh:path [ sh:inversePath s223:encloses ] ; - sh:severity sh:Info ], - s223:hasPropertyShape . - -s223:EnumerationKind-ThreeSpeedSetting a s223:Class, - s223:EnumerationKind-ThreeSpeedSetting, +s223:Medium-Refrigerant a s223:Class, + s223:Medium-Refrigerant, sh:NodeShape ; - rdfs:label "Three speed setting" ; - rdfs:subClassOf s223:EnumerationKind . + rdfs:label "Medium-Refrigerant" ; + rdfs:comment "This class has enumerated instances of commonly used refrigerants." ; + rdfs:subClassOf s223:Substance-Medium . + +s223:Numerical-Frequency a s223:Class, + s223:Numerical-Frequency, + sh:NodeShape ; + rdfs:label "Dimensioned Frequency" ; + qudt:hasQuantityKind qudtqk:Frequency ; + qudt:hasUnit unit:HZ ; + rdfs:comment "This class has enumerated instances of common electrical frequencies." ; + rdfs:subClassOf s223:EnumerationKind-Numerical ; + sh:property [ rdfs:comment "A Numerical-Frequency must have a Quantity Kind of Frequency" ; + sh:hasValue qudtqk:Frequency ; + sh:path qudt:hasQuantityKind ], + [ rdfs:comment "A Numerical-Frequency must have a unit of Hertz" ; + sh:hasValue unit:HZ ; + sh:path qudt:hasUnit ] . -s223:Segment a s223:Class, +s223:Numerical-NumberOfElectricalPhases a s223:Class, + s223:Numerical-NumberOfElectricalPhases, sh:NodeShape ; - rdfs:label "Segment" ; - rdfs:comment "When necessary, a Connection may be subdivided into a network of Segments, joined at Junctions. This can be useful for identifying a duct segment of a duct before a split, for example." ; - rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "A Segment must be associated with two Junctions or ConnectionPoints using the relation lnx" ; - sh:maxCount 2 ; - sh:message "Segment is missing one or both endpoints (Junction or ConnectionPoint)" ; - sh:minCount 2 ; - sh:or ( [ sh:class s223:Junction ] [ sh:class s223:ConnectionPoint ] ) ; - sh:path s223:lnx ; - sh:qualifiedMaxCount 1 ; - sh:qualifiedValueShape [ sh:class s223:ConnectionPoint ] ; - sh:severity sh:Warning ] . + rdfs:label "Dimensionless Number of Electrical Phases" ; + qudt:hasQuantityKind qudtqk:Dimensionless ; + qudt:hasUnit unit:NUM ; + rdfs:comment "This class has enumerated instances of number of electrical phases." ; + rdfs:subClassOf s223:EnumerationKind-Numerical . s223:Substance-Particulate a s223:Class, s223:Substance-Particulate, sh:NodeShape ; rdfs:label "Particulate" ; + rdfs:comment "This class has enumerated instances of particulates in various size ranges." ; rdfs:subClassOf s223:EnumerationKind-Substance . -s223:hasMeasurementLocationHigh a rdf:Property ; - rdfs:label "has measurement location high" ; - rdfs:comment "The relation hasMeasurementLocationHigh associates a differential sensor to one of the topological locations where a differential property is measured." ; - rdfs:subPropertyOf s223:hasMeasurementLocation . +s223:connectedTo a rdf:Property ; + rdfs:label "connected to" ; + s223:inverseOf s223:connectedFrom ; + rdfs:comment "The relation connectedTo indicates that connectable things are connected with a specific flow direction. A is connectedTo B, means a directionality beginning at A and ending at B. The inverse direction is indicated by connectedFrom (see `s223:connectedFrom`)." ; + rdfs:domain s223:Equipment . -s223:isConnectionPointOf a rdf:Property ; - rdfs:label "is connection point of" ; - s223:inverseOf s223:hasConnectionPoint ; - rdfs:comment "The relation isConnectionPointOf is part of a pair of relations that bind a ConnectionPoint to a Connectable thing. It is the inverse of the relation hasConnectionPoint (see `s223:hasConnectionPoint`)." . +s223:connectsThrough a rdf:Property ; + rdfs:label "connects through" ; + s223:inverseOf s223:connectsAt ; + rdfs:comment "The relation connectedThrough binds a Connectable thing to a Connection without regard to the direction of flow. It is used to discover what connection links two connectable things." . -g36:RunStatus a s223:Class, - g36:RunStatus, - sh:NodeShape ; - rdfs:label "Run status" ; - rdfs:subClassOf s223:EnumerationKind . +s223:hasConstituent a rdf:Property ; + rdfs:label "has constituent" ; + rdfs:comment "The relation hasConstituent is used to indicate what substances constitute a material. The possible values are defined in EnumerationKind-Substance (see `s223:EnumerationKind-Substance`)." . -s223:Damper a s223:Class, +s223:hasVoltage a rdf:Property ; + rdfs:label "hasVoltage" ; + rdfs:comment "The relation hasVoltage is used to identify the voltage of an electricity enumeration kind. " . + +s223:ofSubstance a rdf:Property ; + rdfs:label "of substance" ; + rdfs:comment "The relation ofSubstance is used to associate a Property with a specific Substance." . + +s223:BidirectionalConnectionPoint a s223:Class, sh:NodeShape ; - rdfs:label "Damper" ; - rdfs:subClassOf s223:Equipment ; - sh:property [ sh:minCount 2 ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A Damper must provide service using Air." ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Medium-Air ; - sh:path s223:hasMedium ] ] ] ], - [ rdfs:comment "A Damper must provide service using Air." ; - sh:path s223:hasConnectionPoint ; - sh:qualifiedMinCount 1 ; - sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ; - sh:node [ sh:property [ sh:class s223:Medium-Air ; - sh:path s223:hasMedium ] ] ] ] . + rdfs:label "Bidirectional Connection Point" ; + rdfs:comment "A BidirectionalConnectionPoint is a predefined subclass of ConnectionPoint. Using a BidirectionalConnectionPoint implies that the flow direction is not fixed in one direction. It depends on the status of some other part of the system, such as a valve position, that is expected to change during operation (see `s223:Direction-Bidirectional`) or to model energy transfer occurring without specific flow direction." ; + rdfs:subClassOf s223:ConnectionPoint . s223:DayOfWeek-Weekday a s223:Class, s223:DayOfWeek-Weekday, @@ -2437,117 +3919,199 @@ s223:DayOfWeek-Weekday a s223:Class, rdfs:label "Day of week-Weekday", "Weekday" ; rdfs:comment "This class defines the EnumerationKind values of Monday, Tuesday, Wednesday, Thursday, and Friday" ; - rdfs:subClassOf s223:EnumerationKind-DayOfWeek . - -s223:Electricity-DC a s223:Class, - s223:Electricity-DC, - sh:NodeShape ; - rdfs:label "DC Electricity" ; - rdfs:subClassOf s223:Medium-Electricity . + rdfs:subClassOf s223:Aspect-DayOfWeek . s223:Electricity-Signal a s223:Class, s223:Electricity-Signal, sh:NodeShape ; rdfs:label "Electricity Signal" ; + rdfs:comment "This class has enumerated instances of common communication protocols, mostly at the physical OSI layer." ; rdfs:subClassOf s223:Medium-Electricity . s223:EnumerationKind-HVACOperatingMode a s223:Class, s223:EnumerationKind-HVACOperatingMode, sh:NodeShape ; - rdfs:label "HVAC system/equipment operating mode. The policy under which the system is operating." ; + rdfs:label "HVAC operating mode" ; + rdfs:comment "HVACOperatingMode has enumerated instances of the policy under which the HVAC system or equipment is operating." ; rdfs:subClassOf s223:EnumerationKind . s223:EnumerationKind-HVACOperatingStatus a s223:Class, s223:EnumerationKind-HVACOperatingStatus, sh:NodeShape ; - rdfs:label "HVAC system/equipment operating status. What the system is currently doing." ; + rdfs:label "HVAC operating status" ; + rdfs:comment "HVACOperatingStatus has enumerated instances of the HVAC system/equipment operating status." ; rdfs:subClassOf s223:EnumerationKind . s223:EnumerationKind-Occupancy a s223:Class, s223:EnumerationKind-Occupancy, sh:NodeShape ; rdfs:label "Occupancy status" ; + rdfs:comment "This class has enumerated instances of occupancy status, i.e. the state of being used or occupied." ; rdfs:subClassOf s223:EnumerationKind . s223:EnumerationKind-Phase a s223:Class, s223:EnumerationKind-Phase, sh:NodeShape ; rdfs:label "EnumerationKind-Phase" ; + rdfs:comment "This class has enumerated instances of thermodynamic phase, i.e. states of matter." ; rdfs:subClassOf s223:EnumerationKind . +s223:LineNeutralVoltage-120V a s223:Numerical-LineNeutralVoltage ; + rdfs:label "120V Line-Neutral Voltage" ; + s223:hasVoltage s223:Voltage-120V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:Role-Heating a s223:EnumerationKind-Role ; + rdfs:label "Role-Heating" . + +s223:hasObservationLocation a rdf:Property ; + rdfs:label "has observation location" ; + rdfs:comment "The relation hasObservationLocation associates a sensor to the topological location where it is observing the property (see `s223:observes`). The observation location can be a Connectable (see `s223:Connectable`)." . + +qudt:hasUnit rdfs:comment "A reference to the unit of measure of a QuantifiableProperty of interest." . + s223:EnumerationKind-Substance a s223:Class, s223:EnumerationKind-Substance, sh:NodeShape ; rdfs:label "Substance" ; rdfs:comment "This class has enumerated instances of the substances that are consumed, produced, transported, sensed, controlled or otherwise interacted with (e.g. water, air, etc.)." ; - rdfs:subClassOf s223:EnumerationKind . - -s223:connectedTo a rdf:Property ; - rdfs:label "connected to" ; - s223:inverseOf s223:connectedFrom ; - rdfs:comment "The relation connectedTo indicates that connectable things are connected with a specific flow direction. A is connectedTo B, means a directionality beginning at A and ending at B. The inverse direction is indicated by connectedFrom (see `s223:connectedFrom`)." ; - rdfs:domain s223:Equipment . - -s223:hasPropertyShape a sh:PropertyShape ; - rdfs:label "has Property Shape" ; - rdfs:comment "Can be associated with a Property by hasProperty" ; - sh:class s223:Property ; - sh:path s223:hasProperty . - -s223:observes a rdf:Property ; - rdfs:label "observes" ; - rdfs:comment "The relation observes binds a sensor to the ObservableProperty representing the measured value." . + rdfs:subClassOf s223:EnumerationKind ; + sh:property [ rdfs:comment "A substance may only have atomic constituents, it may not have a constituent that also has constituents." ; + sh:path s223:hasConstituent ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "If a substance has a constituent, that constituent may not itself have constituents." ; + sh:message "This substance {$this} has a constituent {?constituent} that itself has constituents {?nextConstituent}. Create new substance with only atomic constituents." ; + sh:prefixes ; + sh:select """ +SELECT $this ?constituent ?nextConstituent +WHERE { +$this s223:hasConstituent ?constituent . +?constituent s223:ofSubstance/s223:hasConstituent ?nextConstituent . +} +""" ] ], + [ rdfs:comment "If the relation hasConstituent is present, it must associate an EnumerationKind-Substance with one or more Properties that identify and characterize those constituents." ; + sh:class s223:Property ; + sh:path s223:hasConstituent ] . -s223:cnx a s223:SymmetricProperty ; - rdfs:label "cnx" ; - rdfs:comment "The cnx property is a symmetric property used to associate adjacent entities in a connection path (comprised of Equipment-ConnectionPoint-Connection-ConnectionPoint-Equipment sequences)." . +s223:contains a rdf:Property ; + rdfs:label "contains" ; + rdfs:comment "The relation contains associates a PhysicalSpace or a piece of Equipment to a PhysicalSpace or another piece of Equipment, respectively." . -s223:hasDomain a rdf:Property ; - rdfs:label "has domain" ; - rdfs:comment "The relation hasDomain is used to indicate what domain a Zone or DomainSpace pertains to (e.g. HVAC, lighting, electrical, etc.). Possible values are defined in EnumerationKind-Domain (see `s223:EnumerationKind-Domain`)." . +s223:EnumerationKind-Numerical a s223:Class, + s223:EnumerationKind-Numerical, + sh:NodeShape ; + rdfs:label "EnumerationKind-Numerical" ; + qudt:hasQuantityKind qudtqk:Unknown ; + qudt:hasUnit unit:UNKNOWN ; + rdfs:comment "This class has enumerated instances of contexts often used with the s223:hasAspect relation for a s223:Property with a numerical value, unit and quantitykind." ; + rdfs:subClassOf s223:EnumerationKind, + s223:QuantifiableProperty . -s223:mapsTo a rdf:Property ; - rdfs:label "mapsTo" ; - rdfs:comment "The relation mapsTo is used to associate a ConnectionPoint of an Equipment to a corresponding ConnectionPoint of the Equipment containing it. The associated ConnectionPoints must have the same direction (see `s223:EnumerationKind-Direction`)." . +s223:Sensor a s223:Class, + sh:NodeShape ; + rdfs:label "Sensor" ; + 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." ; + rdfs:subClassOf s223:AbstractSensor ; + 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." ; + sh:construct """ +CONSTRUCT {$this s223:hasObservationLocation ?something .} +WHERE { +{ +SELECT ?prop (COUNT (DISTINCT ?measurementLocation) AS ?count) $this +WHERE { +FILTER (NOT EXISTS {$this s223:hasObservationLocation ?anything}) . +$this s223:observes ?prop . +?measurementLocation s223:hasProperty ?prop . +} +GROUP BY ?prop $this +} +FILTER (?count = 1) . +?something s223:hasProperty ?prop . +{?something a/rdfs:subClassOf* s223:Connectable} +UNION +{?something a/rdfs:subClassOf* s223:Connection} +UNION +{?something a/rdfs:subClassOf* s223:ConnectionPoint} +} +""" ; + sh:name "InferredMeasurementLocation" ; + sh:prefixes ] ; + sh:xone ( [ sh:property [ rdfs:comment "A Sensor must be associated with exactly 1 of Connectable, Connection, or ConnectionPoint using the relation hasObservationLocation." ; + sh:class s223:Connectable ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasObservationLocation ] ] [ sh:property [ rdfs:comment "A Sensor must be associated with exactly 1 of Connectable, Connection, or ConnectionPoint using the relation hasObservationLocation." ; + sh:class s223:Connection ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasObservationLocation ] ] [ sh:property [ rdfs:comment "A Sensor must be associated with exactly 1 of Connectable, Connection, or ConnectionPoint using the relation hasObservationLocation." ; + sh:class s223:ConnectionPoint ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:hasObservationLocation ] ] ), + ( [ sh:property [ rdfs:comment "A Sensor must be associated with exactly 1 of QuantifiableObservableProperty or EnumeratedObservableProperty using the relation observes." ; + sh:class s223:QuantifiableObservableProperty ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:observes ] ] [ sh:property [ rdfs:comment "A Sensor must be associated with exactly 1 of QuantifiableObservableProperty or EnumeratedObservableProperty using the relation observes." ; + sh:class s223:EnumeratedObservableProperty ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path s223:observes ] ] ) . -qudt:hasQuantityKind rdfs:comment "A reference to the QuantityKind of a QuantifiableProperty of interest, e.g. quantitykind:Temperature." . +s223:Aspect-ElectricalVoltagePhases a s223:Aspect-ElectricalVoltagePhases, + s223:Class, + sh:NodeShape ; + rdfs:label "Aspect-Electrical Voltage Phases" ; + rdfs:comment "This class enumerates the relevant electrical phases for a voltage difference for AC electricity inside a Connection." ; + rdfs:subClassOf s223:EnumerationKind-Aspect . s223:Connection a s223:Class, sh:NodeShape ; rdfs:label "Connection" ; - rdfs:comment """A Connection is 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. All Connections have two or more ConnectionPoints bound to either Equipment (see `s223:Equipment`) or DomainSpace (see `s223:DomainSpace`). If the direction of flow is constrained, that constraint is indicated by using one or more InletConnectionPoints (see `s223:InletConnectionPoint`) to represent the inflow points and OutletConnectionPoints (see `s223:OutletConnectionPoint`) to represent the outflow points. + rdfs:comment """A Connection is 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), or a virtual connection to convey electromagnetic radiation (e.g. light or wifi signal) between two connectable things. All Connections have two or more ConnectionPoints bound to either Equipment (see `s223:Equipment`), DomainSpace (see `s223:DomainSpace`), or Junction (see `s223:Junction`) See Figure 6-2. If the direction of flow is constrained, that constraint is indicated by using one or more InletConnectionPoints (see `s223:InletConnectionPoint`) to represent the inflow points and OutletConnectionPoints (see `s223:OutletConnectionPoint`) to represent the outflow points. -A Connection may contain branches or intersections. These are modeled using Segments (see `s223:Segment`) and Junctions (see `s223:Junction`). +A Connection may contain branches or intersections. These may be modeled using Junctions if it is necessary to identify a specific intersection. (see `s223:Junction`). +![Graphical Depiction of Connection.](figures/Figure_5-3_Connection.svg) """ ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "A Connection can be associated with any number of ConnectionPoints using the relation connectsAt" ; - sh:class s223:ConnectionPoint ; - sh:path s223:connectsAt ], - [ rdfs:comment "A Connection can be associated with any number of Connectables using the relation connectsFrom" ; - sh:class s223:Connectable ; - sh:name "ConnectionToUpstreamConnectableShape" ; - sh:path s223:connectsFrom ], - [ rdfs:comment "A Connection can be associated with any number of Connectables using the relation connectsTo" ; - sh:class s223:Connectable ; - sh:name "ConnectionToDownstreamConnectableShape" ; - sh:path s223:connectsTo ], - [ rdfs:comment "A Connection must be associated with one EnumerationKind-Medium using the relation hasMedium" ; - sh:class s223:EnumerationKind-Medium ; - sh:maxCount 1 ; - sh:minCount 1 ; - sh:name "Connection medium" ; - sh:path s223:hasMedium ], - [ sh:class s223:EnumerationKind-Phase ; - sh:path s223:hasPhase ], - [ rdfs:comment "A Connection can be associated with an EnumerationKind-Role using the relation hasRole" ; - sh:class s223:EnumerationKind-Role ; - sh:path s223:hasRole ], - [ sh:name "Test for compatible declared Medium" ; + sh:or ( [ sh:property [ rdfs:comment "A Connection shall have at least two cnx relations allowing flow in and out of the Connection." ; + sh:minCount 1 ; + sh:path s223:cnx ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ; + sh:qualifiedValueShapesDisjoint true ], + [ rdfs:comment "A Connection shall have at least two cnx relations allowing flow in and out of the Connection." ; + sh:minCount 1 ; + sh:path s223:cnx ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ; + sh:qualifiedValueShapesDisjoint true ] ] [ sh:property [ rdfs:comment "A Connection shall have at least two cnx relations allowing flow in and out of the Connection." ; + sh:minCount 2 ; + sh:path s223:cnx ; + sh:qualifiedMinCount 1 ; + sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ] ; + sh:qualifiedValueShapesDisjoint true ] ] ) ; + sh:property [ rdfs:comment "A Connection must only have a cnx relation with a ConnectionPoint" ; + sh:path s223:cnx ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "A Connection must only have a cnx relation with a ConnectionPoint" ; + sh:message "{$this} cannot have a s223:cnx relation to {?something}, because {?something} is not a ConnectionPoint." ; + sh:prefixes ; + sh:select """SELECT $this ?something +WHERE { +$this s223:cnx ?something . +FILTER NOT EXISTS {?something a/rdfs:subClassOf* s223:ConnectionPoint} . +}""" ] ], + [ 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." ; + sh:name "Test for compatible declared Medium" ; sh:path s223:hasMedium ; sh:sparql [ a sh:SPARQLConstraint ; rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the associated Connection." ; sh:message "{$this} with Medium {?m2} is incompatible with {?cp} with Medium {?m1}." ; - sh:prefixes s223: ; + sh:prefixes ; sh:select """ SELECT $this ?m2 ?cp ?m1 WHERE { @@ -2560,9 +4124,59 @@ FILTER (NOT EXISTS {?m2 a/rdfs:subClassOf* ?m1}) . FILTER (NOT EXISTS {?m1 a/rdfs:subClassOf* ?m2}) . } """ ] ], - s223:hasPropertyShape ; + [ rdfs:comment "Ensure that the Medium identified by all the associated ConnectionPoints via the s223:hasMedium relation are compatible with one another." ; + sh:name "Test for compatible declared Medium" ; + sh:path s223:hasMedium ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Ensure that the Medium identified by all the associated ConnectionPoints via the s223:hasMedium relation are compatible with one another." ; + sh:message "{?cp1} with Medium {?m1} is incompatible with {?cp2} with Medium {?m2}." ; + sh:prefixes ; + sh:select """ +SELECT $this ?cp1 ?m1 ?cp2 ?m2 +WHERE { +$this s223:cnx ?cp1 . +?cp1 a/rdfs:subClassOf* s223:ConnectionPoint . +?cp1 s223:hasMedium ?m1 . +$this s223:cnx ?cp2 . +?cp2 a/rdfs:subClassOf* s223:ConnectionPoint . +?cp2 s223:hasMedium ?m2 . +FILTER (?m1 != ?m2 ) . +FILTER (NOT EXISTS {?m2 a/rdfs:subClassOf* ?m1}) . +FILTER (NOT EXISTS {?m1 a/rdfs:subClassOf* ?m2}) . +} +""" ] ], + [ rdfs:comment "If the relation connectsAt is present it must associate the Connection with a ConnectionPoint." ; + sh:class s223:ConnectionPoint ; + sh:path s223:connectsAt ], + [ rdfs:comment "If the relation connectsFrom is present it must associate the Connection with a Connectable." ; + sh:class s223:Connectable ; + sh:name "ConnectionToUpstreamConnectableShape" ; + sh:path s223:connectsFrom ], + [ rdfs:comment "If the relation connectsTo is present it must associate the Connection with a Connectable." ; + sh:class s223:Connectable ; + sh:name "ConnectionToDownstreamConnectableShape" ; + sh:path s223:connectsTo ], + [ rdfs:comment "A Connection must be associated with exactly one EnumerationKind-Medium using the relation hasMedium." ; + sh:class s223:Substance-Medium ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:name "Connection medium" ; + sh:path s223:hasMedium ], + [ rdfs:comment "If the relation hasRole is present it must associate the Connection with an EnumerationKind-Role." ; + sh:class s223:EnumerationKind-Role ; + sh:path s223:hasRole ], + [ rdfs:comment "If the relation hasThermodynamicPhase is present it must associate the Connection with an EnumerationKind-Phase." ; + sh:class s223:EnumerationKind-Phase ; + sh:maxCount 1 ; + sh:path s223:hasThermodynamicPhase ], + [ rdfs:comment "A Connection must have two or more cnx relations to ConnectionPoints" ; + sh:class s223:ConnectionPoint ; + sh:message "A Connection must have two or more cnx relations to ConnectionPoints" ; + sh:minCount 2 ; + sh:path s223:cnx ; + sh:severity sh:Info ] ; sh:rule [ a sh:SPARQLRule ; - rdfs:comment "Infer the connectsFrom relationship" ; + rdfs:comment "Infer the connectsFrom relation using connectsAt" ; sh:construct """ CONSTRUCT {$this s223:connectsFrom ?equipment .} WHERE { @@ -2572,9 +4186,9 @@ $this s223:connectsAt ?cp . } """ ; sh:name "InferredConnectionToUpstreamEquipmentProperty" ; - sh:prefixes s223: ], + sh:prefixes ], [ a sh:SPARQLRule ; - rdfs:comment "Infer the connectsTo relationship" ; + rdfs:comment "Infer the connectsTo relation using connectsAt" ; sh:construct """ CONSTRUCT {$this s223:connectsTo ?equipment .} WHERE { @@ -2584,29 +4198,219 @@ $this s223:connectsAt ?cp . } """ ; sh:name "InferredConnectionToDownstreamEquipmentProperty" ; - sh:prefixes s223: ], + sh:prefixes ], [ a sh:TripleRule ; - rdfs:comment "Infer cnx relationship from connectsAt", + rdfs:comment "Infer cnx relation using connectsAt", "InferredConnectionToConnectionPointBaseProperty" ; sh:object [ sh:path s223:connectsAt ] ; sh:predicate s223:cnx ; sh:subject sh:this ], [ a sh:TripleRule ; - rdfs:comment "Infer cnx relationship from connectsThrough", + rdfs:comment "Infer cnx relation using connectsThrough", "InferredConnectionToConnectionPointBasePropertyFromInverse" ; sh:object [ sh:path [ sh:inversePath s223:connectsThrough ] ] ; sh:predicate s223:cnx ; sh:subject sh:this ], [ a sh:TripleRule ; - rdfs:comment "Infer the connectsAt relationship from cnx", + rdfs:comment "Infer the connectsAt relation using cnx", "InferredConnectionToConnectionPointProperty" ; sh:object [ sh:path s223:cnx ] ; sh:predicate s223:connectsAt ; sh:subject sh:this ] . -s223:hasMeasurementLocation a rdf:Property ; - rdfs:label "has measurement location" ; - rdfs:comment "The relation hasMeasurementLocation associates a sensor to the topological location where it is measuring. The measurement location can be a ConnectionPoint, Connection, Segment or a DomainSpace." . +s223:EM-Light a s223:Class, + s223:EM-Light, + sh:NodeShape ; + rdfs:label "EM-Light" ; + rdfs:comment "The EM-Light class has enumerated instances of what are considered visible or near-visible light." ; + rdfs:subClassOf s223:Medium-EM . + +s223:LineLineVoltage-240V a s223:Numerical-LineLineVoltage ; + rdfs:label "240V Line-Line Voltage" ; + s223:hasVoltage s223:Voltage-240V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . + +s223:mapsTo a rdf:Property ; + rdfs:label "mapsTo" ; + rdfs:comment "The relation mapsTo is used to associate a ConnectionPoint of a Connectable to a corresponding ConnectionPoint of the one containing it (see `pub:equipment-containment`). The associated ConnectionPoints must have the same direction (see `s223:EnumerationKind-Direction`) and compatiable medium Substance-Medium." . + +s223:Aspect-ElectricalPhaseIdentifier a s223:Aspect-ElectricalPhaseIdentifier, + s223:Class, + sh:NodeShape ; + rdfs:label "Aspect-Electrical phase identifier" ; + rdfs:comment "The value of the associated Property identifies the electrical phase of the Connection." ; + rdfs:subClassOf s223:EnumerationKind-Aspect . + +s223:DCVoltage-DCNegativeVoltage a s223:Class, + s223:DCVoltage-DCNegativeVoltage, + sh:NodeShape ; + rdfs:label "DC Negative Voltage" ; + s223:hasVoltage s223:Numerical-Voltage ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "This class has enumerated instances of common negative voltages." ; + rdfs:subClassOf s223:Numerical-DCVoltage . + +s223:DCVoltage-DCPositiveVoltage a s223:Class, + s223:DCVoltage-DCPositiveVoltage, + sh:NodeShape ; + rdfs:label "DC Positive Voltage" ; + s223:hasVoltage s223:Numerical-Voltage ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "This class has enumerated instances of common positive voltages." ; + rdfs:subClassOf s223:Numerical-DCVoltage . + +s223:ConnectionPoint a s223:Class, + sh:NodeShape ; + rdfs:label "ConnectionPoint" ; + s223:abstract true ; + rdfs:comment """ +A ConnectionPoint is 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. Equipment, DomainSpaces and Junctions can have one or more ConnectionPoints (see `s223:Connectable`). + +A ConnectionPoint is constrained to relate to a specific medium such as air, water, or electricity which determines what other things can be connected to it. For example, constraining a ConnectionPoint to be for air means it cannot be used for an electrical connection. + +A ConnectionPoint belongs to exactly one connectable thing (see `s222:Connectable'). + +ConnectionPoints are represented graphically in this standard by a triangle with the point indicating a direction of flow, or a diamond in the case of a bidirectional flow as shown in Figure 6-1. + +![Graphical Representation of a ConnectionPoint.](figures/Figure_5-2_Graphical_Depiciton_of_Connection_Points.svg) + + """ ; + rdfs:subClassOf s223:Concept ; + sh:property [ 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." ; + 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." ; + sh:message "ConnectionPoint {$this} probably needs an association with a Connection." ; + sh:prefixes ; + sh:select """ + SELECT $this + WHERE { + FILTER NOT EXISTS {$this s223:connectsThrough ?anything1} . + FILTER NOT EXISTS {$this s223:mapsTo ?anything2} . + $this s223:isConnectionPointOf ?equipment . + FILTER NOT EXISTS {?containerEquipment s223:contains ?equipment} . + } + """ ] ], + [ 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." ; + sh:name "Test for compatible declared Medium" ; + sh:path s223:hasMedium ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the entity identified by the mapsTo+ relation." ; + sh:message "{$this} declares a Medium of {?a}, but the Medium of {?b} is declared by {?target} pointed to by the mapsTo+ relation." ; + sh:prefixes ; + sh:select """ +SELECT DISTINCT $this ?a ?b ?target +WHERE { +$this s223:hasMedium ?a . +$this s223:mapsTo+ ?target . +?target s223:hasMedium ?b . +?a a/rdfs:subClassOf* s223:EnumerationKind-Medium . +?b a/rdfs:subClassOf* s223:EnumerationKind-Medium . +FILTER (?a != ?b ) . +FILTER (NOT EXISTS {?b a/rdfs:subClassOf* ?a}) . +FILTER (NOT EXISTS {?a a/rdfs:subClassOf* ?b}) . +} +""" ] ], + [ rdfs:comment "A ConnectionPoint must not have both a mapsTo and a connectsThrough relation." ; + sh:path s223:mapsTo ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "A ConnectionPoint must not have both a mapsTo and a connectsThrough relation." ; + sh:message "{$this} cannot have both a mapsTo {?uppercp} and a connectsThrough {?connection}." ; + sh:prefixes ; + sh:select """ +SELECT $this ?uppercp ?connection +WHERE { +$this s223:mapsTo ?uppercp . +$this s223:connectsThrough ?connection . +?connection a/rdfs:subClassOf* s223:Connection . +} +""" ] ], + [ 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." ; + 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." ; + sh:message "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}." ; + sh:prefixes ; + sh:select """ + SELECT $this ?containerEquipment + WHERE { + FILTER NOT EXISTS {$this s223:connectsThrough ?anything1} . + FILTER NOT EXISTS {$this s223:mapsTo ?anything2} . + $this s223:isConnectionPointOf ?equipment . + ?containerEquipment s223:contains ?equipment . + } + """ ] ], + [ rdfs:comment "If a ConnectionPoint mapsTo another ConnectionPoint, the respective Equipment should have a contains relation." ; + sh:path s223:mapsTo ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "If a ConnectionPoint mapsTo another ConnectionPoint, the respective Equipment should have a contains relation." ; + sh:message "{?otherEquipment} should contain {?equipment} because ConnectionPoint {$this} has a mapsTo relation." ; + sh:prefixes ; + sh:select """ +SELECT $this ?equipment ?otherEquipment +WHERE { +$this s223:mapsTo ?otherCP . +?equipment s223:hasConnectionPoint $this . +?otherEquipment s223:hasConnectionPoint ?otherCP . +FILTER NOT EXISTS {?otherEquipment s223:contains ?equipment} +} +""" ] ], + [ rdfs:comment "A ConnectionPoint must be associated with at most one Connectable using the cnx relation." ; + sh:message "A ConnectionPoint must be associated with at most one Connectable using the cnx relation." ; + sh:path s223:cnx ; + sh:qualifiedMaxCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Connectable ] ; + sh:qualifiedValueShapesDisjoint true ], + [ rdfs:comment "A ConnectionPoint must be associated with at most one Connection using the cnx relation" ; + sh:message "A ConnectionPoint must be associated with at most one Connection using the cnx relation" ; + sh:path s223:cnx ; + sh:qualifiedMaxCount 1 ; + sh:qualifiedValueShape [ sh:class s223:Connection ] ; + sh:qualifiedValueShapesDisjoint true ], + [ rdfs:comment "A ConnectionPoint must be associated with at most one Connection using the relation connectsThrough." ; + sh:class s223:Connection ; + sh:maxCount 1 ; + sh:message "This ConnectionPoint must be associated with at most one Connection." ; + sh:name "ConnectionPointToConnectionShape" ; + sh:path s223:connectsThrough ; + sh:severity sh:Info ], + [ rdfs:comment "If the relation hasElectricalPhase is present it must associate the ConnectionPoint with an ElectricalPhaseIdentifier or ElectricalVoltagePhases." ; + sh:or ( [ sh:class s223:Aspect-ElectricalPhaseIdentifier ] [ sh:class s223:Aspect-ElectricalVoltagePhases ] ) ; + sh:path s223:hasElectricalPhase ], + [ rdfs:comment "A ConnectionPoint must be associated with exactly one Substance-Medium using the relation hasMedium." ; + sh:class s223:Substance-Medium ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:name "ConnectionPoint medium" ; + sh:path s223:hasMedium ], + [ rdfs:comment "If the relation hasRole is present it must associate the ConnectionPoint with an EnumerationKind-Role." ; + sh:class s223:EnumerationKind-Role ; + sh:path s223:hasRole ], + [ rdfs:comment "A ConnectionPoint must be associated with exactly one Connectable using the relation isConnectionPointOf." ; + sh:class s223:Connectable ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:name "ConnectionPointToEquipmentShape" ; + sh:path s223:isConnectionPointOf ], + [ rdfs:comment "A ConnectionPoint can be associated with at most one other ConnectionPoint using the relation mapsTo" ; + sh:class s223:ConnectionPoint ; + sh:maxCount 1 ; + sh:path s223:mapsTo ], + [ rdfs:comment "A ConnectionPoint can be associated with at most one other ConnectionPoint using the inverse of relation mapsTo" ; + sh:class s223:ConnectionPoint ; + sh:maxCount 1 ; + sh:path [ sh:inversePath s223:mapsTo ] ] . + +s223:DCVoltage-DCZeroVoltage a s223:Numerical-DCVoltage ; + rdfs:label "DCVoltage-DCZero voltage" ; + s223:hasVoltage s223:Voltage-0V ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V . s223:Property a s223:Class, sh:NodeShape ; @@ -2614,43 +4418,61 @@ s223:Property a s223:Class, rdfs:comment """An attribute, quality, or characteristic of a feature of interest. The Property class is the parent of all variations of a property, which are: -ActuatableProperty - parent of subclass of properties that can be modified by user or machine outside of the model (typically command) -ObservableProperty - parent of subclass of properties that can not be modified by user or machine outside of the model (typically measures) -EnumerableProperty - parent of subclass of properties defined by EnumerationKind -QuantifiableProperty - parent of subclass of properties defined by numerical values +ActuatableProperty - parent of subclass of properties that can be modified by user or machine outside of the model (typically command); +ObservableProperty - parent of subclass of properties that can not be modified by user or machine outside of the model (typically measures); +EnumerableProperty - parent of subclass of properties defined by EnumerationKind; +QuantifiableProperty - parent of subclass of properties defined by numerical values. And their different associations : -QuantifiableActuatableProperty -QuantifiableObservableProperty -EnumeratedObservableProperty -EnumeratedActuatableProperty +QuantifiableActuatableProperty, +QuantifiableObservableProperty, +EnumeratedObservableProperty, +EnumeratedActuatableProperty. A QuantifiableProperty (or subClass thereof) must always be associated with a Unit and a QuantityKind, either explicitly from the Property, or through the associated Value. If the Unit is defined, the SHACL reasoner (if invoked) will figure out and assert the QuantityKind (the most general version). Enumerable properties must be associated with an EnumerationKind. """ ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "A Property can be associated with any number of EnumerationKinds using the relation hasAspect" ; + sh:property [ rdfs:comment "" ; + sh:path s223:ofSubstance ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "If an incoming relation hasConstituent exists, then the Property must have a declared substance using the relation ofSubstance." ; + sh:message "Property {$this} is referred to by {?something} with s223:hasConstituent, but the Property has no value for s223:ofSubstance." ; + sh:prefixes ; + sh:select """ +SELECT $this ?something +WHERE { +?something s223:hasConstituent $this . +FILTER NOT EXISTS {$this s223:ofSubstance ?someSubstance} . +} +""" ] ], + [ rdfs:comment "If the relation hasAspect is present, it must associate the Property with an EnumerationKind." ; sh:class s223:EnumerationKind ; sh:path s223:hasAspect ], - [ 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 ref:hasExternalReference)" ; + [ rdfs:comment "If the relation hasExternalReference is present it must associate the Property with an ExternalReference." ; + sh:class s223:ExternalReference ; + sh:path s223:hasExternalReference ], + [ rdfs:comment "A Property can use at most one relation hasValue if it is required to provide a static value in the model. It is not meant for real-time value (see `s223:hasExternalReference`)." ; sh:maxCount 1 ; sh:path s223:hasValue ], - [ rdfs:comment "A Property can be associated with at most one EnumerationKind-Medium using the relation ofMedium" ; - sh:class s223:EnumerationKind-Medium ; + [ rdfs:comment "A Property can be associated with at most one EnumerationKind-Medium using the relation ofMedium." ; + sh:class s223:Substance-Medium ; sh:maxCount 1 ; sh:path s223:ofMedium ], - [ rdfs:comment "A Property can be associated with at most one EnumerationKind-Substance using the relation ofSubstance" ; + [ rdfs:comment "A Property can be associated with at most one EnumerationKind-Substance using the relation ofSubstance." ; sh:class s223:EnumerationKind-Substance ; sh:maxCount 1 ; sh:path s223:ofSubstance ], - [ rdfs:comment "A Property can be associated with any number of ExternalReferences using the relation hasExternalReference" ; - sh:class ref:ExternalReference ; - sh:path ref:hasExternalReference ] ; + [ rdfs:comment "A Property can be associated with at most one FunctionBlock using the inverse relation hasOutput." ; + sh:class s223:FunctionBlock ; + sh:maxCount 1 ; + sh:message "A Property can be associated with at most one FunctionBlock using the inverse relation hasOutput." ; + sh:path [ sh:inversePath s223:hasOutput ] ] ; sh:sparql [ a sh:SPARQLConstraint ; rdfs:comment "A Property instance cannot be declared an instance of both an ActuatableProperty and an ObservableProperty." ; sh:message "{$this} cannot be declared an instance of both an ActuatableProperty and an ObservableProperty." ; - sh:prefixes s223: ; + sh:prefixes ; sh:select """ SELECT $this WHERE { @@ -2659,54 +4481,71 @@ $this a/rdfs:subClassOf* s223:ObservableProperty . } """ ] . -s223:hasProperty a rdf:Property ; - rdfs:label "has Property" . +s223:hasDomain a rdf:Property ; + rdfs:label "has domain" ; + rdfs:comment "The relation hasDomain is used to indicate what domain a Zone or DomainSpace pertains to (e.g. HVAC, lighting, electrical, etc.). Possible values are defined in EnumerationKind-Domain (see `s223:EnumerationKind-Domain`)." . + +s223:observes a rdf:Property ; + rdfs:label "observes" ; + rdfs:comment "The relation observes binds a sensor to one ObservableProperty `see s223:ObservableProperty` which is used by the sensor to generate a measurement value (ex. a temperature) or a simple observation of a stimulus causing a reaction (a current binary switch that closes a dry contact when a fan is powered on)." . + +qudt:hasQuantityKind rdfs:comment "A reference to the QuantityKind of a QuantifiableProperty of interest, e.g. quantitykind:Temperature." . s223:Connectable a s223:Class, sh:NodeShape ; rdfs:label "Connectable" ; s223:abstract true ; - rdfs:comment "Connectable is an abstract class representing a thing (Equipment or DomainSpace) that can be connected via ConnectionPoints and Connections." ; + rdfs:comment "Connectable is an abstract class representing a thing such as, Equipment (see `s223:Equipment`), DomainSpace (see `s223:DomainSpace`), or Junction (see `s223:Junction`) that can be connected via ConnectionPoints and Connections." ; rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "A Connectable can be associated with any number of other Connectables using the relation connected" ; + sh:property [ rdfs:comment "For a Connectable, cnx relation must associate the Connectable to a ConnectionPoint" ; + sh:path s223:cnx ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "A Connectable should only have a s223:cnx relation with a ConnectionPoint" ; + sh:message "{$this} cannot have a s223:cnx relation to {?something}, because {?something} is not a ConnectionPoint." ; + sh:prefixes ; + sh:select """SELECT $this ?something +WHERE { +$this s223:cnx ?something . +FILTER NOT EXISTS {?something a/rdfs:subClassOf* s223:ConnectionPoint} . +}""" ] ], + [ rdfs:comment "If a Connectable has s223:connected or s223:connectedTo (i.e. high-level connection specification), it must also have the supporting cnx relations (low-level connection specification)." ; + sh:path s223:cnx ; + sh:severity sh:Warning ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "If a Connectable has s223:connected or s223:connectedTo (i.e. high-level connection specification), it must also have the supporting cnx relations (low-level connection specification)." ; + sh:message "{$this} is s223:connected (high-level) to {?otherC} but not connected at the cnx-level." ; + sh:prefixes ; + sh:select """ +SELECT $this ?otherC +WHERE { +$this s223:connected ?otherC . +FILTER NOT EXISTS {$this s223:cnx+ ?otherC} +} +""" ] ], + [ rdfs:comment "If the relation cnx is present it must associate the Connectable with a ConnectionPoint." ; + sh:class s223:ConnectionPoint ; + sh:path s223:cnx ], + [ rdfs:comment "If the relation connected is present it must associate the Connectable with a Connectable." ; sh:class s223:Connectable ; sh:name "SymmetricConnectableToConnectableShape" ; sh:path s223:connected ], - [ rdfs:comment "A Connectable can be associated with any number of other Connectables using the relation connectedFrom" ; + [ rdfs:comment "If the relation connectedFrom is present it must associate the Connectable with a Connectable." ; sh:class s223:Connectable ; sh:path s223:connectedFrom ], - [ rdfs:comment "A Connectable can be associated with any number of Connections using the relation connectedThrough" ; + [ rdfs:comment "If the relation connectedThrough is present it must associate the Connectable with a Connection." ; sh:class s223:Connection ; sh:name "EquipmentToConnectionShape" ; sh:path s223:connectedThrough ], - [ rdfs:comment "A Connectable can be associated with any number of other Connectables using the relation connectedTo" ; + [ rdfs:comment "If the relation connectedTo is present it must associate the Connectable with a Connectable." ; sh:class s223:Connectable ; sh:name "ConnectableToConnectableShape" ; sh:path s223:connectedTo ], - [ rdfs:comment "A Connectable can be associated with any number of ConnectionPoints using the relation hasConnectionPoint" ; + [ rdfs:comment "If the relation hasConnectionPoint is present it must associate the Connectable with a ConnectionPoint." ; sh:class s223:ConnectionPoint ; sh:name "EquipmentToConnectionPointShape" ; - sh:path s223:hasConnectionPoint ], - [ rdfs:comment "A ConnectionPoint must be associated with Equipment or DomainSpace using the relation hasConnectionPoint." ; - sh:message "This ConnectionPoint must be associated with Equipment or PhysicalSpace using the relation hasConnectionPoint." ; - sh:path s223:isConnectionPointOf ; - sh:severity sh:Info ], - [ rdfs:comment "If a CP mapsTo another CP, the respective Equipment should have a contains relation." ; - sh:path s223:mapsTo ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "If a Connectable is s223:connected (high-level), it must eventually have the underlying cnx relations." ; - sh:message "{$this} is s223:connected (high-level) to {?otherC} but not yet connected at the cnx-level." ; - sh:prefixes s223: ; - sh:select """ -SELECT $this ?otherC -WHERE { -$this s223:connected ?otherC . -FILTER NOT EXISTS {$this s223:cnx+ ?otherC} -} -""" ; - sh:severity sh:Warning ] ] ; + sh:path s223:hasConnectionPoint ] ; sh:rule [ a sh:SPARQLRule ; - rdfs:comment "Infer the connected relationship for BiDirectional connections" ; + rdfs:comment "Infer the connected relation for BiDirectional connections" ; sh:construct """ CONSTRUCT {$this s223:connected ?d2 .} WHERE { @@ -2717,27 +4556,27 @@ FILTER NOT EXISTS {?d2 s223:contains* $this} . } """ ; sh:name "InferredEquipmentToDownstreamEquipmentProperty" ; - sh:prefixes s223: ], + sh:prefixes ], [ a sh:TripleRule ; - rdfs:comment "Infer the connected relationship using connectedTo" ; + rdfs:comment "Infer the connected relation using connectedTo" ; sh:name "InferredEquipmentToEquipmentPropertyfromconnectedTo" ; sh:object [ sh:path s223:connectedTo ] ; sh:predicate s223:connected ; sh:subject sh:this ], [ a sh:TripleRule ; - rdfs:comment "Infer the connectedThrough relationship using hasConnectionPoint and connectsThrough" ; + rdfs:comment "Infer the connectedThrough relation using hasConnectionPoint and connectsThrough" ; sh:name "InferredEquipmentToConnectionProperty" ; sh:object [ sh:path ( s223:hasConnectionPoint s223:connectsThrough ) ] ; sh:predicate s223:connectedThrough ; sh:subject sh:this ], [ a sh:TripleRule ; - rdfs:comment "Infer the hasConnectionPoint relationship using cnx" ; + rdfs:comment "Infer the hasConnectionPoint relation using cnx" ; sh:name "InferredEquipmentToConnectionPointProperty" ; sh:object [ sh:path s223:cnx ] ; sh:predicate s223:hasConnectionPoint ; sh:subject sh:this ], [ a sh:SPARQLRule ; - rdfs:comment "Infer the connectedFrom relationship" ; + rdfs:comment "Infer the connectedFrom relations using connectsThrough and connectsFrom." ; sh:construct """ CONSTRUCT {$this s223:connectedFrom ?equipment .} WHERE { @@ -2747,9 +4586,9 @@ $this s223:hasConnectionPoint ?cp . } """ ; sh:name "InferredEquipmentToUpstreamEquipmentProperty" ; - sh:prefixes s223: ], + sh:prefixes ], [ a sh:SPARQLRule ; - rdfs:comment "Infer the connectedTo relationship" ; + rdfs:comment "Infer the connectedTo relation using connectsThrough and connectsTo." ; sh:construct """ CONSTRUCT {$this s223:connectedTo ?equipment .} WHERE { @@ -2759,209 +4598,85 @@ $this s223:hasConnectionPoint ?cp . } """ ; sh:name "InferredEquipmentToDownstreamEquipmentProperty" ; - sh:prefixes s223: ], + sh:prefixes ], [ a sh:TripleRule ; - rdfs:comment "Infer the cnx relationship from hasConnectionPoint" ; + rdfs:comment "Infer the cnx relationship using hasConnectionPoint." ; sh:name "InferredEquipmentToConnectionPointCnxProperty" ; sh:object [ sh:path s223:hasConnectionPoint ] ; sh:predicate s223:cnx ; sh:subject sh:this ], [ a sh:TripleRule ; - rdfs:comment "Infer the cnx relationship from isConnectionPointOf" ; + rdfs:comment "Infer the cnx relation using isConnectionPointOf." ; sh:name "InferredEquipmentToConnectionPointCnxPropertyFromInverse" ; sh:object [ sh:path [ sh:inversePath s223:isConnectionPointOf ] ] ; sh:predicate s223:cnx ; sh:subject sh:this ], [ a sh:TripleRule ; - rdfs:comment "Infer the connected relationship using connectedFrom" ; + rdfs:comment "Infer the connected relation using connectedFrom" ; sh:name "InferredEquipmentToEquipmentPropertyfromconnectedFrom" ; sh:object [ sh:path s223:connectedFrom ] ; sh:predicate s223:connected ; sh:subject sh:this ] . -s223:EnumerationKind-Medium a s223:Class, - s223:EnumerationKind-Medium, +s223:Substance-Medium a s223:Class, + s223:Substance-Medium, sh:NodeShape ; rdfs:label "Medium" ; - rdfs:subClassOf s223:EnumerationKind . + rdfs:comment "This class has enumerated instances of a physical substance or anything that allows for the transfer of energy or information." ; + rdfs:subClassOf s223:EnumerationKind-Substance . -s223:ConnectionPoint a s223:Class, +s223:Electricity-DC a s223:Class, + s223:Electricity-DC, sh:NodeShape ; - rdfs:label "ConnectionPoint" ; - s223:abstract true ; - rdfs:comment """ -A ConnectionPoint is 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. Equipment and DomainSpaces can have one or more ConnectionPoints (see `s223:Connectable` and `s223:Connection`). - -A ConnectionPoint must constrained to relate to a specific medium such as air, water, or electricity which determines what other things can be connected to it. For example, constraining a ConnectionPoint to be for air means it cannot be used for an electrical connection. - -A ConnectionPoint belongs to exactly one connectable thing. - -ConnectionPoints are represented graphically in this standard by a triangle with the point indicating a direction of flow, or a diamond in the case of a bidirectional connection as shown in Figure 5-2. - -![Figure 5-2. Graphical Representation of a ConnectionPoint.](figures/Figure_5-2_Graphical_Depiciton_of_Connection_Points.svg) - - """ ; - rdfs:subClassOf s223:Concept ; - sh:property [ rdfs:comment "A ConnectionPoint should be associated with one Connection using the relation connectsThrough" ; - sh:class s223:Connection ; - sh:maxCount 1 ; - sh:message "This ConnectionPoint should eventually be associated with exactly one Connection." ; - sh:minCount 1 ; - sh:name "ConnectionPointToConnectionShape" ; - sh:path s223:connectsThrough ; - sh:severity sh:Info ], - [ rdfs:comment "A ConnectionPoint must be associated with one EnumerationKind-Medium using the relation hasMedium" ; - sh:class s223:EnumerationKind-Medium ; - sh:maxCount 1 ; + rdfs:label "Electricity DC" ; + s223:hasVoltage s223:Numerical-Voltage ; + rdfs:comment "This class has enumerated instances of all DC forms of electricity." ; + rdfs:subClassOf s223:Medium-Electricity ; + sh:property [ rdfs:comment "An electricity DC medium must have two reference voltages." ; sh:minCount 1 ; - sh:name "ConnectionPoint medium" ; - sh:path s223:hasMedium ], - [ rdfs:comment "A ConnectionPoint can be associated with at most one Connectable using the relation isConnectionPointOf" ; - sh:class s223:Connectable ; - sh:maxCount 1 ; - sh:name "ConnectionPointToEquipmentShape" ; - sh:path s223:isConnectionPointOf ], - [ rdfs:comment "A ConnectionPoint can be associated with any number of Segments using the relation lnx" ; - sh:class s223:Segment ; - sh:path s223:lnx ], - [ rdfs:comment "A ConnectionPoint can be associated with at most one other ConnectionPoint using the relation mapsTo" ; - sh:class s223:ConnectionPoint ; - sh:maxCount 1 ; - sh:path s223:mapsTo ], - [ s223:description "A ConnectionPoint must be associated with Equipment or DomainSpace using the relation hasConnectionPoint." ; - sh:message "This ConnectionPoint must be associated with Equipment or PhysicalSpace using the relation hasConnectionPoint." ; - sh:path s223:isConnectionPointOf ; - sh:severity sh:Info ], - [ s223:description "If a CP mapsTo another CP, the respective Equipment should have a contains relation." ; - sh:path s223:mapsTo ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "If a CP mapsTo another CP, the respective Equipment should have a contains relation." ; - sh:message "{?otherEquipment} should contain {?equipment} because ConnectionPoint {$this} has a mapsTo relation." ; - sh:prefixes s223: ; - sh:select """ -SELECT $this ?equipment ?otherEquipment -WHERE { -$this s223:mapsTo ?otherCP . -?equipment s223:hasConnectionPoint $this . -?otherEquipment s223:hasConnectionPoint ?otherCP . -FILTER NOT EXISTS {?otherEquipment s223:contains ?equipment} -} -""" ] ], - [ sh:name "Test for compatible declared Medium" ; - sh:path s223:hasMedium ; - sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Ensure that the Medium identified by a ConnectionPoint via the s223:hasMedium relation is compatible with the Medium identified by the entity identified by the mapsTo+ relation." ; - sh:message "{$this} declares a Medium of {?a}, but the Medium of {?b} is declared by {?target} pointed to by the mapsTo+ relation." ; - sh:prefixes s223: ; - sh:select """ -SELECT DISTINCT $this ?a ?b ?target -WHERE { -$this s223:hasMedium ?a . -$this s223:mapsTo+ ?target . -?target s223:hasMedium ?b . -?a a/rdfs:subClassOf* s223:EnumerationKind-Medium . -?b a/rdfs:subClassOf* s223:EnumerationKind-Medium . -FILTER (?a != ?b ) . -FILTER (NOT EXISTS {?b a/rdfs:subClassOf* ?a}) . -FILTER (NOT EXISTS {?a a/rdfs:subClassOf* ?b}) . -} -""" ] ], - s223:hasPropertyShape . - -s223:Sensor a s223:Class, - sh:NodeShape ; - rdfs:label "Sensor" ; - 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." ; - rdfs:subClassOf s223:AbstractSensor ; - sh:rule [ a sh:SPARQLRule ; - rdfs:comment "Infer the hasMeasurementLocation relationship for a Sensor from the Property that it is observing, only if the location is unambiguous." ; - sh:construct """ -CONSTRUCT {$this s223:hasMeasurementLocation ?something .} -WHERE { -{ -SELECT ?prop (COUNT (DISTINCT ?measurementLocation) AS ?count) $this -WHERE { -FILTER (NOT EXISTS {$this s223:hasMeasurementLocation ?anything}) . -$this s223:observes ?prop . -?measurementLocation s223:hasProperty ?prop . -} -GROUP BY ?prop $this -} -FILTER (?count = 1) . -?something s223:hasProperty ?prop . -{?something a/rdfs:subClassOf* s223:Connectable} -UNION -{?something a/rdfs:subClassOf* s223:Connection} -UNION -{?something a/rdfs:subClassOf* s223:Segment} -UNION -{?something a/rdfs:subClassOf* s223:ConnectionPoint} -} -""" ; - sh:name "InferredMeasurementLocation" ; - sh:prefixes s223: ] ; - sh:xone ( [ sh:property [ rdfs:comment "A Sensor must be associated with exactly 1 of Connectable, Connection, Segment, or ConnectionPoint by hasMeasurementLocation." ; - sh:class s223:Connectable ; - sh:path s223:hasMeasurementLocation ] ] [ sh:property [ rdfs:comment "A Sensor must be associated with exactly 1 of Connectable, Connection, Segment, or ConnectionPoint by hasMeasurementLocation." ; - sh:class s223:Connection ; - sh:path s223:hasMeasurementLocation ] ] [ sh:property [ rdfs:comment "A Sensor must be associated with exactly 1 of Connectable, Connection, Segment, or ConnectionPoint by hasMeasurementLocation." ; - sh:class s223:Segment ; - sh:path s223:hasMeasurementLocation ] ] [ sh:property [ rdfs:comment "A Sensor must be associated with exactly 1 of Connectable, Connection, Segment, or ConnectionPoint by hasMeasurementLocation." ; - sh:class s223:ConnectionPoint ; - sh:path s223:hasMeasurementLocation ] ] ), - ( [ sh:property [ rdfs:comment "A Sensor must be associated with exactly 1 of QuantifiableObservableProperty or EnumeratedObservableProperty by observes." ; - sh:class s223:QuantifiableObservableProperty ; - sh:path s223:observes ] ] [ sh:property [ rdfs:comment "A Sensor must be associated with exactly 1 of QuantifiableObservableProperty or EnumeratedObservableProperty by observes." ; - sh:class s223:EnumeratedObservableProperty ; - sh:path s223:observes ] ] ) . - -s223:EnumerationKind-Domain a s223:Class, - s223:EnumerationKind-Domain, - sh:NodeShape ; - rdfs:label "EnumerationKind Domain" ; - rdfs:subClassOf s223:EnumerationKind . - -s223:hasRole a rdf:Property ; - rdfs:label "hasRole" ; - rdfs:comment "The relation hasRole is used to indicate the role of an Equipment, Connection, or System within a building (e.g., a heating coil will be associated with Role-Heating). Possible values are defined in EnumerationKind-Role (see `s223:EnumerationKind-Role`)." . - -s223:contains a rdf:Property ; - rdfs:label "contains" . - -s223:Electricity-AC a s223:Class, - s223:Electricity-AC, - sh:NodeShape ; - rdfs:label "AC Electricity" ; - rdfs:subClassOf s223:Medium-Electricity . - -s223:Medium-Water a s223:Class, - s223:Medium-Water, - sh:NodeShape ; - rdfs:label "Medium-Water" ; - rdfs:subClassOf s223:EnumerationKind-Medium . + sh:or ( [ sh:class s223:Numerical-DCVoltage ] [ sh:class s223:Numerical-Voltage ] ) ; + sh:path s223:hasVoltage ] . -s223:EnumerationKind-Role a s223:Class, - s223:EnumerationKind-Role, +s223:EnumerationKind-Domain a s223:Class, + s223:EnumerationKind-Domain, sh:NodeShape ; - rdfs:label "Role" ; + rdfs:label "EnumerationKind Domain" ; + rdfs:comment "A Domain represents a categorization of building services or specialization used to characterize equipment or spaces in a building. Example domains include HVAC, Lighting, and Plumbing." ; rdfs:subClassOf s223:EnumerationKind . s223:Concept a s223:Class, sh:NodeShape ; rdfs:label "Concept" ; s223:abstract true ; - rdfs:comment "This is the superclass of all classes defined in the 223 standard." ; + rdfs:comment "All classes defined in the 223 standard are subclasses of s223:Concept." ; rdfs:subClassOf rdfs:Resource ; - sh:property [ rdfs:comment "A Concept can use the relation cnx" ; - sh:path s223:cnx ], - [ rdfs:comment "A Concept can use the relation hasProperty" ; + sh:property [ rdfs:comment "If the relation hasProperty is present, it must associate the concept with a Property." ; + sh:class s223:Property ; sh:path s223:hasProperty ], - [ rdfs:comment "A Concept can use the relation label" ; - sh:path rdfs:label ] ; + [ rdfs:comment "A Concept must be associated with at least one label using the relation label." ; + sh:minCount 1 ; + sh:path rdfs:label ; + sh:severity sh:Warning ] ; sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Flag entities that have a hasMedium value which is incompatible with the ofMedium value of an associated Property." ; + sh:message "{$this} hasMedium of {?m1}, but is associated with property {?prop} that has ofMedium of {?m2}." ; + 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 . +FILTER (?m1 != ?m2 ) . +FILTER (NOT EXISTS {?m2 a/rdfs:subClassOf* ?m1}) . +FILTER (NOT EXISTS {?m1 a/rdfs:subClassOf* ?m2}) . +} +""" ], + [ 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" ; sh:message "{$this} cannot be declared an instance of only abstract class {?class}." ; - sh:prefixes s223: ; + sh:prefixes ; sh:select """ SELECT DISTINCT $this ?class WHERE { @@ -2976,155 +4691,175 @@ FILTER (!bound (?otherClass)) . } """ ] . +s223:cnx a s223:SymmetricProperty ; + rdfs:label "cnx" ; + rdfs:comment "The cnx relation is a symmetric property used to associate adjacent entities in a connection path (comprised of Equipment-ConnectionPoint-Connection-ConnectionPoint-Equipment sequences)." . + +s223:hasRole a rdf:Property ; + rdfs:label "hasRole" ; + rdfs:comment "The relation hasRole is used to indicate the role of an Equipment, Connection, ConnectionPoint, or System within a building (e.g., a heating coil will be associated with Role-Heating). Possible values are defined in EnumerationKind-Role (see `s223:EnumerationKind-Role`)." . + +s223:Numerical-LineLineVoltage a s223:Class, + s223:Numerical-LineLineVoltage, + sh:NodeShape ; + rdfs:label "Dimensioned Line-Line Voltage" ; + s223:hasVoltage s223:Numerical-Voltage ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "This class has enumerated instances of common line-line voltages." ; + rdfs:subClassOf s223:EnumerationKind-Numerical ; + sh:property [ rdfs:comment "An AC-Numerical-LineLineVoltage must have a voltage" ; + sh:class s223:Numerical-Voltage ; + sh:minCount 1 ; + sh:path s223:hasVoltage ] . + s223:EnumerationKind a s223:Class, s223:EnumerationKind, sh:NodeShape ; rdfs:label "Enumeration kind" ; - rdfs:comment "This is the encapsulating class for all EnumerationKinds. EnumerationKinds define the (closed) set of permissible values for a given purpose. For example, the DayOfWeek EnumerationKind enumerates the days of the week and allows no other values." ; - rdfs:subClassOf s223:Concept . + rdfs:comment """This is the encapsulating class for all EnumerationKinds. + EnumerationKinds define the (closed) set of permissible values for a given purpose. + For example, the DayOfWeek EnumerationKind enumerates the days of the week and allows no other values. + +EnumeratinKinds are arranged in a tree hierarchy. +As you navigate down the tree each branch or leaf value is a more specific instance of the EnumerationKind. +Certain validation constraints exist in the standard that evaluate compatibility of EnumerationKinds. +Two values are deemed compatible if they are the same or if one is a direct ancestor (or descendant) of the other.""" ; + rdfs:subClassOf s223:Concept ; + sh:property [ rdfs:comment "An EnumerationKind must not use the generalized hasProperty relation. Some EnumerationKinds have specifically-defined relations to Property." ; + sh:maxCount 0 ; + sh:message "An EnumerationKind must not use the generalized hasProperty relation. EnumerationKind is a controlled vocabulary which must not be modified within a model." ; + sh:path s223:hasProperty ] . + +s223:Numerical-LineNeutralVoltage a s223:Class, + s223:Numerical-LineNeutralVoltage, + sh:NodeShape ; + rdfs:label "Dimensioned Line-Neutral Voltage" ; + s223:hasVoltage s223:Numerical-Voltage ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "This class has enumerated instances of common line-neutral voltages." ; + rdfs:subClassOf s223:EnumerationKind-Numerical ; + sh:property [ rdfs:comment "An AC-Numerical-LineNeutralVoltage must have a voltage" ; + sh:class s223:Numerical-Voltage ; + sh:minCount 1 ; + sh:path s223:hasVoltage ] . + +s223:Medium-Air a s223:Class, + s223:Medium-Air, + sh:NodeShape ; + rdfs:label "Medium-Air" ; + rdfs:comment "This class has enumerated instances of Air in various states." ; + rdfs:subClassOf s223:Substance-Medium . + +s223:EnumerationKind-Role a s223:Class, + s223:EnumerationKind-Role, + sh:NodeShape ; + rdfs:label "Role" ; + rdfs:comment "This class has enumerated instances of roles played by entities, such as cooling, generator, relief, return." ; + rdfs:subClassOf s223:EnumerationKind . + +s223:Medium-Water a s223:Class, + s223:Medium-Water, + sh:NodeShape ; + rdfs:label "Medium-Water" ; + rdfs:comment "This class has enumerated instances of water and aqueous solutions in various states." ; + rdfs:subClassOf s223:Substance-Medium . s223:Medium-Electricity a s223:Class, s223:Medium-Electricity, sh:NodeShape ; rdfs:label "Electricity" ; - rdfs:subClassOf s223:EnumerationKind-Medium . + rdfs:comment "This class has enumerated instances of all forms of electricity, including AC and DC." ; + rdfs:subClassOf s223:Substance-Medium . -s223:Medium-Air a s223:Class, - s223:Medium-Air, - sh:NodeShape ; - rdfs:label "Medium-Air" ; - rdfs:subClassOf s223:EnumerationKind-Medium . +s223:Frequency-50Hz a s223:Numerical-Frequency ; + rdfs:label "50 Hertz" ; + s223:hasValue 50.0 ; + qudt:hasQuantityKind qudtqk:Frequency ; + qudt:hasUnit unit:HZ . + +s223:NumberOfElectricalPhases-ThreePhase a s223:Numerical-NumberOfElectricalPhases ; + rdfs:label "Three Phase AC Electricity" ; + s223:hasValue 3.0 ; + qudt:hasQuantityKind qudtqk:Dimensionless ; + qudt:hasUnit unit:NUM . s223:OutletConnectionPoint a s223:Class, sh:NodeShape ; rdfs:label "Outlet Connection Point" ; - rdfs:comment "An OutletConnectionPoint indicates that a substance must flow out of the domain space at this connection point and cannot flow in the other direction. An OutletConnectionPoint is a predefined subclass of ConnectionPoint." ; + rdfs:comment "An OutletConnectionPoint indicates that a substance must flow out of a Connectable (see 's223:Connectable') at this connection point and cannot flow in the other direction. An OutletConnectionPoint is a predefined subclass of ConnectionPoint." ; rdfs:subClassOf s223:ConnectionPoint ; - sh:property [ rdfs:comment "An OutletConnectionPoint can be associated with one other OutletConnectionPoint using the relation mapsTo" ; - sh:class s223:OutletConnectionPoint ; - sh:path s223:mapsTo ], - [ rdfs:comment "Ensure an OutletCP does not mapsTo a subordinate OutletCP that is part of an internal Connection" ; + sh:property [ rdfs:comment "Ensure an OutletConnectionPoint has a mapsTo relation to its containing Equipment if it has an external Connection" ; sh:path s223:mapsTo ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Ensure a CP does not mapsTo a subordinate CP that is part of an internal Connection" ; - sh:message "{$this} should not have a mapsTo {?otherCP} because {?otherCP} participates in an internal Connection to {?destinationDevice}." ; - sh:prefixes s223: ; + rdfs:comment "Ensure an OutletConnectionPoint has a mapsTo relation to its containing Equipment if it has an external Connection" ; + sh:message "{$this} must have a mapsTo an OutletConnectionPoint of {?parentEquipment} and not an external Connection to {?destinationEquipment}." ; + sh:prefixes ; sh:select """ -SELECT $this ?otherCP ?destinationDevice +SELECT $this ?parentEquipment ?destinationEquipment WHERE { -$this s223:mapsTo ?otherCP . ?equipment s223:hasConnectionPoint $this . -?otherEquipment s223:hasConnectionPoint ?otherCP . -?otherCP s223:connectsThrough/s223:connectsTo ?destinationDevice . -?destinationDevice s223:contains ?equipment . +?parentEquipment s223:contains ?equipment . +$this s223:connectsThrough/s223:connectsTo ?destinationEquipment . +FILTER NOT EXISTS {?parentEquipment s223:contains ?destinationEquipment} . +FILTER NOT EXISTS {$this s223:mapsTo ?anything} . } -""" ] ] . +""" ] ], + [ rdfs:comment "If the relation mapsTo is present it must associate the OutletConnectionPoint with an OutletConnectionPoint." ; + sh:class s223:OutletConnectionPoint ; + sh:path s223:mapsTo ] . s223:InletConnectionPoint a s223:Class, sh:NodeShape ; rdfs:label "Inlet Connection Point" ; rdfs:comment "An InletConnectionPoint indicates that a substance must flow into the equipment or domain space at this connection point and cannot flow the other direction. An IntletConnectionPoint is a subclass of ConnectionPoint." ; rdfs:subClassOf s223:ConnectionPoint ; - sh:property [ rdfs:comment "An InletConnectionPoint can ne associated with one other InletConnectionPoint using the relation mapsTo" ; - sh:class s223:InletConnectionPoint ; - sh:path s223:mapsTo ], - [ rdfs:comment "Ensure an InletCP does not mapsTo a subordinate InletCP that is part of an internal Connection" ; + sh:property [ rdfs:comment "Ensure an InletConnectionPoint has a mapsTo relation to its containing Equipment if it has an external Connection" ; sh:path s223:mapsTo ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Ensure a CP does not mapsTo a subordinate CP that is part of an internal Connection" ; - sh:message "{$this} should not have a mapsTo {?otherCP} because {?otherCP} participates in an internal Connection from {?destinationDevice}." ; - sh:prefixes s223: ; + rdfs:comment "Ensure an InletConnectionPoint has a mapsTo relation to its containing Equipment if it has an external Connection" ; + sh:message "{$this} must have a mapsTo an InletConnectionPoint of {?parentEquipment} and not an external Connection from {?sourceEquipment}." ; + sh:prefixes ; sh:select """ -SELECT $this ?otherCP ?destinationDevice +SELECT $this ?parentEquipment ?sourceEquipment WHERE { -$this s223:mapsTo ?otherCP . ?equipment s223:hasConnectionPoint $this . -?otherEquipment s223:hasConnectionPoint ?otherCP . -?otherCP s223:connectsThrough/s223:connectsFrom ?destinationDevice . -?destinationDevice s223:contains ?equipment . +?parentEquipment s223:contains ?equipment . +$this s223:connectsThrough/s223:connectsFrom ?sourceEquipment . +FILTER NOT EXISTS {?parentEquipment s223:contains ?sourceEquipment} . +FILTER NOT EXISTS {$this s223:mapsTo ?anything} . } -""" ] ] . +""" ] ], + [ rdfs:comment "If the relation mapsTo is present it must associate the InletConnectionPoint with an InletConnectionPoint." ; + sh:class s223:InletConnectionPoint ; + sh:path s223:mapsTo ] . -s223: a owl:Ontology ; - sh:declare [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; - sh:prefix "s223" ], - [ sh:namespace "http://data.ashrae.org/standard223/1.0/vocab/role#"^^xsd:anyURI ; - sh:prefix "role" ], - [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; - sh:prefix "qudtqk" ], - [ sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ; - sh:prefix "unit" ], - [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; - sh:prefix "rdfs" ], - [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; - sh:prefix "s223" ], - [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; - sh:prefix "rdfs" ], - [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; - sh:prefix "s223" ], - [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; - sh:prefix "qudt" ], - [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; - sh:prefix "quantitykind" ], - [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; - sh:prefix "s223" ], - [ sh:namespace "http://data.ashrae.org/standard223/1.0/vocab/role#"^^xsd:anyURI ; - sh:prefix "role" ], - [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ; - sh:prefix "qudtqk" ], - [ sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ; - sh:prefix "unit" ], - [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; - sh:prefix "rdfs" ], - [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; - sh:prefix "s223" ], - [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; - sh:prefix "rdfs" ], - [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; - sh:prefix "s223" ], - [ sh:namespace "http://data.ashrae.org/standard223/1.0/vocab/enumeration#"^^xsd:anyURI ; - sh:prefix "enum" ], - [ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ; - sh:prefix "rdf" ], - [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; - sh:prefix "rdfs" ], - [ sh:namespace "http://www.w3.org/ns/shacl#"^^xsd:anyURI ; - sh:prefix "sh" ], - [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; - sh:prefix "s223" ], - [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ; - sh:prefix "rdfs" ], - [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ; - sh:prefix "s223" ], - [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ; - sh:prefix "qudt" ] . +s223:EnumerationKind-Aspect a s223:Class, + s223:EnumerationKind, + s223:EnumerationKind-Aspect, + sh:NodeShape ; + rdfs:label "Enumeration Kind-Aspect", + "EnumerationKind-Aspect" ; + rdfs:comment "This class has enumerated instances to specify contexts used with the s223:hasAspect relation for a s223:Property with a non-numerical value." ; + rdfs:subClassOf s223:EnumerationKind . s223:Equipment a s223:Class, sh:NodeShape ; rdfs:label "Equipment" ; - rdfs:comment "A Equipment is the modeling construct used to represent a mechanical device designed to accomplish a specific task that one might buy from a vendor. Examples of possible devices include a pump, fan, heat exchanger, luminaire, temperature sensor, or flow meter." ; + rdfs:comment """An Equipment is the modeling construct used to represent a mechanical device designed to accomplish a specific task, + or a complex device that contains component pieces of Equipment. Unlike a System, Equipment can have ConnectionPoints and participate + in the flow of one or more kinds of Medium. Examples of possible equipment include a Pump, Fan, HeatExchanger, Luminaire, + TemperatureSensor, FlowSensor or more complex examples such as a chilled water plant. + The graphical depiction of Equipment used in this standard is a rounded cornered rectangle as show in Figure 5-1. + ![Graphical Depiction of Equipment.](figures/Figure_5-1Graphical_Depiciton_of_Equipment.svg)""" ; rdfs:subClassOf s223:Connectable ; - sh:property [ a sh:PropertyShape ; - rdfs:comment "A Equipment can be associated with Equipment by contains" ; - sh:class s223:Equipment ; - sh:minCount 0 ; - sh:name "device contains shape" ; - sh:path s223:contains ], - [ rdfs:comment "A Equipment can be associated with an ActuatableProperty by commandedByProperty" ; - sh:class s223:ActuatableProperty ; - sh:path s223:commandedByProperty ], - [ rdfs:comment "A Equipment can be associated with a PhysicalSpace by hasPhysicalLocation" ; - sh:class s223:PhysicalSpace ; - sh:path s223:hasPhysicalLocation ], - [ rdfs:comment "A Equipment can be associated with an EnumerationKind-Role by hasRole" ; - sh:class s223:EnumerationKind-Role ; - sh:path s223:hasRole ], - [ rdfs:comment "Make sure that a containing Equipment inherits the incoming connectedFrom relations of contained Equipment if they are not internal connections." ; + sh:property [ rdfs:comment "Disallow contained equipment from having external incoming connections." ; sh:path s223:connectedFrom ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Make sure that a containing Equipment inherits the incoming connectedFrom relations of contained Equipment if they are not internal connections." ; - sh:message "{?container} does not have a connectedFrom relation to {?otherDev} even though {?container} contains {$this} which does." ; - sh:prefixes s223: ; + rdfs:comment "Disallow contained equipment from having external incoming connections." ; + sh:message "{$this} should not have a connection from external equipment {?otherDev} because {?container} contains {$this}." ; + sh:prefixes ; sh:select """ SELECT $this ?container ?otherDev WHERE { @@ -3132,15 +4867,14 @@ $this s223:connectedFrom ?otherDev . $this ^s223:contains ?container . ?container a/rdfs:subClassOf* s223:Equipment . FILTER NOT EXISTS {?container s223:contains ?otherDev .} -FILTER NOT EXISTS {?container s223:connectedFrom ?otherDev .} } """ ] ], - [ rdfs:comment "Make sure that a containing Equipment inherits the outgoing connectedTo relations of contained Equipment if they are not internal connections." ; + [ rdfs:comment "Disallow contained equipment from having external outgoing connections." ; sh:path s223:connectedTo ; sh:sparql [ a sh:SPARQLConstraint ; - rdfs:comment "Make sure that a containing Equipment inherits the outgoing connectedTo relations of contained Equipment if they are not internal connections." ; - sh:message "{?container} does not have a connectedTo relation to {?otherDev} even though {?container} contains {$this} which does." ; - sh:prefixes s223: ; + rdfs:comment "Disallow contained equipment from having external outgoing connections." ; + sh:message "{$this} should not have a connection to external equipment {?otherDev} because {?container} contains {$this}." ; + sh:prefixes ; sh:select """ SELECT $this ?container ?otherDev WHERE { @@ -3148,15 +4882,15 @@ $this s223:connectedTo ?otherDev . $this ^s223:contains ?container . ?container a/rdfs:subClassOf* s223:Equipment . FILTER NOT EXISTS {?container s223:contains ?otherDev .} -FILTER NOT EXISTS {?container s223:connectedTo ?otherDev .} } """ ] ], [ rdfs:comment "Warning about a subClass of Equipment of type A containing something that is in the same subClass branch." ; sh:path s223:contains ; + sh:severity sh:Warning ; sh:sparql [ a sh:SPARQLConstraint ; rdfs:comment "Warning about a subClass of Equipment of type A containing something that is in the same subClass branch." ; sh:message "{$this}, of type {?type1}, contains {?subEquip} of type {?type2}, that could result in double-counting items in the class hierarchy of {?type1}." ; - sh:prefixes s223: ; + sh:prefixes ; sh:select """ SELECT $this ?subEquip ?type1 ?type2 WHERE { @@ -3173,13 +4907,43 @@ UNION ?type1 rdfs:subClassOf* ?type2 . } } -""" ; - sh:severity sh:Warning ] ], - s223:hasPropertyShape ; +""" ] ], + [ a sh:PropertyShape ; + rdfs:comment "If the relation contains is present it must associate the Equipment with either Equipment or Junction." ; + sh:name "device contains shape" ; + sh:or ( [ sh:class s223:Equipment ] [ sh:class s223:Junction ] ) ; + sh:path s223:contains ], + [ rdfs:comment "If the relation commandedByProperty is present it must associate the Equipment with a ActuatableProperty." ; + sh:class s223:ActuatableProperty ; + sh:path s223:commandedByProperty ], + [ rdfs:comment "If the relation executes is present it must associate the Equipment with a FunctionBlock." ; + sh:class s223:FunctionBlock ; + sh:path s223:executes ], + [ rdfs:comment "If the relation hasPhysicalLocation is present it must associate the Equipment with a PhysicalSpace." ; + sh:class s223:PhysicalSpace ; + sh:path s223:hasPhysicalLocation ], + [ rdfs:comment "If the relation hasRole is present it must associate the Equipment with a EnumerationKind-Role." ; + sh:class s223:EnumerationKind-Role ; + sh:path s223:hasRole ] ; sh:rule [ a sh:SPARQLRule ; - rdfs:comment "Infer a higher-level cnx and Medium from the mapsTo relation" ; + rdfs:comment "For equipment contained within another piece of equipment use the mapsTo relation to infer a Medium from the containing equipment." ; + sh:construct """ +CONSTRUCT { + ?childCp s223:hasMedium ?medium . +} +WHERE { + $this s223:hasConnectionPoint ?cp . + ?childCp s223:mapsTo ?cp . + ?cp s223:connectsThrough ?connection . + ?cp s223:hasMedium ?medium . + FILTER NOT EXISTS {?childCp s223:hasMedium ?something} . +} +""" ; + sh:prefixes ], + [ a sh:SPARQLRule ; + rdfs:comment "For equipment containing another piece of equipment, use the mapsTo relation to infer a Medium from the contained equipment." ; sh:construct """ -CONSTRUCT {?parentCp s223:cnx ?connection . +CONSTRUCT { ?parentCp s223:hasMedium ?medium . } WHERE { @@ -3187,16 +4951,156 @@ WHERE { ?cp s223:mapsTo ?parentCp . ?cp s223:connectsThrough ?connection . ?cp s223:hasMedium ?medium . + FILTER NOT EXISTS {?parentCp s223:hasMedium ?something} . +} +""" ; + sh:prefixes ] . + +s223:Numerical-Voltage a s223:Class, + s223:Numerical-Voltage, + sh:NodeShape ; + rdfs:label "Dimensioned Voltage" ; + qudt:hasQuantityKind qudtqk:Voltage ; + qudt:hasUnit unit:V ; + rdfs:comment "Does this fix the error?", + "This class has enumerated instances of common voltages." ; + rdfs:subClassOf s223:EnumerationKind-Numerical ; + sh:property [ rdfs:comment "A Numerical-Voltage must have a Quantity Kind of Voltage" ; + sh:hasValue qudtqk:Voltage ; + sh:path qudt:hasQuantityKind ], + [ rdfs:comment "A Numerical-Voltage must have a unit of Volts" ; + sh:hasValue unit:V ; + sh:path qudt:hasUnit ] . + +s223:NumberOfElectricalPhases-SinglePhase a s223:Numerical-NumberOfElectricalPhases ; + rdfs:label "Single Phase AC Electricity" ; + s223:hasValue 1.0 ; + qudt:hasQuantityKind qudtqk:Dimensionless ; + qudt:hasUnit unit:NUM . + +s223:QuantifiableProperty a s223:Class, + sh:NodeShape ; + rdfs:label "Quantifiable Property" ; + 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." ; + rdfs:subClassOf s223:Property, + qudt:Quantity ; + sh:property [ rdfs:comment "This QuantifiableProperty uses a different Unit than the Setpoint associated with it." ; + sh:path qudt:hasUnit ; + sh:severity sh:Info ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "This QuantifiableProperty uses a different Unit than the Setpoint associated with it." ; + sh:message "{$this} uses Unit {?punit}, while Setpoint {?setpoint} uses Unit {?sunit}. Be careful." ; + 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) . +} +""" ] ], + [ rdfs:comment "This QuantifiableProperty and the Setpoint associated with it have non-commensurate QuantityKinds." ; + sh:path qudt:hasQuantityKind ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "This QuantifiableProperty and the Setpoint associated with it have non-commensurate QuantityKinds." ; + sh:message "{$this} uses QuantityKind {?pqk} with DimensionVector {?pdv}, while Setpoint {?setpoint} uses QuantityKind {?sqk} with DimensionVector {?sdv}. These are non-commensurate" ; + sh:prefixes ; + sh:select """ +SELECT $this ?setpoint ?pqk ?sqk ?pdv ?sdv +WHERE { +$this qudt:hasQuantityKind ?pqk . +$this s223:hasSetpoint ?setpoint . +?setpoint qudt:hasQuantityKind ?sqk . +?pqk qudt:hasDimensionVector ?pdv . +?sqk qudt:hasDimensionVector ?sdv . +FILTER (?pqk != ?sqk) . +FILTER (?pdv != ?sdv) . +} +""" ] ], + [ rdfs:comment "This QuantifiableProperty and the associated Setpoint use non-commensurate Units." ; + sh:path qudt:hasUnit ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "This QuantifiableProperty and the associated Setpoint use non-commensurate Units." ; + sh:message "{$this} uses Unit {?punit}, while Setpoint {?setpoint} uses Unit {?sunit}. These are non-commensurate." ; + 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) . +} +""" ] ], + [ rdfs:comment "A QuantifiableProperty can be associated with a decimal value using the relation hasValue." ; + sh:datatype xsd:decimal ; + sh:path s223:hasValue ], + [ rdfs:comment "A QuantifiableProperty must be associated with at least one QuantityKind using the relation hasQuantityKind." ; + sh:class qudt:QuantityKind ; + sh:minCount 1 ; + sh:path qudt:hasQuantityKind ], + [ rdfs:comment "A QuantifiableProperty must be associated with at least one Unit using the relation hasUnit." ; + sh:class qudt:Unit ; + sh:minCount 1 ; + sh:path qudt:hasUnit ; + sh:severity sh:Info ] ; + sh:rule [ a sh:SPARQLRule ; + rdfs:comment "Infer the hasQuantityKind relation if it is unambiguous." ; + sh:construct """ +CONSTRUCT { +$this qudt:hasQuantityKind ?uniqueqk +} +WHERE { +{ +SELECT $this (COUNT (DISTINCT (?qk)) AS ?count) +WHERE { +FILTER (NOT EXISTS {$this qudt:hasQuantityKind ?something}) . +$this qudt:hasUnit/qudt:hasQuantityKind ?qk . +} +GROUP BY $this +} +FILTER (?count = 1) +$this qudt:hasUnit/qudt:hasQuantityKind ?uniqueqk . } """ ; - sh:prefixes s223: ] . + sh:prefixes ] ; + sh:sparql [ a sh:SPARQLConstraint ; + rdfs:comment "Checks for consistent dimension vectors for a QuantityKind and the Unit" ; + sh:message "Inconsistent dimensionalities among the Property's Unit and Property's Quantity Kind" ; + sh:prefixes ; + sh:select """ +SELECT $this ?count +WHERE { +{ SELECT $this (COUNT (DISTINCT ?qkdv) AS ?count) + WHERE +{ + { + $this qudt:hasQuantityKind/qudt:hasDimensionVector ?qkdv . + } + UNION + { + $this qudt:hasUnit/qudt:hasDimensionVector ?qkdv . + } +} + GROUP BY $this +} +FILTER (?count > 1) . +} +""" ] . rdf:Property a sh:NodeShape ; - sh:property [ rdfs:comment "This Property must have aa label" ; + sh:property [ rdfs:comment "This Property must have a label" ; sh:path rdfs:label ; sh:sparql [ a sh:SPARQLConstraint ; sh:message "{$this} must have an rdfs:label" ; - sh:prefixes s223: ; + sh:prefixes ; sh:select """ SELECT $this WHERE { @@ -3204,12 +5108,53 @@ BIND(REPLACE(STR($this), "^(.*)(/|#)([^#/]*)$", "$1") AS ?prop) . FILTER (?prop = "http://data.ashrae.org/standard223") . FILTER (NOT EXISTS {$this rdfs:label ?something}) . } +""" ] ], + [ rdfs:comment "This Property must have a comment" ; + sh:path rdfs:comment ; + sh:sparql [ a sh:SPARQLConstraint ; + sh:message "{$this} must have an rdfs:comment" ; + sh:prefixes ; + sh:select """ +SELECT $this +WHERE { +BIND(REPLACE(STR($this), "^(.*)(/|#)([^#/]*)$", "$1") AS ?prop) . +FILTER (?prop = "http://data.ashrae.org/standard223") . +FILTER (NOT EXISTS {$this rdfs:comment ?something}) . +} """ ] ] . +s223:Frequency-60Hz a s223:Numerical-Frequency ; + rdfs:label "60 Hertz" ; + s223:hasValue 60.0 ; + qudt:hasQuantityKind qudtqk:Frequency ; + qudt:hasUnit unit:HZ . + s223:hasMedium a rdf:Property ; rdfs:label "has Medium" ; rdfs:comment "The relation hasMedium is used to indicate what medium is flowing through the connection (e.g., air, water, electricity). The possible values are defined in EnumerationKind-Medium (see `s223:EnumerationKind-Medium`)." . +s223:Electricity-AC a s223:Class, + s223:Electricity-AC, + sh:NodeShape ; + rdfs:label "Electricity AC" ; + s223:hasFrequency s223:Numerical-Frequency ; + s223:hasNumberOfElectricalPhases s223:Numerical-NumberOfElectricalPhases ; + s223:hasVoltage s223:Numerical-Voltage ; + rdfs:comment "This class has enumerated instances of all AC forms of electricity." ; + rdfs:subClassOf s223:Medium-Electricity ; + sh:property [ rdfs:comment "An electricity AC medium must have a frequency" ; + sh:class s223:Numerical-Frequency ; + sh:minCount 1 ; + sh:path s223:hasFrequency ], + [ rdfs:comment "An electricity AC medium must have a number of electrical phases." ; + sh:class s223:Numerical-NumberOfElectricalPhases ; + sh:minCount 1 ; + sh:path s223:hasNumberOfElectricalPhases ], + [ rdfs:comment "An electricity AC medium must have a voltage." ; + sh:minCount 1 ; + sh:or ( [ sh:class s223:Numerical-LineLineVoltage ] [ sh:class s223:Numerical-LineNeutralVoltage ] [ sh:class s223:Numerical-Voltage ] ) ; + sh:path s223:hasVoltage ] . + s223:hasConnectionPoint a rdf:Property ; rdfs:label "has connection point" ; s223:inverseOf s223:isConnectionPointOf ; @@ -3217,20 +5162,3 @@ s223:hasConnectionPoint a rdf:Property ; [] sh:minCount 1 . -s223:EnumerationKind-FlowStatus a s223:Class, s223:EnumerationKind-FlowStatus, sh:NodeShape ; - rdfs:label "flow status" ; - rdfs:subClassOf s223:EnumerationKind . - - -s223:Role-HeatExchanger a s223:Class, s223:HeatExchanger-Role, sh:NodeShape ; - rdfs:label "hx role" ; - rdfs:subClassOf s223:EnumerationKind-Role . -s223:HeatExchanger-Evaporator a s223:Role-HeatExchanger ; - rdfs:label "evaporator" . -s223:HeatExchanger-Cooling a s223:Role-HeatExchanger ; - rdfs:label "cooling" . -s223:HeatExchanger-Heating a s223:Role-HeatExchanger ; - rdfs:label "heating" . -s223:FCU a s223:Class, sh:NodeShape ; - rdfs:label "fcu" ; - rdfs:subClassOf s223:TerminalUnit.