@prefix bacnet: <http://data.ashrae.org/bacnet/2020#> .
@prefix g36: <http://data.ashrae.org/standard223/1.0/extensions/g36#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix quantitykind: <http://qudt.org/vocab/quantitykind/> .
@prefix qudt: <http://qudt.org/schema/qudt/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix s223: <http://data.ashrae.org/standard223#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix unit: <http://qudt.org/vocab/unit/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

s223:AbstractClass a s223:Class,
        s223:Concept,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "Abstract class"^^xsd:string ;
    rdfs:comment "This is a modeling construct. Instances of abstract classes cannot be created. All abstract classes in this standard have a more specific subclass."^^xsd:string ;
    rdfs:subClassOf s223:Class .

s223:Class a s223:Concept,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "Class"^^xsd:string ;
    rdfs:comment "This is a modeling construct. All classes defined in the 223 standard are instances of `Class`."^^xsd:string ;
    rdfs:subClassOf s223:Concept,
        rdfs:Class ;
    sh:property [ rdfs:comment "A `Class` shall be associated with at least one label using the relation `rdfs:label`."^^xsd:string ;
            sh:message "s223: A `Class` shall be associated with at least one label using the relation `rdfs:label`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path rdfs:label ;
            sh:severity sh:Warning ] .

s223:Concept a s223:Class,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "Concept"^^xsd:string ;
    rdfs:comment "All classes and relations defined in the 223 standard are subclasses of `Concept`."^^xsd:string ;
    rdfs:subClassOf rdfs:Resource ;
    sh:property [ rdfs:comment "Incompatible Medium. Case1: An entity with a pure medium and an associated `Property` with a different pure medium."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 1: Two pure mediums."^^xsd:string ;
                    sh:message "s223: {$this} `hasMedium` of {?m1}, but is associated with `Property` {?prop} that has `ofMedium` of {?m2}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    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 {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {?m2 s223:composedOf ?c2}
FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) .
FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "Incompatible Medium. Case3: An entity with constituents and an associated `Property` with a pure medium."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 3: A medium with constituents and an associated `Property` with a pure medium."^^xsd:string ;
                    sh:message "s223: {$this} `hasMedium` of {?m2}, but is associated with `Property` {?prop} that has `ofMedium` of {?m1}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?m1 ?prop ?m2
WHERE {
$this s223:hasMedium ?m2 .
$this ?p ?prop .
?prop a/rdfs:subClassOf* s223:Property .
?prop s223:ofMedium ?m1 .
?m2 s223:composedOf/s223:ofConstituent ?s2 .
FILTER NOT EXISTS {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {
  ?m2 s223:composedOf/s223:ofConstituent ?s12 .
  {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} .
}
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Concept` shall be associated with zero or more `Property`s using the relation `hasProperty`."^^xsd:string ;
            sh:class s223:Property ;
            sh:message "s223: A `Concept` shall be associated with zero or more `Property`s using the relation `hasProperty`."^^xsd:string ;
            sh:path s223:hasProperty ],
        [ rdfs:comment "Incompatible Medium. Case2: An entity with a pure medium and an associated `Property` with constituents."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 2: A pure medium and an associated `Property` with constituents."^^xsd:string ;
                    sh:message "s223: {$this} `hasMedium` of {?m1}, but is associated with `Property` {?prop} that has `ofMedium` of {?m2}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?m1 ?prop ?m2
WHERE {
$this s223:hasMedium ?m1 .
$this ?p ?prop .
?prop a/rdfs:subClassOf* s223:Property .
?prop s223:ofMedium ?m2 .
?m2 s223:composedOf/s223:ofConstituent ?s2 .
FILTER NOT EXISTS {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {
  ?m2 s223:composedOf/s223:ofConstituent ?s12 .
  {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} .
}
}
"""^^xsd:string ] ],
        [ rdfs:comment "Incompatible Medium. Case4: An entity with constituents and an associated `Property` with constituents."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 4: A medium with constituents and an associated `Property` with constituents."^^xsd:string ;
                    sh:message "s223: {$this} `hasMedium` of {?m1}, but is associated with `Property` {?prop} that has `ofMedium` of {?m2}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    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 .
    ?m1 s223:composedOf/s223:ofConstituent ?s1 .
    ?m2 s223:composedOf/s223:ofConstituent ?s2 .
  FILTER NOT EXISTS {
    ?m1 s223:composedOf/s223:ofConstituent ?s11 .
    ?m2 s223:composedOf/s223:ofConstituent ?s12 .
    FILTER (?s11 = ?s12) .
  }
  FILTER NOT EXISTS {
    ?m1 s223:composedOf/s223:ofConstituent ?s21 .
    ?m2 s223:composedOf/s223:ofConstituent ?s22 .
    {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} .
  }
}
"""^^xsd:string ] ] .

s223:Relation a s223:Class,
        s223:Concept,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "Relation"^^xsd:string ;
    rdfs:comment "A `Relation` associates the subject and the object in an RDF triple, the *predicate* portion of a *(subject, predicate, object)* triple."^^xsd:string ;
    rdfs:subClassOf s223:Concept,
        rdf:Property ;
    sh:property [ rdfs:comment "A `Relation` shall be associated with at least one label using the relation `rdfs:label`."^^xsd:string ;
            sh:message "s223: A `Relation` shall be associated with at least one label using the relation `rdfs:label`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path rdfs:label ;
            sh:severity sh:Warning ] .

s223:RelationWithInverse a s223:Class,
        s223:Concept,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "Relation with inverse"^^xsd:string ;
    rdfs:comment """An `RelationWithInverse` is modeling construct used to define symmetric behavior
for certain relations in the standard such as `connectedTo` and `connectedFrom`."""^^xsd:string ;
    rdfs:subClassOf s223:Relation ;
    sh:property [ rdfs:comment "A `RelationWithInverse` shall be associated with exactly one other `RelationWithInverse` using the relation `inverseOf`."^^xsd:string ;
            sh:class s223:RelationWithInverse ;
            sh:maxCount 1 ;
            sh:message "s223: A `RelationWithInverse` shall be associated with exactly one other `RelationWithInverse` using the relation `inverseOf`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:inverseOf ] .

s223:SymmetricRelation a s223:Class,
        s223:Concept,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "Symmetric relation"^^xsd:string ;
    rdfs:comment """A modeling construct used to define symmetric behavior
for certain relations in the standard such as `cnx`, `connected`, and `pairedConnectionPoint`."""^^xsd:string ;
    rdfs:subClassOf s223:Relation .

g36:ChilledWaterCoil a s223:Class,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "ChilledWaterCoil"^^xsd:string ;
    rdfs:comment "A cooling coil with a connected chilled water valve."^^xsd:string ;
    rdfs:subClassOf s223:CoolingCoil ;
    sh:property [ rdfs:comment "The ChilledWaterCoil shall be connected to a ChilledWaterValve using the relation connectedTo."^^xsd:string ;
            sh:path s223:connectedTo ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class g36:ChilledWaterValve ] ] .

g36:ChilledWaterValve a s223:Class,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "Chilled Water Valve"^^xsd:string ;
    rdfs:comment "A valve that controls the flow of chilled water through a chilled water coil."^^xsd:string ;
    rdfs:subClassOf s223:Valve .

g36:Damper a s223:Class,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "Damper"^^xsd:string ;
    rdfs:comment "A damper with an analog or two binary position command properties."^^xsd:string ;
    rdfs:subClassOf s223:Damper .

g36:ElectricHeatingCoil a s223:Class,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "Electric Heating Coil"^^xsd:string ;
    rdfs:comment "An electrical heating element with an analog heating command."^^xsd:string ;
    rdfs:subClassOf s223:ElectricResistanceElement ;
    sh:property [ rdfs:comment "An electric heating coil shall have at least one analog heating command property using a relation hasProperty."^^xsd:string ;
            sh:message "g36: An electric heating coil shall have at least one analog heating command property using a relation hasProperty."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasProperty ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:QuantifiableActuatableProperty ;
                    sh:node [ sh:property [ sh:hasValue quantitykind:DimensionlessRatio ;
                                    sh:maxCount 1 ;
                                    sh:minCount 1 ;
                                    sh:path qudt:hasQuantityKind ] ] ] ] .

g36:Fan a s223:Class,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "Fan"^^xsd:string ;
    rdfs:comment "A fan with a start/stop command."^^xsd:string ;
    rdfs:subClassOf s223:Fan ;
    sh:property [ rdfs:comment "A Fan shall have at least one Start/Stop command using the relation hasProperty."^^xsd:string ;
            sh:message "g36: A Fan shall have at least one Start/Stop command using the relation hasProperty."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasProperty ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:EnumeratedActuatableProperty ;
                    sh:node [ sh:property [ sh:class s223:Binary-OnOff ;
                                    sh:maxCount 1 ;
                                    sh:minCount 1 ;
                                    sh:path s223:hasEnumerationKind ] ] ] ] .

g36:FanWithVFD a s223:Class,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "FanWithVFD"^^xsd:string ;
    rdfs:comment "A fan controlled by a VFD."^^xsd:string ;
    rdfs:subClassOf g36:Fan ;
    sh:property [ rdfs:comment "A fan with VFD shall have at least one fan speed command using the relation hasProperty."^^xsd:string ;
            sh:message "g36: A fan with VFD shall have at least one fan speed command using the relation hasProperty."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasProperty ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:QuantifiableActuatableProperty ;
                    sh:node [ sh:property [ sh:hasValue quantitykind:DimensionlessRatio ;
                                    sh:maxCount 1 ;
                                    sh:minCount 1 ;
                                    sh:path qudt:hasQuantityKind ] ] ] ] .

g36:HotWaterCoil a s223:Class,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "HotWater/ReheatCoil"^^xsd:string ;
    rdfs:comment "A hot water coil connected to a control valve."^^xsd:string ;
    rdfs:subClassOf s223:HeatingCoil ;
    sh:property [ rdfs:comment "The HotWaterCoil shall be connected to a HotWaterValve using the relation connectedTo."^^xsd:string ;
            sh:message "g36: The HotWaterCoil shall be connected to a HotWaterValve using the relation connectedTo."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:connectedTo ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class g36:HotWaterValve ] ] .

g36:HotWaterValve a s223:Class,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "Hot Water Valve"^^xsd:string ;
    rdfs:comment "A valve that controls the flow of hot water through a hot water coil."^^xsd:string ;
    rdfs:subClassOf s223:Valve .

g36:TwoPositionDamper a s223:Class,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "Two Position Damper"^^xsd:string ;
    rdfs:comment "A damper that can take two positions: fully open and fully closed."^^xsd:string ;
    rdfs:subClassOf s223:Damper ;
    sh:property [ rdfs:comment "A Two Position Damper shall have at least one open-and-close damper command property using the relation hasProperty."^^xsd:string ;
            sh:message "g36: A Two Position Damper shall have at least one open-and-close damper command property using the relation hasProperty."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasProperty ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:EnumeratedActuatableProperty ;
                    sh:node [ sh:property [ sh:class s223:EnumerationKind-Binary ;
                                    sh:maxCount 1 ;
                                    sh:minCount 1 ;
                                    sh:path s223:hasEnumerationKind ],
                                [ sh:hasValue s223:Binary-Position ;
                                    sh:maxCount 1 ;
                                    sh:minCount 1 ;
                                    sh:path s223:hasAspect ] ] ] ] .

g36:Zone a s223:Class,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "Zone"^^xsd:string ;
    rdfs:comment "A thermal zone with the points required for Guideline 36 control sequences. It is a collection of s223:DomainSpace instances."^^xsd:string ;
    rdfs:subClassOf s223:Zone ;
    sh:property [ rdfs:comment "A Zone shall have at least one Domain-HVAC using the relation hasDomain. "^^xsd:string ;
            sh:hasValue s223:Domain-HVAC ;
            sh:message "g36: A Zone shall have at least one Domain-HVAC using the relation hasDomain. "^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasDomain ],
        [ rdfs:comment "A Zone shall have at least a zone CO2 concentration property using the relation hasProperty, if applicable control is used."^^xsd:string ;
            sh:message "g36: A Zone shall have at least a zone CO2 concentration property using the relation hasProperty, if applicable control is used."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasProperty ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:QuantifiableObservableProperty ;
                    sh:node [ sh:property [ sh:hasValue quantitykind:DimensionlessRatio ;
                                    sh:maxCount 1 ;
                                    sh:minCount 1 ;
                                    sh:path qudt:hasQuantityKind ],
                                [ sh:hasValue s223:Constituent-CO2 ;
                                    sh:maxCount 1 ;
                                    sh:minCount 1 ;
                                    sh:path s223:ofConstituent ] ] ] ;
            sh:severity sh:Info ],
        [ rdfs:comment "A Zone shall have at least one binary zone occupancy property using the relation hasProperty"^^xsd:string ;
            sh:message "g36: A Zone shall have at least one binary zone occupancy property using the relation hasProperty"^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasProperty ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:EnumeratedObservableProperty ;
                    sh:node [ sh:property [ sh:class s223:EnumerationKind-Occupancy ;
                                    sh:maxCount 1 ;
                                    sh:minCount 1 ;
                                    sh:path s223:hasEnumerationKind ] ] ] ;
            sh:severity sh:Info ],
        [ rdfs:comment "A Zone shall have a zone temperature setpoint adjustment property using the relation hasProperty, if applicable."^^xsd:string ;
            sh:message "g36: A Zone shall have a zone temperature setpoint adjustment property using the relation hasProperty, if applicable."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasProperty ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:QuantifiableObservableProperty ;
                    sh:node [ sh:property [ sh:hasValue s223:Aspect-Delta ;
                                    sh:maxCount 1 ;
                                    sh:minCount 1 ;
                                    sh:path s223:hasAspect ],
                                [ sh:hasValue quantitykind:Temperature ;
                                    sh:maxCount 1 ;
                                    sh:minCount 1 ;
                                    sh:path qudt:hasQuantityKind ] ] ] ;
            sh:qualifiedValueShapesDisjoint true ;
            sh:severity sh:Info ],
        [ rdfs:comment "A Zone shall have at least one window switch on-off property using the relation hasProperty."^^xsd:string ;
            sh:message "g36: A Zone shall have at least one window switch on-off property using the relation hasProperty."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasProperty ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:EnumeratedObservableProperty ;
                    sh:node [ sh:property [ rdfs:comment "Property shall be measured at a window."^^xsd:string ;
                                    sh:class s223:Window ;
                                    sh:path [ sh:alternativePath ( ( [ sh:inversePath s223:observes ] s223:hasObservationLocation ) [ sh:inversePath s223:hasProperty ] ) ] ],
                                [ sh:class s223:Binary-OnOff ;
                                    sh:maxCount 1 ;
                                    sh:minCount 1 ;
                                    sh:path s223:hasEnumerationKind ] ] ] ;
            sh:severity sh:Info ] .

g36:ZoneGroup a s223:Class,
        rdfs:Class,
        sh:NodeShape ;
    rdfs:label "Zone Group"^^xsd:string ;
    rdfs:comment "A ZoneGroup is a grouping of zones that may be scheduled together. Zone groupings must be assigned based on rules in Clause 3.1.3 of Guideline 36."^^xsd:string ;
    rdfs:subClassOf s223:Zone ;
    sh:property [ rdfs:comment "A ZoneGroup shall contain at least one Zone using the relation contains."^^xsd:string ;
            sh:class g36:Zone ;
            sh:message "g36: A ZoneGroup shall contain at least one Zone using the relation contains."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:contains ],
        [ rdfs:comment "A ZoneGroup shall have the Domain HVAC using the relation hasDomain."^^xsd:string ;
            sh:hasValue s223:Domain-HVAC ;
            sh:message "g36: A ZoneGroup shall have the Domain HVAC using the relation hasDomain."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasDomain ] .

s223:AbstractClassShape a sh:NodeShape ;
    sh:sparql [ a sh:SPARQLConstraint ;
            sh:message "s223: {$this} cannot be declared an instance of only {?c}, which is an abstract class."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            sh:select """
            SELECT $this ?c
            WHERE {
              $this a ?c .
              ?c   a s223:AbstractClass .
              FILTER NOT EXISTS {
                $this a ?nonAbs .
                ?nonAbs rdfs:subClassOf+ ?c .
                FILTER NOT EXISTS { ?nonAbs a s223:AbstractClass }
              }
            }
        """^^xsd:string ] ;
    sh:targetClass s223:AbstractClass ;
    sh:targetSubjectsOf rdf:type .

s223:ActuatablePropertyShape a sh:NodeShape ;
    sh:property [ rdfs:comment "An `ActuatableProperty` normally is referred to by `Equipment` using the relation `actuatedByProperty`."^^xsd:string ;
            sh:class s223:Equipment ;
            sh:message "s223: An `ActuatableProperty` normally is referred to by `Equipment` using the relation `actuatedByProperty`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path [ sh:inversePath s223:actuatedByProperty ] ;
            sh:severity sh:Warning ] ;
    sh:targetClass s223:ActuatableProperty .

s223:Actuator a s223:Class,
        sh:NodeShape ;
    rdfs:label "Actuator"^^xsd:string ;
    rdfs:comment """A piece of `Equipment` that receives control signals and electrically, pneumatically, or hydraulically makes changes in the
physical world, such as the position of a valve or damper."""^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `Actuator` shall be associated with zero or more pieces of `Equipment` using the relation `actuates`."^^xsd:string ;
            sh:class s223:Equipment ;
            sh:message "s223: An `Actuator` shall be associated with zero or more pieces of `Equipment` using the relation `actuates`."^^xsd:string ;
            sh:path s223:actuates ],
        [ rdfs:comment "An `Actuator` shall be associated with at least one `ActuatableProperty` using the relation `actuatedByProperty`."^^xsd:string ;
            sh:class s223:ActuatableProperty ;
            sh:message "s223: An `Actuator` shall be associated with at least one `ActuatableProperty` using the relation `actuatedByProperty`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:actuatedByProperty ] .

s223:AirHandlingUnit a s223:Class,
        sh:NodeShape ;
    rdfs:label "Air handling unit"^^xsd:string ;
    rdfs:comment """A piece of `Equipment` consisting of a fan or fans and other equipment necessary to perform one or more of the following functions:
circulating, filtration, heating, cooling, heat recovery, humidifying, dehumidifying, and mixing of air."""^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `AirHandlingUnit` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: An `AirHandlingUnit` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "An `AirHandlingUnit` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: An `AirHandlingUnit` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:AirToAirHeatPump a s223:Class,
        sh:NodeShape ;
    rdfs:label "Air-to-air heat pump"^^xsd:string ;
    rdfs:comment "A `HeatPump` that transfers thermal energy between two bodies of air."^^xsd:string ;
    rdfs:subClassOf s223:HeatPump ;
    sh:property [ rdfs:comment "An `AirToAirHeatPump` shall have at least two inlets using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: An `AirToAirHeatPump` shall have at least two inlets using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "An `AirToAirHeatPump` shall have at least two outlets using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: An `AirToAirHeatPump` shall have at least two outlets using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:BACnetExternalReferenceShape a sh:NodeShape ;
    sh:property [ a sh:PropertyShape ;
            rdfs:comment "A `BACnetExternalReferenceShape` shall be associated with at most one BACnet device identifier using the relation `bacnet:device-identifier`."^^xsd:string ;
            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]*$"^^xsd:string ],
        [ a sh:PropertyShape ;
            rdfs:comment "A `BACnetExternalReferenceShape` shall be associated with at most one string value using the relation `bacnet:property-identifier`. The string value shall be either a decimal number or exactly equal to the ASHRAE 135-2024 Clause 21 identifier text of BACnetPropertyIdentifier. If it is omitted, it defaults to \"present-value\", except for BACnet File objects, where absence of `bacnet:property-identifier` refers to the entire content of the file accessed with Stream Access."^^xsd:string ;
            sh:datatype xsd:string ;
            sh:maxCount 1 ;
            sh:minCount 0 ;
            sh:path bacnet:property-identifier ],
        [ a sh:PropertyShape ;
            rdfs:comment "A `BACnetExternalReferenceShape` shall be associated with at most one index for reading items from a BACnet property that is an array using the relation `bacnet:property-array-index`."^^xsd:string ;
            sh:datatype xsd:nonNegativeInteger ;
            sh:maxCount 1 ;
            sh:minCount 0 ;
            sh:path bacnet:property-array-index ],
        [ a sh:PropertyShape ;
            rdfs:comment "A `BACnetExternalReferenceShape` shall be associated with at most one BACnet object identifier using the relation `bacnet:object-identifier`."^^xsd:string ;
            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]*$"^^xsd:string ],
        [ a sh:PropertyShape ;
            rdfs:comment "A `BACnetExternalReferenceShape` shall be associated with at most one BACnet object name using the relation `bacnet:object-name`."^^xsd:string ;
            sh:datatype xsd:string ;
            sh:maxCount 1 ;
            sh:minCount 0 ;
            sh:path bacnet:object-name ],
        [ a sh:PropertyShape ;
            rdfs:comment "A `BACnetExternalReferenceShape` shall be associated with at most one priority for writing values using the relation `bacnet:priority-for-writing`."^^xsd:string ;
            sh:datatype xsd:nonNegativeInteger ;
            sh:maxCount 1 ;
            sh:minCount 0 ;
            sh:path bacnet:priority-for-writing ],
        [ a sh:PropertyShape ;
            rdfs:comment "A `BACnetExternalReferenceShape` shall be associated with at most one BACnet device name using the relation `bacnet:device-name`."^^xsd:string ;
            sh:datatype xsd:string ;
            sh:maxCount 1 ;
            sh:minCount 0 ;
            sh:path bacnet:device-name ] ;
    sh:targetClass s223:BACnetExternalReference .

s223:Bathtub a s223:Class,
        sh:NodeShape ;
    rdfs:label "Bathtub"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` for bathing that receives as an input hot or cold water dispensed from one or two `Faucet`s, and is designed to hold a specific volume of water and release the held water through a `Drain`."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Bathtub` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Bathtub` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `Bathtub` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Bathtub` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:BatteryCPShape a sh:NodeShape ;
    rdfs:label "Battery CP shape"^^xsd:string ;
    rdfs:comment "A `Battery` shall have at least one outlet or bidirectional connection point using the medium `Constituent-Electricity`."^^xsd:string ;
    sh:message "s223: A `Battery` shall have at least one outlet or bidirectional connection point using the medium `Constituent-Electricity`."^^xsd:string ;
    sh:or ( [ sh:property [ rdfs:comment "A `Battery` shall have at least one outlet or bidirectional connection point using the medium `Constituent-Electricity`."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                                sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "A `Battery` shall have at least one outlet or bidirectional connection point using the medium `Constituent-Electricity`."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                                sh:path s223:hasMedium ] ] ] ] ] ) ;
    sh:severity sh:Warning ;
    sh:targetClass s223:Battery .

s223:Boiler a s223:Class,
        sh:NodeShape ;
    rdfs:label "Boiler"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that uses fuel or electricity to heat water or other fluids and supply steam or hot water for heating, humidification, or other applications."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Boiler` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Boiler` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `Boiler` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Boiler` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ChilledBeamShape a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "A `ChilledBeam` must always have the role `Role-Cooling`"^^xsd:string ;
            sh:object s223:Role-Cooling ;
            sh:predicate s223:hasRole ;
            sh:subject sh:this ] ;
    sh:targetClass s223:ChilledBeam .

s223:Chiller a s223:Class,
        sh:NodeShape ;
    rdfs:label "Chiller"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that removes heat from a liquid coolant via a vapor-compression, adsorption refrigeration, or absorption refrigeration cycles."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Chiller` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Chiller` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `Chiller` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Chiller` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ClosedWorld223Shape a sh:NodeShape ;
    rdfs:label "Closed-world s223 shape"^^xsd:string ;
    rdfs:comment "Ensure that all instances of an s223 class use only the relations defined for that class. Note that this only applies to s223 relations."^^xsd:string ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment """Ensure that all instances of an s223 class use only the relations defined for that class. Note that only s223
relations are checked by this validation."""^^xsd:string ;
            sh:message "s223: s223 predicate {?p} is not defined for instance {$this}."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            sh:select """
SELECT $this ?p ?o
WHERE {
?p a/rdfs:subClassOf* s223:Relation .
$this ?p ?o .
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 .
}
}
"""^^xsd:string ] ;
    sh:targetClass s223:Concept .

s223:ClosedWorldQUDTShape a sh:NodeShape ;
    rdfs:label "Closed-world QUDT shape"^^xsd:string ;
    rdfs:comment "Ensure that all instances of an s223 class use only the relations defined for that class. Note that this only applies to QUDT relations."^^xsd:string ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment """Ensure that all instances of an s223 class use only the relations defined for that class. Note that only QUDT
relations are checked by this validation."""^^xsd:string ;
            sh:message "s223: QUDT predicate {?p} is not defined for instance {$this}."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            sh:select """
SELECT $this ?p ?o
WHERE {
$this ?p ?o .
FILTER(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 .
}
}
"""^^xsd:string ] ;
    sh:targetClass s223:Concept .

s223:ClothesWasher a s223:Class,
        sh:NodeShape ;
    rdfs:label "Clothes washer"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that automatically cleans a load of textiles (e.g., clothing, bedding)."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `ClothesWasher` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `ClothesWasher` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `ClothesWasher` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `ClothesWasher` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `ClothesWasher` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `ClothesWasher` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:CoaxialCable a s223:Class,
        sh:NodeShape ;
    rdfs:label "Coaxial cable"^^xsd:string ;
    rdfs:comment "A type of `Waveguide` that consists of a central conductor, surrounded by an insulator, a metallic shield, and an outer jacket, all sharing the same geometric axis - which allows it to efficiently transmit high-frequency signals over long distances with minimal interference - and is used for `Wideband-DOCSIS` and `Wideband-CATV` communication."^^xsd:string ;
    rdfs:subClassOf s223:Waveguide ;
    sh:property [ rdfs:comment "A `CoaxialCable` shall be associated with exactly one `Wideband-DOCSIS` or `Wideband-CATV` using the relation `hasMedium`."^^xsd:string ;
            sh:maxCount 1 ;
            sh:message "s223: A `CoaxialCable` shall be associated with exactly one `Wideband-DOCSIS` or `Wideband-CATV` using the relation `hasMedium`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasMedium ;
            sh:xor ( [ sh:class s223:Wideband-DOCSIS ] [ sh:class s223:Wideband-CATV ] ) ] .

s223:CoffeeMaker a s223:Class,
        sh:NodeShape ;
    rdfs:label "Coffee maker"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that automatically brews coffee."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `CoffeeMaker` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `CoffeeMaker` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:Compressor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Compressor"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that mechanically increases the pressure of a gas."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Compressor` shall have at least one inlet."^^xsd:string ;
            sh:message "s223: A `Compressor` shall have at least one inlet."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ],
        [ rdfs:comment "A `Compressor` shall have at least one outlet."^^xsd:string ;
            sh:message "s223: A `Compressor` shall have at least one outlet."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ] .

s223:ComputerPrinter a s223:Class,
        sh:NodeShape ;
    rdfs:label "Computer printer"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that processes an input electrical or RF signal, typically from a `Computer`, and outputs a durable representation of information, typically text and/or graphics, typically on paper."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `ComputerPrinter` shall have at least one inlet using the medium `Electricity-Signal` or `EM-RF`."^^xsd:string ;
            sh:message "s223: A `ComputerPrinter` shall have at least one inlet using the medium `Electricity-Signal` or `EM-RF`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:or ( [ sh:class s223:Electricity-Signal ] [ sh:class s223:EM-RF ] ) ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `ComputerPrinter` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `ComputerPrinter` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ConcentrationSensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Concentration sensor"^^xsd:string ;
    rdfs:comment """A `Sensor` that `observes` a `QuantifiableObservableProperty` that represents a concentration of a miscible constituent in a medium,
in contrast to a `ParticulateSensor` that `observes` a `QuantifiableObservableProperty` that represents an amount of a particulate in a medium
(see {s223:ParticulateSensor}). The 223 standard does not constrain the `Unit` or `QuantityKind` reported by a `ConcentrationSensor`, but possible
`QuantityKind`s include `Concentration` (moles per volume), `Density` (mass per volume), `MoleFraction`, and `VolumeFraction`."""^^xsd:string ;
    rdfs:subClassOf s223:Sensor .

s223:ConceptShape a sh:NodeShape ;
    sh:rule [ a sh:SPARQLRule ;
            rdfs:comment "Add an rdfs:label if it is missing."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this rdfs:label ?newLabel .}
WHERE {
FILTER (NOT EXISTS {$this rdfs:label ?something}) .
BIND(REPLACE(STR($this), "^.*/([^/]*)$", "$1") AS ?localNameWithoutHash)
BIND(REPLACE(?localNameWithoutHash, "^.*#(.*)$", "$1") AS ?localName)
BIND(REPLACE(?localName, "-", " ", "i") AS ?newLabel)
}
"""^^xsd:string ;
            sh:name "AddLabelFromLocalName"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ] ;
    sh:targetClass s223:Concept .

s223:ConductorShape a sh:NodeShape ;
    sh:rule [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `hasElectricalPhase` value from any connected `ConnectionPoint`s."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:hasElectricalPhase ?phase .}
WHERE {
$this s223:cnx/s223:hasElectricalPhase ?phase .
}
"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ] ;
    sh:targetClass s223:Conductor .

s223:ConnectableShape a sh:NodeShape ;
    sh:rule [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `connectedFrom` relations using `connectsThrough` and `connectsFrom`."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:connectedFrom ?equipment .}
WHERE {
$this s223:hasConnectionPoint ?cp .
?cp a s223:InletConnectionPoint .
?cp s223:connectsThrough/s223:connectsFrom ?equipment .
}
"""^^xsd:string ;
            sh:name "InferredEquipmentToUpstreamEquipmentProperty"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `connected` relation using `connectedTo`"^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:connected ?thing .}
WHERE {
$this s223:connectedTo ?thing .
}
"""^^xsd:string ;
            sh:name "InferredEquipmentToEquipmentPropertyfromconnectedTo"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `connected` relation using `connectedFrom`"^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:connected ?thing .}
WHERE {
$this s223:connectedFrom ?thing .
}
"""^^xsd:string ;
            sh:name "InferredEquipmentToEquipmentPropertyfromconnectedFrom"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `connectedThrough` relation using `hasConnectionPoint` and `connectsThrough`"^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:connectedThrough ?connection .}
WHERE {
$this s223:hasConnectionPoint/s223:connectsThrough ?connection .
}
"""^^xsd:string ;
            sh:name "InferredEquipmentToConnectionProperty"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `connectedTo` relation using `connectsThrough` and `connectsTo`."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:connectedTo ?equipment .}
WHERE {
$this s223:hasConnectionPoint ?cp .
?cp a s223:OutletConnectionPoint .
?cp s223:connectsThrough/s223:connectsTo ?equipment .
}
"""^^xsd:string ;
            sh:name "InferredEquipmentToDownstreamEquipmentProperty"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `connected` relation for BiDirectional connections"^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:connected ?d2 .}
WHERE {
$this s223:connectedThrough/^s223:connectedThrough ?d2 .
FILTER ($this != ?d2) .
FILTER NOT EXISTS {$this s223:contains* ?d2} .
FILTER NOT EXISTS {?d2 s223:contains* $this} .
}
"""^^xsd:string ;
            sh:name "InferredEquipmentToDownstreamEquipmentProperty"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `cnx` relationship using `hasConnectionPoint`."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:cnx ?thing .}
WHERE {
$this s223:hasConnectionPoint ?thing .
}
"""^^xsd:string ;
            sh:name "InferredEquipmentToConnectionPointCnxProperty"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `cnx` relation using `isConnectionPointOf`."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:cnx ?thing .}
WHERE {
$this ^s223:isConnectionPointOf ?thing .
}
"""^^xsd:string ;
            sh:name "InferredEquipmentToConnectionPointCnxPropertyFromInverse"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `connected` relation for BiDirectional connections"^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:connected ?d2 .}
WHERE {
$this s223:connectedThrough/^s223:connectedThrough ?d2 .
FILTER ($this != ?d2) .
FILTER NOT EXISTS {$this s223:contains* ?d2} .
FILTER NOT EXISTS {?d2 s223:contains* $this} .
}
"""^^xsd:string ;
            sh:name "InferredEquipmentToDownstreamEquipmentProperty"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `hasConnectionPoint` relation using `cnx`"^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:hasConnectionPoint ?thing .}
WHERE {
$this s223:cnx ?thing .
}
"""^^xsd:string ;
            sh:name "InferredEquipmentToConnectionPointProperty"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ] ;
    sh:targetClass s223:Connectable .

s223:ConnectionCnxShape a sh:NodeShape ;
    rdfs:label "Connection cnx shape"^^xsd:string ;
    rdfs:comment "You need either an `InletConnectionPoint` and an `OutletConnectionPoint`, or at least one `BidirectionalConnectionPoint` and another `ConnectionPoint` of any type."^^xsd:string ;
    sh:message "s223: You need either an `InletConnectionPoint` and an `OutletConnectionPoint`, or at least one `BidirectionalConnectionPoint` and another `ConnectionPoint` of any type."^^xsd:string ;
    sh:or ( [ sh:property [ rdfs:comment "A `Connection` shall have at least two `connectsAt` relations allowing flow in and out of the `Connection`."^^xsd:string ;
                        sh:path s223:connectsAt ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ;
                        sh:qualifiedValueShapesDisjoint true ;
                        sh:severity sh:Warning ],
                    [ rdfs:comment "A `Connection` shall have at least two `connectsAt` relations allowing flow in and out of the `Connection`."^^xsd:string ;
                        sh:path s223:connectsAt ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ;
                        sh:qualifiedValueShapesDisjoint true ;
                        sh:severity sh:Warning ] ] [ sh:property [ rdfs:comment "A `Connection` shall have at least two `connectsAt` relations allowing flow in and out of the `Connection`."^^xsd:string ;
                        sh:path s223:connectsAt ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ] ;
                        sh:qualifiedValueShapesDisjoint true ;
                        sh:severity sh:Warning ] ] ) ;
    sh:severity sh:Warning ;
    sh:targetClass s223:Connection .

s223:ConnectionPointShape a sh:NodeShape ;
    sh:rule [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `hasElectricalPhase` value from any connected `Conductor`."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:hasElectricalPhase ?phase .}
WHERE {
$this s223:connectsThrough/s223:hasElectricalPhase ?phase .
}
"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ] ;
    sh:targetClass s223:ConnectionPoint .

s223:ConnectionShape a sh:NodeShape ;
    sh:rule [ a sh:SPARQLRule ;
            rdfs:comment "Infer `cnx` relation using the relation `connectsThrough`."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:cnx ?thing .}
WHERE {
$this ^s223:connectsThrough ?thing .
}
"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `connectsTo` relation using the relation `connectsAt`."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:connectsTo ?equipment .}
WHERE {
$this s223:connectsAt ?cp .
?cp a s223:InletConnectionPoint .
?cp s223:isConnectionPointOf ?equipment .
}
"""^^xsd:string ;
            sh:name "InferredConnectionToDownstreamEquipmentProperty"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer `cnx` relation using the relation `connectsAt`."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:cnx ?thing .}
WHERE {
$this s223:connectsAt ?thing .
}
"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `connectsFrom` relation using the relation `connectsAt`."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:connectsFrom ?equipment .}
WHERE {
$this s223:connectsAt ?cp .
?cp a s223:OutletConnectionPoint .
?cp s223:isConnectionPointOf ?equipment .
}
"""^^xsd:string ;
            sh:name "InferredConnectionToUpstreamEquipmentProperty"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `connectsAt` relation using the relation `cnx`."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:connectsAt ?thing .}
WHERE {
$this s223:cnx ?thing .
}
"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ] ;
    sh:targetClass s223:Connection .

s223:ContainmentLoopShape a sh:NodeShape ;
    rdfs:label "Containment loop shape"^^xsd:string ;
    rdfs:comment "`Equipment` and `PhysicalSpace`s must not contain themselves, directly or indirectly."^^xsd:string ;
    sh:message "s223: `Equipment` and `PhysicalSpace`s must not contain themselves, directly or indirectly."^^xsd:string ;
    sh:property [ rdfs:comment "`Equipment` and `PhysicalSpace`s must not contain themselves, directly or indirectly."^^xsd:string ;
            sh:path s223:hasZone ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "`Equipment` and `PhysicalSpace`s must not contain themselves, directly or indirectly."^^xsd:string ;
                    sh:message "s223: Problem with {$this}. `Equipment` and `PhysicalSpace`s must not contain themselves, directly or indirectly."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this
WHERE {
$this s223:contains+ $this .
}
"""^^xsd:string ] ] ;
    sh:targetSubjectsOf s223:contains .

s223:Controller a s223:Class,
        sh:NodeShape ;
    rdfs:label "Controller"^^xsd:string ;
    rdfs:comment "A piece of equipment for regulation of a system or component in normal operation, which executes one or more `Function`s."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Controller` shall be associated with zero or more `Function`s using the relation `executes`."^^xsd:string ;
            sh:class s223:Function ;
            sh:message "s223: A `Controller` shall be associated with zero or more `Function`s using the relation `executes`."^^xsd:string ;
            sh:path s223:executes ] .

s223:CoolingCoilShape a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "A `CoolingCoil` must always have the role `Role-Cooling`"^^xsd:string ;
            sh:object s223:Role-Cooling ;
            sh:predicate s223:hasRole ;
            sh:subject sh:this ] ;
    sh:targetClass s223:CoolingCoil .

s223:CoolingTower a s223:Class,
        sh:NodeShape ;
    rdfs:label "Cooling tower"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that uses atmospheric air to cool warm water, generally by direct contact via evaporation."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `CoolingTower` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `CoolingTower` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `CoolingTower` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `CoolingTower` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:CopyMachine a s223:Class,
        sh:NodeShape ;
    rdfs:label "Copy machine"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that processes an input of one or more durable representation(s) of information, typically text and/or graphics and typically on paper, and outputs one or more reproductions of the information for each input, typically on paper."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `CopyMachine` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `CopyMachine` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:CorrelatedColorTemperatureSensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Correlated color temperature sensor"^^xsd:string ;
    rdfs:comment """A `LightSensor` that `observes` a `QuantifiableObservableProperty` that represents a correlated color temperature (CCT) of a
light source, defined as the absolute temperature of a blackbody whose chromaticity most nearly resembles that of the light source."""^^xsd:string ;
    rdfs:subClassOf s223:LightSensor ;
    sh:property [ rdfs:comment "A `CorrelatedColorTemperatureSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of `CorrelatedColorTemperature`."^^xsd:string ;
            sh:message "s223: A `CorrelatedColorTemperatureSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of `CorrelatedColorTemperature`."^^xsd:string ;
            sh:path s223:observes ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Property ;
                    sh:node [ sh:property [ sh:in ( quantitykind:CorrelatedColorTemperature ) ;
                                    sh:path qudt:hasQuantityKind ] ] ] ] .

s223:Dishwasher a s223:Class,
        sh:NodeShape ;
    rdfs:label "Dishwasher"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that automatically cleans dishware, cookware, and cutlery."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Dishwasher` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Dishwasher` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `Dishwasher` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Dishwasher` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `Dishwasher` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `Dishwasher` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:DomainSpaceShape a sh:NodeShape ;
    sh:rule [ a sh:SPARQLRule ;
            rdfs:comment "Infer a `hasDomain` relation by checking any enclosing `Zone` to determine the domain."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:hasDomain ?domain .}
WHERE {
$this ^s223:hasDomainSpace/s223:hasDomain ?domain .
}
"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ] ;
    sh:targetClass s223:DomainSpace .

s223:Door a s223:Class,
        sh:NodeShape ;
    rdfs:label "Door"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` consisting of hinged, sliding, or revolving barrier at the entrance to a building or room."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Door` shall have at least two bidirectional connection points using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `Door` shall have at least two bidirectional connection points using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:Drain a s223:Class,
        sh:NodeShape ;
    rdfs:label "Drain"^^xsd:string ;
    rdfs:comment "A `Valve` that allows, regulates, or stops the flow of water from a `Sink`, `Shower`, `Bathtub`, or other plumbing service equipment into a plumbing drainage system that typically carries the mixture to a sewer system or septic tank."^^xsd:string ;
    rdfs:subClassOf s223:Valve ;
    sh:property [ rdfs:comment "A `Drain` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Drain` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `Drain` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Drain` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:DualDuctTerminal a s223:Class,
        sh:NodeShape ;
    rdfs:label "Dual duct terminal"^^xsd:string ;
    rdfs:comment "A `TerminalUnit` that mixes two independent sources of primary air."^^xsd:string ;
    rdfs:subClassOf s223:TerminalUnit ;
    sh:property [ rdfs:comment "A `DualDuctTerminal` shall have at least two inlets using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `DualDuctTerminal` shall have at least two inlets using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:Duct a s223:Class,
        sh:NodeShape ;
    rdfs:label "Duct"^^xsd:string ;
    rdfs:comment "A `Connection` that is used to transport air such as supply, return, and exhaust in HVAC (Heating, Ventilation, and Air Conditioning) systems."^^xsd:string ;
    rdfs:subClassOf s223:Connection .

s223:DuvSensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Duv sensor"^^xsd:string ;
    rdfs:comment """A `LightSensor` that `observes` a `QuantifiableObservableProperty` that represents a Duv of a light source, defined as the
distance between the chromaticity of the light source and a blackbody radiator of equal correlated color temperature (CCT)."""^^xsd:string ;
    rdfs:subClassOf s223:LightSensor ;
    sh:property [ rdfs:comment "A `DuvSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of `Duv`."^^xsd:string ;
            sh:message "s223: A `DuvSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of `Duv`."^^xsd:string ;
            sh:path s223:observes ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Property ;
                    sh:node [ sh:property [ sh:in ( quantitykind:Duv ) ;
                                    sh:path qudt:hasQuantityKind ] ] ] ] .

s223:EM a s223:Class,
        sh:NodeShape ;
    rdfs:label "EM connection"^^xsd:string ;
    rdfs:comment "A type of `Connection` that represents air, a vacuum, outer space, or a similar environment used to convey electromagnetic energy i.e., `Constituent-EM`, without the use of a solid materials such as fiber optic cables or other such `Waveguide`s."^^xsd:string ;
    rdfs:subClassOf s223:Connection ;
    sh:property [ rdfs:comment "An `EM` shall be associated with exactly one `Constituent-EM` using the relation `hasMedium`."^^xsd:string ;
            sh:class s223:Constituent-EM ;
            sh:maxCount 1 ;
            sh:message "s223: An `EM` shall be associated with exactly one `Constituent-EM` using the relation `hasMedium`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasMedium ] .

s223:ElectricClothesDryer a s223:Class,
        sh:NodeShape ;
    rdfs:label "Electric clothes dryer"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that automatically removes moisture from a load of textiles (e.g., clothing, bedding), typically after they are washed in a `ClothesWasher`."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `ElectricClothesDryer` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `ElectricClothesDryer` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ElectricCooktop a s223:Class,
        sh:NodeShape ;
    rdfs:label "Electric cooktop"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` with a flat surface containing one or more heat sources designed for cooking with pots and pans."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `ElectricCooktop` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `ElectricCooktop` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ElectricEnergyDCDCConverter a s223:Class,
        sh:NodeShape ;
    rdfs:label "DC-DC converter"^^xsd:string ;
    rdfs:comment "An `ElectricEnergyConverter` that transforms direct current (DC) electric power from one voltage to another voltage."^^xsd:string ;
    rdfs:subClassOf s223:ElectricEnergyConverter ;
    sh:property [ rdfs:comment "An `ElectricEnergyDCDCConverter` shall have at least two connection points using the medium `Electricity-DC`."^^xsd:string ;
            sh:message "s223: An `ElectricEnergyDCDCConverter` shall have at least two connection points using the medium `Electricity-DC`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:ConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Electricity-DC ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ElectricEnergyInverter a s223:Class,
        sh:NodeShape ;
    rdfs:label "Electric energy inverter"^^xsd:string ;
    rdfs:comment "An `ElectricEnergyConverter` that tranforms direct current (DC) electric power to alternating current (AC) electric power, or vice versa."^^xsd:string ;
    rdfs:subClassOf s223:ElectricEnergyConverter ;
    sh:property [ rdfs:comment "An `ElectricEnergyInverter` shall have at least one connection point using the medium `Electricity-AC`."^^xsd:string ;
            sh:message "s223: An `ElectricEnergyInverter` shall have at least one connection point using the medium `Electricity-AC`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:ConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Electricity-AC ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "An `ElectricEnergyInverter` shall have at least one connection point using the medium `Electricity-DC`."^^xsd:string ;
            sh:message "s223: An `ElectricEnergyInverter` shall have at least one connection point using the medium `Electricity-DC`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:ConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Electricity-DC ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ElectricEnergyTransformer a s223:Class,
        sh:NodeShape ;
    rdfs:label "Electric energy transformer"^^xsd:string ;
    rdfs:comment "An `ElectricEnergyConverter` that transforms alternating current (AC) electric power from one voltage to another voltage."^^xsd:string ;
    rdfs:subClassOf s223:ElectricEnergyConverter ;
    sh:property [ rdfs:comment "An `ElectricEnergyTransformer` shall have at least two connection points using the medium `Electricity-AC`."^^xsd:string ;
            sh:message "s223: An `ElectricEnergyTransformer` shall have at least two connection points using the medium `Electricity-AC`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:ConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Electricity-AC ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ElectricWaterDispenser a s223:Class,
        sh:NodeShape ;
    rdfs:label "Electric water dispenser"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that dispenses water and optionally heats and/or cools the water prior to dispensing."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `ElectricWaterDispenser` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `ElectricWaterDispenser` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "An `ElectricWaterDispenser` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: An `ElectricWaterDispenser` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ElectricityBreaker a s223:Class,
        sh:NodeShape ;
    rdfs:label "Electricity breaker"^^xsd:string ;
    rdfs:comment "A piece of equipment that automatically opens an electric circuit automatically at a predetermined overcurrent, so as to prevent damage to the circuit, the equipment connected to the circuit, and the building containing the circuit."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `ElectricityBreaker` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `ElectricityBreaker` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "An `ElectricityBreaker` shall have at least one outlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `ElectricityBreaker` shall have at least one outlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ElectricityMeterSensorLocationShape a sh:NodeShape ;
    rdfs:comment "An `ElectricityMeter` shall contain a `VoltageSensor` and `ElectricCurrentSensor` with the same observation location."^^xsd:string ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment "An `ElectricityMeter` shall contain a `VoltageSensor` and `ElectricCurrentSensor` with the same observation location."^^xsd:string ;
            sh:message "s223: {$this} does not contain a `VoltageSensor` and `ElectricCurrentSensor` with a shared observation location."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            sh:select """
SELECT $this
WHERE {
  FILTER NOT EXISTS {
    $this s223:contains ?voltageSensor .
    $this s223:contains ?currentSensor .
    ?voltageSensor a/rdfs:subClassOf* s223:VoltageSensor ;
                   s223:hasObservationLocation ?location .
    ?currentSensor a/rdfs:subClassOf* s223:ElectricCurrentSensor ;
                   s223:hasObservationLocation ?location .
  }
}
"""^^xsd:string ] ;
    sh:targetClass s223:ElectricityMeter .

s223:ElectricityOutlet a s223:Class,
        sh:NodeShape ;
    rdfs:label "Electricity outlet"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that contains one or more receptacles for connecting electrical equipment to electrical power, typically via a plug and cord. Not to be confused with an `OutletConnectionPoint` with the medium `Constituent-Electricity`."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `ElectricityOutlet` shall have exactly one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `ElectricityOutlet` shall have exactly one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMaxCount 1 ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "An `ElectricityOutlet` shall have at least one outlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `ElectricityOutlet` shall have at least one outlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:Elevator a s223:Class,
        sh:NodeShape ;
    rdfs:label "Elevator"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that vertically transports people or freight between floors or levels of a building via a vertical shaft commonly referred to as a hoistway. The people or freight are typically situated on a platform, or in a container commonly referred to as a car, cab, cabin, cage, or carriage."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `Elevator` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `Elevator` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:EquipmentShape a sh:NodeShape ;
    sh:rule [ a sh:SPARQLRule ;
            rdfs:comment "For equipment contained within another piece of equipment use the `mapsTo` relation to infer a Medium from the containing equipment."^^xsd:string ;
            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} .
}
"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "For equipment containing another piece of equipment, use the `mapsTo` relation to infer a Medium from the contained equipment."^^xsd:string ;
            sh:construct """
CONSTRUCT {
    ?parentCp s223:hasMedium ?medium .
}
WHERE {
  $this s223:hasConnectionPoint ?cp .
  ?cp s223:mapsTo ?parentCp .
  ?cp s223:connectsThrough ?connection .
  ?cp s223:hasMedium ?medium .
  FILTER NOT EXISTS {?parentCp s223:hasMedium ?something} .
}
"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ] ;
    sh:targetClass s223:Equipment .

s223:Escalator a s223:Class,
        sh:NodeShape ;
    rdfs:label "Escalator"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that vertically transports people between floors or levels of a building via a moving staircase."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `Escalator` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `Escalator` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:EthernetCable-Cat1 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ethernet Cable Cat1"^^xsd:string ;
    rdfs:comment "EthernetCable-Cat1"^^xsd:string ;
    rdfs:subClassOf s223:EthernetCable .

s223:EthernetCable-Cat2 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ethernet Cable Cat2"^^xsd:string ;
    rdfs:comment "EthernetCable-Cat2"^^xsd:string ;
    rdfs:subClassOf s223:EthernetCable .

s223:EthernetCable-Cat3 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ethernet Cable Cat3"^^xsd:string ;
    rdfs:comment "EthernetCable-Cat3"^^xsd:string ;
    rdfs:subClassOf s223:EthernetCable .

s223:EthernetCable-Cat4 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ethernet Cable Cat4"^^xsd:string ;
    rdfs:comment "EthernetCable-Cat4"^^xsd:string ;
    rdfs:subClassOf s223:EthernetCable .

s223:EthernetCable-Cat5 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ethernet Cable Cat5"^^xsd:string ;
    rdfs:comment "EthernetCable-Cat5"^^xsd:string ;
    rdfs:subClassOf s223:EthernetCable .

s223:EthernetCable-Cat5e a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ethernet Cable Cat5e"^^xsd:string ;
    rdfs:comment "EthernetCable-Cat5e"^^xsd:string ;
    rdfs:subClassOf s223:EthernetCable .

s223:EthernetCable-Cat6 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ethernet Cable Cat6"^^xsd:string ;
    rdfs:comment "EthernetCable-Cat6"^^xsd:string ;
    rdfs:subClassOf s223:EthernetCable .

s223:EthernetCable-Cat6a a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ethernet Cable Cat6a"^^xsd:string ;
    rdfs:comment "EthernetCable-Cat6a"^^xsd:string ;
    rdfs:subClassOf s223:EthernetCable .

s223:EthernetCable-Cat7 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ethernet Cable Cat7"^^xsd:string ;
    rdfs:comment "EthernetCable-Cat7"^^xsd:string ;
    rdfs:subClassOf s223:EthernetCable .

s223:EthernetCable-Cat7a a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ethernet Cable Cat7a"^^xsd:string ;
    rdfs:comment "EthernetCable-Cat7a"^^xsd:string ;
    rdfs:subClassOf s223:EthernetCable .

s223:EthernetCable-Cat8 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ethernet Cable Cat8"^^xsd:string ;
    rdfs:comment "EthernetCable-Cat8"^^xsd:string ;
    rdfs:subClassOf s223:EthernetCable .

s223:EthernetPort a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ethernet port"^^xsd:string ;
    rdfs:comment """A piece of `Equipment` that connects a single instance of electrical equipment, such as `Computer`s and Wi-Fi access points,
to an Ethernet network so it can communicate with other equipment and, optionally, with the Internet."""^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `EthernetPort` shall have at least one inlet using the medium `Electricity-DC`."^^xsd:string ;
            sh:message "s223: An `EthernetPort` shall have at least one inlet using the medium `Electricity-DC`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Electricity-DC ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "An `EthernetPort` shall have at least two bidirectional connection points using the medium `Signal-WiredEthernet` or `Signal-FiberEthernet`."^^xsd:string ;
            sh:message "s223: An `EthernetPort` shall have at least two bidirectional connection points using the medium `Signal-WiredEthernet` or `Signal-FiberEthernet`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ;
                    sh:node [ sh:property [ sh:or ( [ sh:class s223:Signal-WiredEthernet ] [ sh:class s223:Signal-FiberEthernet ] ) ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:EthernetSwitch a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ethernet switch"^^xsd:string ;
    rdfs:comment """A piece of `Equipment` that connects one or more instances of electrical equipment, such as `Computer`s and Wi-Fi access points,
to an Ethernet network so they can communicate with each other and, optionally, to the Internet."""^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `EthernetSwitch` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `EthernetSwitch` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "An `EthernetSwitch` shall have at least two bidirectional connection points using the medium `Signal-WiredEthernet` or `Signal-FiberEthernet`."^^xsd:string ;
            sh:message "s223: An `EthernetSwitch` shall have at least two bidirectional connection points using the medium `Signal-WiredEthernet` or `Signal-FiberEthernet`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ;
                    sh:node [ sh:property [ sh:or ( [ sh:class s223:Signal-WiredEthernet ] [ sh:class s223:Signal-FiberEthernet ] ) ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:FanCoilUnit a s223:Class,
        sh:NodeShape ;
    rdfs:label "Fan coil unit"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` consisting of a `Coil` and a `Fan` that regulates the temperature of one or more spaces."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `FanCoilUnit` shall at least have the role `Role-Cooling` or `Role-Heating`."^^xsd:string ;
            sh:message "s223: A `FanCoilUnit` shall at least have the role `Role-Cooling` or `Role-Heating`."^^xsd:string ;
            sh:path s223:hasRole ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:xor ( [ sh:class s223:Role-Cooling ] [ sh:class s223:Role-Heating ] ) ] ],
        [ rdfs:comment "A `FanCoilUnit` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `FanCoilUnit` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `FanCoilUnit` shall contain at least one `Fan`."^^xsd:string ;
            sh:message "s223: A `FanCoilUnit` shall contain at least one `Fan`."^^xsd:string ;
            sh:path s223:contains ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Fan ] ],
        [ rdfs:comment "A `FanCoilUnit` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `FanCoilUnit` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `FanCoilUnit` shall contain at least one `Coil`."^^xsd:string ;
            sh:message "s223: A `FanCoilUnit` shall contain at least one `Coil`."^^xsd:string ;
            sh:path s223:contains ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Coil ] ] .

s223:FanPoweredTerminal a s223:Class,
        sh:NodeShape ;
    rdfs:label "Fan-powered terminal"^^xsd:string ;
    rdfs:comment "A `TerminalUnit` that contains a fan, and optionally has supplemental heating or cooling. Airflow may pass through or be parallel to the fan."^^xsd:string ;
    rdfs:subClassOf s223:TerminalUnit ;
    sh:property [ rdfs:comment "A `FanPoweredTerminal` shall contain at least one `Fan`."^^xsd:string ;
            sh:message "s223: A `FanPoweredTerminal` shall contain at least one `Fan`."^^xsd:string ;
            sh:path s223:contains ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Fan ] ] .

s223:Faucet a s223:Class,
        sh:NodeShape ;
    rdfs:label "Faucet"^^xsd:string ;
    rdfs:comment "A `Valve` that allows, regulates, or stops the flow of hot or cold water from a plumbing supply system into a `Sink`, `Shower`, `Bathtub`, or other plumbing service equipment."^^xsd:string ;
    rdfs:subClassOf s223:Valve ;
    sh:property [ rdfs:comment "A `Faucet` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Faucet` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `Faucet` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Faucet` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:FiberEthernetOutlet a s223:Class,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet outlet"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that contains one or more receptacles for connecting electrical equipment to a fiber Ethernet communication network, typically via a fiber Ethernet cable."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `FiberEthernetOutlet` shall have at least one outlet using the medium `Signal-FiberEthernet`."^^xsd:string ;
            sh:message "s223: A `FiberEthernetOutlet` shall have at least one outlet using the medium `Signal-FiberEthernet`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Signal-FiberEthernet ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `FiberEthernetOutlet` shall have exactly one inlet using the medium `Signal-FiberEthernet`."^^xsd:string ;
            sh:message "s223: A `FiberEthernetOutlet` shall have exactly one inlet using the medium `Signal-FiberEthernet`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMaxCount 1 ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Signal-FiberEthernet ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:FiberOpticCable-OM1 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Fiber Optic Cable OM1"^^xsd:string ;
    rdfs:comment "FiberOpticCable-OM1"^^xsd:string ;
    rdfs:subClassOf s223:FiberOpticCable .

s223:FiberOpticCable-OM2 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Fiber Optic Cable OM2"^^xsd:string ;
    rdfs:comment "FiberOpticCable-OM2"^^xsd:string ;
    rdfs:subClassOf s223:FiberOpticCable .

s223:FiberOpticCable-OM3 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Fiber Optic Cable OM3"^^xsd:string ;
    rdfs:comment "FiberOpticCable-OM3"^^xsd:string ;
    rdfs:subClassOf s223:FiberOpticCable .

s223:FiberOpticCable-OM4 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Fibe Optic Cable OM4"^^xsd:string ;
    rdfs:comment "FiberOpticCable-OM4"^^xsd:string ;
    rdfs:subClassOf s223:FiberOpticCable .

s223:FiberOpticCable-OM5 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Fiber Optic Cable OM5"^^xsd:string ;
    rdfs:comment "FiberOpticCable-OM5"^^xsd:string ;
    rdfs:subClassOf s223:FiberOpticCable .

s223:FiberOpticCable-OS1 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Fiber Optic Cable OS1"^^xsd:string ;
    rdfs:comment "FiberOpticCable-OS1"^^xsd:string ;
    rdfs:subClassOf s223:FiberOpticCable .

s223:FiberOpticCable-OS2 a s223:Class,
        sh:NodeShape ;
    rdfs:label "Fiber Optic Cable OS2"^^xsd:string ;
    rdfs:comment "FiberOpticCable-OS2"^^xsd:string ;
    rdfs:subClassOf s223:FiberOpticCable .

s223:Filter a s223:Class,
        sh:NodeShape ;
    rdfs:label "Filter"^^xsd:string ;
    rdfs:comment """A piece of `Equipment` that removes contaminants from gases or liquids. See {s223:Substance-Medium} for
more details on validating compatible mediums upstream and downstream of a `Filter`."""^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "Incompatible Medium. Case 2: Associated `ConnectionPoint`s, one with a pure medium and one with a medium having constituents.."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 2: A medium with constituents and a pure medium."^^xsd:string ;
                    sh:message "s223: {$this} has an incompatible medium {?m1} with any constituent of {?m2}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?m2 ?m1
WHERE {
$this s223:cnx ?cp1, ?cp2 .
?cp1 a/rdfs:subClassOf* s223:ConnectionPoint .
?cp2 a/rdfs:subClassOf* s223:ConnectionPoint .
FILTER (?cp1 != ?cp2) .
?cp1 s223:hasMedium ?m1 .
?cp2 s223:hasMedium ?m2 .
?m2 s223:composedOf/s223:ofConstituent ?s2 .
FILTER NOT EXISTS {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {
  ?m2 s223:composedOf/s223:ofConstituent ?s12 .
  {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} .
}
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Filter` shall have at least one inlet."^^xsd:string ;
            sh:message "s223: A `Filter` shall have at least one inlet."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ],
        [ rdfs:comment "Incompatible Medium. Case 1: Associated `ConnectionPoint`s with two pure mediums."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 1: Two pure mediums."^^xsd:string ;
                    sh:message "s223: {$this} with inlet medium {?m2} is incompatible with outlet medium {?m1}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?m2 ?m1
WHERE {
$this s223:cnx ?cp1, ?cp2 .
?cp1 a/rdfs:subClassOf* s223:ConnectionPoint .
?cp2 a/rdfs:subClassOf* s223:ConnectionPoint .
FILTER (?cp1 != ?cp2) .
?cp1 s223:hasMedium ?m1 .
?cp2 s223:hasMedium ?m2 .
FILTER NOT EXISTS {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {?m2 s223:composedOf ?c2}
FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) .
FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "Incompatible Medium. Case 3: Associated `ConnectionPoint`s with mediums having constituents."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 3: Two mediums with constituents."^^xsd:string ;
                    sh:message "s223: For `Filter` {$this} there is no compatible substance between medium {?m2} and medium {?m1}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT ?this ?m2 ?m1
WHERE {
  ?this s223:cnx ?cp1, ?cp2 .
  ?cp1 a/rdfs:subClassOf* s223:ConnectionPoint .
  ?cp2 a/rdfs:subClassOf* s223:ConnectionPoint .
  FILTER (?cp1 != ?cp2) .
  ?cp1 s223:hasMedium ?m1 .
  ?cp2 s223:hasMedium ?m2 .
    ?m1 s223:composedOf/s223:ofConstituent ?s1 .
    ?m2 s223:composedOf/s223:ofConstituent ?s2 .
  FILTER NOT EXISTS {
    ?m1 s223:composedOf/s223:ofConstituent ?s11 .
    ?m2 s223:composedOf/s223:ofConstituent ?s12 .
    FILTER (?s11 = ?s12) .
  }
  FILTER NOT EXISTS {
    ?m1 s223:composedOf/s223:ofConstituent ?s21 .
    ?m2 s223:composedOf/s223:ofConstituent ?s22 .
    {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} .
  }
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Filter` shall have at least one outlet."^^xsd:string ;
            sh:message "s223: A `Filter` shall have at least one outlet."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ] .

s223:FlowSensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Flow sensor"^^xsd:string ;
    rdfs:comment "A `Sensor` that `observes` a `QuantifiableObservableProperty` that represents a measure of flow of fluid, typically with a `QuantityKind` of `VolumeFlowRate`."^^xsd:string ;
    rdfs:subClassOf s223:Sensor .

s223:FlushToilet a s223:Class,
        sh:NodeShape ;
    rdfs:label "Flush toilet"^^xsd:string ;
    rdfs:comment """A piece of `Equipment` that collects human waste (i.e., urine and/or feces, and sometimes toilet paper) in a chamber containing water,
and contains an integral manual or automatic actuator that triggers the release of an additional volume of water that flushes everything from the chamber into
a drainage system that typically carries the mixture to a sewer system or septic tank."""^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `FlushToilet` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `FlushToilet` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `FlushToilet` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `FlushToilet` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:Freezer a s223:Class,
        sh:NodeShape ;
    rdfs:label "Freezer"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that maintains an internal temperature below the freezing point of water."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Freezer` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `Freezer` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:FumeHood a s223:Class,
        sh:NodeShape ;
    rdfs:label "Fume hood"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that is typically mounted over a work area (e.g., a space, table, or shelf) and conducts unwanted gases away from the area."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `FumeHood` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `FumeHood` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `FumeHood` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `FumeHood` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:FunctionPropertyShape a sh:NodeShape ;
    rdfs:label "Function property shape"^^xsd:string ;
    rdfs:comment "A `Function` shall be associated with at least one `Property` using either the relation `hasInput` or `hasOutput`."^^xsd:string ;
    sh:message "s223: A `Function` shall be associated with at least one `Property` using either the relation `hasInput` or `hasOutput`."^^xsd:string ;
    sh:or ( [ sh:property [ rdfs:comment "A `Function` shall be associated with at least one `Property` using either the relation `hasInput` or `hasOutput`."^^xsd:string ;
                        sh:class s223:Property ;
                        sh:minCount 1 ;
                        sh:path s223:hasInput ] ] [ sh:property [ rdfs:comment "A `Function` shall be associated with at least one `Property` using either the relation `hasInput` or `hasOutput`."^^xsd:string ;
                        sh:class s223:Property ;
                        sh:minCount 1 ;
                        sh:path s223:hasOutput ] ] ) ;
    sh:severity sh:Warning ;
    sh:targetClass s223:Function .

s223:Furnace a s223:Class,
        sh:NodeShape ;
    rdfs:label "Furnace"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that converts fuel or electrical energy into heat."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Furnace` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `Furnace` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `Furnace` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `Furnace` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:GaugePressureSensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Gauge pressure sensor"^^xsd:string ;
    rdfs:comment """A `PressureSensor` that `observes` a `QuantifiableObservableProperty` that represents a measure of pressure relative to atmospheric pressure.
Such sensors are commonly used to monitor compressed gas cylinders, for example, where a gauge reading of zero signifies that the measured pressure
is equal to the atmospheric pressure, not a vacuum."""^^xsd:string ;
    rdfs:subClassOf s223:PressureSensor ;
    sh:property [ rdfs:comment "A `GaugePressureSensor` shall always observe a `QuantifiableObservableProperty` that has a value of true for `qudt:isDeltaQuantity`."^^xsd:string ;
            sh:maxCount 1 ;
            sh:message "s223: A `GaugePressureSensor` shall always observe a `QuantifiableObservableProperty` that has a value of true for `qudt:isDeltaQuantity`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path ( s223:observes qudt:isDeltaQuantity ) ;
            sh:value true ],
        [ rdfs:comment "A `GaugePressureSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of GaugePressure."^^xsd:string ;
            sh:message "s223: A `GaugePressureSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of GaugePressure."^^xsd:string ;
            sh:path ( s223:observes qudt:hasQuantityKind ) ;
            sh:value quantitykind:GaugePressure ] .

s223:Generator a s223:Class,
        sh:NodeShape ;
    rdfs:label "Generator"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that converts non-electric energy into electric energy."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Generator` shall have at least one outlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `Generator` shall have at least one outlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:GroundToAirHeatPump a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ground-to-air heat pump"^^xsd:string ;
    rdfs:comment "A `HeatPump` that transfers thermal energy between air and the ground."^^xsd:string ;
    rdfs:subClassOf s223:HeatPump ;
    sh:property [ rdfs:comment "A `GroundToAirHeatPump` shall have at least one bidirectional connection point using the medium `Medium-ThermalContact`."^^xsd:string ;
            sh:message "s223: A `GroundToAirHeatPump` shall have at least one bidirectional connection point using the medium `Medium-ThermalContact`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Medium-ThermalContact ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `GroundToAirHeatPump` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `GroundToAirHeatPump` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `GroundToAirHeatPump` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `GroundToAirHeatPump` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:HeatTransferRoleShape a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "Infer the `hasRole` s223:Role-HeatTransfer relation for every instance of the listed targetClass values."^^xsd:string ;
            sh:object s223:Role-HeatTransfer ;
            sh:predicate s223:hasRole ;
            sh:subject sh:this ] ;
    sh:targetClass s223:AirHeatExchanger,
        s223:ChilledBeam,
        s223:Coil,
        s223:ElectricResistanceElement,
        s223:HydronicHeatExchanger,
        s223:RadiantHeater,
        s223:Radiator .

s223:HeatingCoilShape a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "Heating coils must always have the role `Role-Heating`"^^xsd:string ;
            sh:object s223:Role-Heating ;
            sh:predicate s223:hasRole ;
            sh:subject sh:this ] ;
    sh:targetClass s223:HeatingCoil .

s223:Humidifier a s223:Class,
        sh:NodeShape ;
    rdfs:label "Humidifier"^^xsd:string ;
    rdfs:comment "A piece of equipment that adds moisture to a gas (e.g., air)."^^xsd:string ;
    rdfs:subClassOf s223:Equipment .

s223:Humidistat a s223:Class,
        sh:NodeShape ;
    rdfs:label "Humidistat"^^xsd:string ;
    rdfs:comment "A piece of equipment that measures the relative humidity of the air and then uses this information to automatically adjust the amount of moisture in air."^^xsd:string ;
    rdfs:subClassOf s223:Equipment .

s223:HumiditySensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Humidity sensor"^^xsd:string ;
    rdfs:comment "A `Sensor` that `observes` a `QuantifiableObservableProperty` that represents a measure of relative or absolute humidity."^^xsd:string ;
    rdfs:subClassOf s223:Sensor ;
    sh:property [ rdfs:comment "A `HumiditySensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of either `RelativeHumidity` or `AbsoluteHumidity`."^^xsd:string ;
            sh:class s223:QuantifiableObservableProperty ;
            sh:message "s223: A `HumiditySensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of either `RelativeHumidity` or `AbsoluteHumidity`."^^xsd:string ;
            sh:node [ sh:property [ sh:in ( quantitykind:RelativeHumidity quantitykind:AbsoluteHumidity ) ;
                            sh:path qudt:hasQuantityKind ] ] ;
            sh:path s223:observes ] .

s223:IceMaker a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ice maker"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that makes ice."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `IceMaker` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: An `IceMaker` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "An `IceMaker` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `IceMaker` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:IlluminanceSensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Illuminance sensor"^^xsd:string ;
    rdfs:comment """A `LightSensor` that `observes` a `QuantifiableObservableProperty` that represents an illuminance, defined as the areal density of the
luminous flux incident at a point on a surface."""^^xsd:string ;
    rdfs:subClassOf s223:LightSensor ;
    sh:property [ rdfs:comment "An `IlluminanceSensor` shall observe a `QuantifiableObservableProperty` that has a `QuantityKind` of `Illuminance`."^^xsd:string ;
            sh:message "s223: An `IlluminanceSensor` shall observe a `QuantifiableObservableProperty` that has a `QuantityKind` of `Illuminance`."^^xsd:string ;
            sh:path s223:observes ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Property ;
                    sh:node [ sh:property [ sh:in ( quantitykind:Illuminance ) ;
                                    sh:path qudt:hasQuantityKind ] ] ] ] .

s223:JunctionCPShape a sh:NodeShape ;
    rdfs:label "Junction CP shape"^^xsd:string ;
    rdfs:comment "A `Junction` shall have at least two `ConnectionPoint`s including (a) at least one inlet and one outlet, or (b) at least one bidirectional connection point."^^xsd:string ;
    sh:message "s223: A `Junction` shall have at least two `ConnectionPoint`s including (a) at least one inlet and one outlet, or (b) at least one bidirectional connection point."^^xsd:string ;
    sh:or ( [ sh:property [ rdfs:comment "A `Junction` shall have at least two `ConnectionPoint`s including (a) at least one inlet and one outlet, or (b) at least one bidirectional connection point."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ;
                        sh:qualifiedValueShapesDisjoint true ],
                    [ rdfs:comment "A `Junction` shall have at least two `ConnectionPoint`s including (a) at least one inlet and one outlet, or (b) at least one bidirectional connection point."^^xsd:string ;
                        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 two `ConnectionPoint`s including (a) at least one inlet and one outlet, or (b) at least one bidirectional connection point."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ] ;
                        sh:qualifiedValueShapesDisjoint true ] ] ) ;
    sh:severity sh:Warning ;
    sh:targetClass s223:Junction .

s223:JunctionUsageWarning a sh:NodeShape ;
    rdfs:label "Junction usage warning"^^xsd:string ;
    rdfs:comment "This `Junction` is not used to model significant details of a branching point in a connection, and may not be required."^^xsd:string ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment "This `Junction` is not used to model significant details of a branching point in a connection, and may not be required."^^xsd:string ;
            sh:message "s223: This `Junction` {$this} is not used to model significant details of a branching point in a connection, and may not be required."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            sh:select """
            SELECT $this
            WHERE {
                $this s223:hasConnectionPoint? | s223:connectedThrough? ?junc_cp_conn .

                FILTER NOT EXISTS {
                    # Connection has a relation that is not in the structural or required relationships
                    { ?junc_cp_conn ?p ?o . } UNION {?o ?p ?junc_cp_conn . }
                    FILTER (?p NOT IN (
                        s223:connected, s223:connectedTo, s223:connectedThrough, s223:hasConnectionPoint,
                        s223:connectsAt, s223:isConnectionPointOf, s223:cnx, rdf:type, rdfs:label, rdfs:comment
                    ))
                } .
            }
        """^^xsd:string ;
            sh:severity sh:Warning ] ;
    sh:targetClass s223:Junction .

s223:Luminaire a s223:Class,
        sh:NodeShape ;
    rdfs:label "Luminaire"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` consisting of a light source(s) and ballast(s) or driver(s) (when applicable), together with the parts designed to distribute the light, to position and protect the light source(s), and to connect the light source(s) to the power supply. Also known as a light fixture."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Luminaire` shall have at least one outlet using the medium `EM-Light`."^^xsd:string ;
            sh:message "s223: A `Luminaire` shall have at least one outlet using the medium `EM-Light`."^^xsd:string ;
            sh: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 ] ] ] ],
        [ rdfs:comment "A `Luminaire` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `Luminaire` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:MicrowaveOven a s223:Class,
        sh:NodeShape ;
    rdfs:label "Microwave oven"^^xsd:string ;
    rdfs:comment "An `ElectricOven` that cooks food by exposing it to electromagnetic radiation in the microwave frequency range."^^xsd:string ;
    rdfs:subClassOf s223:ElectricOven ;
    sh:property [ rdfs:comment "A `MicrowaveOven` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `MicrowaveOven` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:Monitor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Monitor"^^xsd:string ;
    rdfs:comment "An `ElectronicDisplay` designed primarily for the output of visual information supplied by a `Computer`."^^xsd:string ;
    rdfs:subClassOf s223:ElectronicDisplay .

s223:Motor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Motor"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that converts electrical energy into mechanical energy."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Motor` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `Motor` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:MultipleContainerShape sh:property [ rdfs:comment "An entity can be contained by at most one other entity."^^xsd:string ;
            sh:maxCount 1 ;
            sh:message "s223: An entity can be contained by at most one other entity."^^xsd:string ;
            sh:path [ sh:inversePath s223:contains ] ] ;
    sh:targetObjectsOf s223:contains .

s223:OccupantCountSensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Occupant count sensor"^^xsd:string ;
    rdfs:comment """An `OccupancySensor` that `observes` a `QuantifiableObservableProperty` that represents a population, usually of humans, within
  a sensing region."""^^xsd:string ;
    rdfs:subClassOf s223:OccupancySensor ;
    sh:property [ rdfs:comment "An `OccupantCountSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of `Population` and a `Unit` of `NUM`."^^xsd:string ;
            sh:class s223:QuantifiableObservableProperty ;
            sh:message "s223: An `OccupantCountSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of `Population` and a `Unit` of `NUM`."^^xsd:string ;
            sh:minCount 1 ;
            sh:node [ sh:property [ sh:in ( quantitykind:Population ) ;
                            sh:maxCount 1 ;
                            sh:path qudt:hasQuantityKind ],
                        [ sh:in ( 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"^^xsd:string ;
    rdfs:comment "An `OccupancySensor` that `observes` a `ObservableProperty` that represents motion within a sensing region."^^xsd:string ;
    rdfs:subClassOf s223:OccupancySensor ;
    sh:property [ rdfs:comment "An `OccupantMotionSensor` shall always observe an `EnumeratedObservableProperty` that has an `EnumerationKind` of `Occupancy-Motion`."^^xsd:string ;
            sh:class s223:EnumeratedObservableProperty ;
            sh:message "s223: An `OccupantMotionSensor` shall always observe an `EnumeratedObservableProperty` that has an `EnumerationKind` of `Occupancy-Motion`."^^xsd:string ;
            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"^^xsd:string ;
    rdfs:comment "An `OccupancySensor` that `observes` a `ObservableProperty` that represents presence within a sensing region."^^xsd:string ;
    rdfs:subClassOf s223:OccupancySensor ;
    sh:property [ rdfs:comment "An `OccupantPresenceSensor` shall always observe an `EnumeratedObservableProperty` that has an `EnumerationKind` of `Occupancy-Presence`."^^xsd:string ;
            sh:class s223:EnumeratedObservableProperty ;
            sh:message "s223: An `OccupantPresenceSensor` shall always observe an `EnumeratedObservableProperty` that has an `EnumerationKind` of `Occupancy-Presence`."^^xsd:string ;
            sh:minCount 1 ;
            sh:node [ sh:property [ sh:class s223:Occupancy-Presence ;
                            sh:maxCount 1 ;
                            sh:path s223:hasEnumerationKind ] ] ;
            sh:path s223:observes ] .

s223:OutdoorPhysicalSpace a s223:Class,
        sh:NodeShape ;
    rdfs:label "Outdoor physical space"^^xsd:string ;
    rdfs:comment "A `PhysicalSpace` that is outside of the building where, for example, outdoor ambient properties might be measured, within a suitably defined `DomainSpace`."^^xsd:string ;
    rdfs:subClassOf s223:PhysicalSpace .

s223:ParticulateSensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Particulate sensor"^^xsd:string ;
    rdfs:comment """A `Sensor` that `observes` a `QuantifiableObservableProperty` that represents an amount of a particulate in a medium, in contrast
to a `ConcentrationSensor` that `observes` a `QuantifiableObservableProperty` that represents a concentration of a miscible constituent in a medium
(see {s223:ConcentrationSensor}).

The 223 standard does not constrain the `Unit` or `QuantityKind` reported by a `ParticulateSensor`, but possible
`QuantityKind`s include `Density` (mass per volume), `ParticleNumberDensity` (count per volume), and `DimensionlessRatio` (with units such as `PPM` or
`PPB`). Some particulate sensors may claim to report a raw count of particles, for which a `QuantityKind` of `Count` could be used, but the required
context for such a measurement should be provided in the sensor's documentation to specify if it in fact measures a count per volume (e.g., `ParticleNumberDensity`),
time (e.g., `CountRate` or `ParticleCurrent`), or some
other combination. Explicitly declaring the `QuantityKind` of a sensor's output is preferable to relying on implicit assumptions."""^^xsd:string ;
    rdfs:subClassOf s223:Sensor ;
    sh:property [ rdfs:comment "A `ParticulateSensor` shall be associated with zero or more `Substance-Particulate`s using the relation `ofSubstance`."^^xsd:string ;
            sh:class s223:Substance-Particulate ;
            sh:message "s223: A `ParticulateSensor` shall be associated with zero or more `Substance-Particulate`s using the relation `ofSubstance`."^^xsd:string ;
            sh:path s223:ofSubstance ] .

s223:PersonalComputer a s223:Class,
        sh:NodeShape ;
    rdfs:label "Personal computer"^^xsd:string ;
    rdfs:comment "A `Computer` designed primarily used by a single person."^^xsd:string ;
    rdfs:subClassOf s223:Computer ;
    sh:property [ rdfs:comment "A `PersonalComputer` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `PersonalComputer` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:PhotovoltaicModule a s223:Class,
        sh:NodeShape ;
    rdfs:label "Photovoltaic module"^^xsd:string ;
    rdfs:comment "A piece of equipment that converts sunlight into electricity."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `PhotovoltaicModule` shall have at least one inlet using the medium `EM-Light`."^^xsd:string ;
            sh:message "s223: A `PhotovoltaicModule` shall have at least one inlet using the medium `EM-Light`."^^xsd:string ;
            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 `PhotovoltaicModule` shall have at least one outlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `PhotovoltaicModule` shall have at least one outlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:Pipe a s223:Class,
        sh:NodeShape ;
    rdfs:label "Pipe"^^xsd:string ;
    rdfs:comment "A `Connection` that is used primarily to transport liquids and gases such as water, sewage, natural gas, and compressed air."^^xsd:string ;
    rdfs:subClassOf s223:Connection .

s223:PowerOverEthernetPort a s223:Class,
        sh:NodeShape ;
    rdfs:label "Power over ethernet port"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that connects and is capable of powering one instance of electrical equipment, such as computers and Wi-Fi access points, as well as connect it to an Ethernet network so it can communicate with other equipment and, optionally, with the Internet."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `PowerOverEthernetPort` shall have at least one inlet using the medium `Electricity-DC`."^^xsd:string ;
            sh:message "s223: A `PowerOverEthernetPort` shall have at least one inlet using the medium `Electricity-DC`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Electricity-DC ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `PowerOverEthernetPort` shall have at least one bidirectional connection point using the medium `PowerAndSignal-PoE`."^^xsd:string ;
            sh:message "s223: A `PowerOverEthernetPort` shall have at least one bidirectional connection point using the medium `PowerAndSignal-PoE`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:PowerAndSignal-PoE ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:PowerOverEthernetSwitch a s223:Class,
        sh:NodeShape ;
    rdfs:label "Power over Ethernet (PoE) switch"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that connects and is capable of powering one or more instances of electrical equipment, such as computers and Wi-Fi access points, as well as connect the equipment to an Ethernet network so they can communicate with each other and, optionally, to the Internet."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `PowerOverEthernetSwitch` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `PowerOverEthernetSwitch` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `PowerOverEthernetSwitch` shall have at least one bidirectional connection point using the medium `PowerAndSignal-PoE`."^^xsd:string ;
            sh:message "s223: A `PowerOverEthernetSwitch` shall have at least one bidirectional connection point using the medium `PowerAndSignal-PoE`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:PowerAndSignal-PoE ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:Pump a s223:Class,
        sh:NodeShape ;
    rdfs:label "Pump"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that imparts energy to a fluid, drawing a fluid into itself through an inlet port, and forcing the fluid out through an outlet port."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "The non-electrical `ConnectionPoint`s of a `Pump` must have compatible media."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "The non-electrical `ConnectionPoint`s of a `Pump` must have compatible media."^^xsd:string ;
                    sh:message "s223: {?cpa} and {?cpb} on the `Pump` {$this} have incompatible Media {$mediuma} and {$mediumb}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    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:Constituent-Electricity}) .
  ?cpb s223:hasMedium ?mediumb .
  FILTER (NOT EXISTS {?mediumb a/rdfs:subClassOf* s223:Constituent-Electricity}) .
  FILTER (?mediuma != ?mediumb) .
  FILTER (NOT EXISTS {?mediumb a/rdfs:subClassOf* ?mediuma}) .
  FILTER (NOT EXISTS {?mediuma a/rdfs:subClassOf* ?mediumb}) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Pump` shall have at least one outlet using the medium `Fluid-Water`, `Fluid-Oil` or `Constituent-Refrigerant`."^^xsd:string ;
            sh:message "s223: A `Pump` shall have at least one outlet using the medium `Fluid-Water`, `Fluid-Oil` or `Constituent-Refrigerant`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ rdfs:comment "A `Pump` shall have at least one outlet using the medium `Fluid-Water`, `Fluid-Oil` or `Constituent-Refrigerant`."^^xsd:string ;
                            sh:message "s223: A `Pump` shall have at least one outlet using the medium `Fluid-Water`, `Fluid-Oil` or `Constituent-Refrigerant`."^^xsd:string ;
                            sh:or ( [ sh:property [ sh:class s223:Fluid-Water ;
                                                sh:path s223:hasMedium ] ] [ sh:property [ sh:class s223:Constituent-Refrigerant ;
                                                sh:path s223:hasMedium ] ] [ sh:property [ sh:class s223:Fluid-Oil ;
                                                sh:path s223:hasMedium ] ] ) ;
                            sh:severity sh:Warning ] ] ],
        [ rdfs:comment "A `Pump` shall have at least one inlet using the medium `Fluid-Water`, `Fluid-Oil` or `Constituent-Refrigerant`."^^xsd:string ;
            sh:message "s223: A `Pump` shall have at least one inlet using the medium `Fluid-Water`, `Fluid-Oil` or `Constituent-Refrigerant`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ rdfs:comment "A `Pump` shall have at least one inlet using the medium `Fluid-Water`, `Fluid-Oil` or `Constituent-Refrigerant`."^^xsd:string ;
                            sh:message "s223: A `Pump` shall have at least one inlet using the medium `Fluid-Water`, `Fluid-Oil` or `Constituent-Refrigerant`."^^xsd:string ;
                            sh:or ( [ sh:property [ sh:class s223:Fluid-Water ;
                                                sh:path s223:hasMedium ] ] [ sh:property [ sh:class s223:Constituent-Refrigerant ;
                                                sh:path s223:hasMedium ] ] [ sh:property [ sh:class s223:Fluid-Oil ;
                                                sh:path s223:hasMedium ] ] ) ;
                            sh:severity sh:Warning ] ] ] .

s223:QuantifiablePropertyShape a sh:NodeShape ;
    sh:rule [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `hasAspect s223:Aspect-Deadband` for properties referred to by `hasDeadband`"^^xsd:string ;
            sh:construct """
CONSTRUCT {?y s223:hasAspect  s223:Aspect-Deadband}
WHERE {
?prop s223:hasDeadband ?y .
FILTER NOT EXISTS {?y s223:hasAspect s223:Aspect-Deadband}
}
"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `hasAspect s223:Aspect-Threshold` for properties referred to by `hasThreshold`"^^xsd:string ;
            sh:construct """
CONSTRUCT {?y s223:hasAspect  s223:Aspect-Threshold}
WHERE {
?prop s223:hasThreshold ?y .
FILTER NOT EXISTS {?y s223:hasAspect s223:Aspect-Threshold}
}
"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `hasQuantityKind` relation if it is unambiguous."^^xsd:string ;
            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 .
}
"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `hasAspect s223:Aspect-Setpoint` for properties referred to by `hasSetpoint`"^^xsd:string ;
            sh:construct """
CONSTRUCT {?y s223:hasAspect  s223:Aspect-Setpoint}
WHERE {
?prop s223:hasSetpoint ?y .
FILTER NOT EXISTS {?y s223:hasAspect s223:Aspect-Setpoint}
}
"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ] ;
    sh:targetClass s223:QuantifiableProperty .

s223:RFOutlet a s223:Class,
        sh:NodeShape ;
    rdfs:label "Radio frequency outlet"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that contains one or more receptacles for connecting electrical equipment to a radio frequency (RF) communication network, via, for example, a coaxial cable."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `RFOutlet` shall have exactly one inlet using the medium `RF-Signal`."^^xsd:string ;
            sh:message "s223: A `RFOutlet` shall have exactly one inlet using the medium `RF-Signal`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMaxCount 1 ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:RF-Signal ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `RFOutlet` shall have at least one outlet using the medium `RF-Signal`."^^xsd:string ;
            sh:message "s223: A `RFOutlet` shall have at least one outlet using the medium `RF-Signal`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:RF-Signal ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:RadiatorInletShape a sh:NodeShape ;
    rdfs:label "Radiator inlet shape"^^xsd:string ;
    rdfs:comment "A `Radiator` shall have at least one inlet using the medium Electricity or inlet and outlet of Water."^^xsd:string ;
    sh:message "s223: A `Radiator` shall have at least one inlet using the medium Electricity or inlet and outlet of Water."^^xsd:string ;
    sh:severity sh:Warning ;
    sh:targetClass s223:Radiator ;
    sh:xone ( [ sh:property [ rdfs:comment "A `Radiator` shall have at least one inlet using the medium Electricity or inlet and outlet of Water."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                                sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "A `Radiator` shall have at least one inlet using the medium Electricity or Water."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                                sh:path s223:hasMedium ] ] ] ],
                    [ rdfs:comment "A `Radiator` shall have at least one outlet using the medium Water."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                                sh:path s223:hasMedium ] ] ] ] ] ) .

s223:Refrigerator a s223:Class,
        sh:NodeShape ;
    rdfs:label "Refrigerator"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that maintains an internal temperature below the surrounding ambient temperature but above the freezing point of water."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Refrigerator` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `Refrigerator` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:RelationWithInverseShape a sh:NodeShape ;
    sh:rule [ a sh:SPARQLRule ;
            rdfs:comment "Declare the inverse triples for relations that have defined inverse relations"^^xsd:string ;
            sh:construct """
CONSTRUCT {
?o ?invP $this .
}
WHERE {
  $this ?p ?o .
  ?p s223:inverseOf ?invP .
}
			"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ] ;
    sh:targetClass s223:Concept .

s223:RequiredCommentsShape1 a sh:NodeShape ;
    sh:severity sh:Info ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment "Every SPARQLConstraint must have an rdfs:comment."^^xsd:string ;
            sh:message "s223: The SPARQLConstraint for path {?path} for Class {$this} must have an rdfs:comment."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            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} .
}
"""^^xsd:string ] ;
    sh:targetClass s223:Class .

s223:RequiredCommentsShape2 a sh:NodeShape ;
    sh:severity sh:Info ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment "Every SHACL property shape must have an rdfs:comment."^^xsd:string ;
            sh:message "s223: The property shape with path {?path} for Class {$this} must have an rdfs:comment."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            sh:select """
SELECT $this ?path
WHERE {
$this sh:property ?propshape .
?propshape sh:path ?path .
FILTER NOT EXISTS {?propshape rdfs:comment ?comment} .
}
"""^^xsd:string ] ;
    sh:targetClass s223:Class .

s223:RequiredCommentsShape3 a sh:NodeShape ;
    sh:severity sh:Info ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment "Every SPARQLRule must have an rdfs:comment."^^xsd:string ;
            sh:message "s223: Every SPARQLRule for Class {$this} must have an rdfs:comment."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            sh:select """
SELECT $this
WHERE {
$this sh:rule ?rule .
?rule a sh:SPARQLRule .
FILTER NOT EXISTS {?rule rdfs:comment ?comment} .
}
"""^^xsd:string ] ;
    sh:targetClass s223:Class .

s223:RequiredCommentsShape4 a sh:NodeShape ;
    sh:severity sh:Info ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment "Every TripleRule must have an rdfs:comment."^^xsd:string ;
            sh:message "s223: The TripleRule inferring {?pred} for Class {$this} must have an rdfs:comment."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            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} .
}
"""^^xsd:string ] ;
    sh:targetClass s223:Class .

s223:RequiredCommentsShape5 a sh:NodeShape ;
    sh:severity sh:Info ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment "Every class of the 223 standard must have an rdfs:comment."^^xsd:string ;
            sh:message "s223: Class {$this} must have an rdfs:comment."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            sh:select """
SELECT $this
WHERE {
FILTER NOT EXISTS {$this rdfs:comment ?comment} .
}
"""^^xsd:string ] ;
    sh:targetClass s223:Class .

s223:RequiredConceptShape a sh:NodeShape ;
    sh:severity sh:Info ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment "Every class of the 223 standard must be a direct or indirect subclass of s223:Concept."^^xsd:string ;
            sh:message "s223: Class {$this} must be within the rdfs:subClassOf hierarchy under s223:Concept."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            sh:select """
SELECT $this
WHERE {
FILTER NOT EXISTS {$this rdfs:subClassOf* rdf:Property} .
FILTER NOT EXISTS {$this rdfs:subClassOf* s223:Concept} .
}
"""^^xsd:string ] ;
    sh:targetClass s223:Class .

s223:RequiredNodeShape a sh:NodeShape ;
    sh:severity sh:Info ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment "Every class of the 223 standard must also be an instance of sh:NodeShape."^^xsd:string ;
            sh:message "s223: Class {$this} must be declared as an instance of sh:NodeShape."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            sh:select """
SELECT $this
WHERE {
FILTER NOT EXISTS {$this a sh:NodeShape} .
}
"""^^xsd:string ] ;
    sh:targetClass s223:Class .

s223:SensorObservationLocationShape a sh:NodeShape ;
    rdfs:label "Sensor observation location shape"^^xsd:string ;
    rdfs:comment "A `Sensor` shall be associated with exactly 1 of `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasObservationLocation`."^^xsd:string ;
    sh:message "s223: A `Sensor` shall be associated with exactly 1 of `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasObservationLocation`."^^xsd:string ;
    sh:targetClass s223:Sensor ;
    sh:xone ( [ sh:property [ rdfs:comment "A `Sensor` shall be associated with exactly 1 of `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasObservationLocation`."^^xsd:string ;
                        sh:class s223:Connectable ;
                        sh:maxCount 1 ;
                        sh:minCount 1 ;
                        sh:path s223:hasObservationLocation ] ] [ sh:property [ rdfs:comment "A `Sensor` shall be associated with exactly 1 of `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasObservationLocation`."^^xsd:string ;
                        sh:class s223:Connection ;
                        sh:maxCount 1 ;
                        sh:minCount 1 ;
                        sh:path s223:hasObservationLocation ] ] [ sh:property [ rdfs:comment "A `Sensor` shall be associated with exactly 1 of `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasObservationLocation`."^^xsd:string ;
                        sh:class s223:ConnectionPoint ;
                        sh:maxCount 1 ;
                        sh:minCount 1 ;
                        sh:path s223:hasObservationLocation ] ] ) .

s223:SensorObservesShape a sh:NodeShape ;
    rdfs:label "Sensor observes shape"^^xsd:string ;
    rdfs:comment "A `Sensor` shall be associated with exactly 1 of `QuantifiableObservableProperty` or `EnumeratedObservableProperty` using the relation `observes`."^^xsd:string ;
    sh:message "s223: A `Sensor` shall be associated with exactly 1 of `QuantifiableObservableProperty` or `EnumeratedObservableProperty` using the relation `observes`."^^xsd:string ;
    sh:targetClass s223:Sensor ;
    sh:xone ( [ sh:property [ rdfs:comment "A `Sensor` shall be associated with exactly 1 of `QuantifiableObservableProperty` or `EnumeratedObservableProperty` using the relation `observes`."^^xsd:string ;
                        sh:class s223:QuantifiableObservableProperty ;
                        sh:maxCount 1 ;
                        sh:minCount 1 ;
                        sh:path s223:observes ] ] [ sh:property [ rdfs:comment "A `Sensor` shall be associated with exactly 1 of `QuantifiableObservableProperty` or `EnumeratedObservableProperty` using the relation `observes`."^^xsd:string ;
                        sh:class s223:EnumeratedObservableProperty ;
                        sh:maxCount 1 ;
                        sh:minCount 1 ;
                        sh:path s223:observes ] ] ) .

s223:SensorReferenceLocationShape a sh:NodeShape ;
    rdfs:label "Sensor reference location shape"^^xsd:string ;
    rdfs:comment "A `Sensor` can be associated with a maximum of one `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasReferenceLocation`."^^xsd:string ;
    sh:message "s223: A `Sensor` can be associated with a maximum of one `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasReferenceLocation`."^^xsd:string ;
    sh:or ( [ sh:property [ rdfs:comment "A `Sensor` can be associated with a maximum of one `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasReferenceLocation`."^^xsd:string ;
                        sh:class s223:Connectable ;
                        sh:message "s223: A `Sensor` can be associated with a maximum of one `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasReferenceLocation`."^^xsd:string ;
                        sh:path s223:hasReferenceLocation ] ] [ sh:property [ rdfs:comment "A `Sensor` can be associated with a maximum of one `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasReferenceLocation`."^^xsd:string ;
                        sh:class s223:Connection ;
                        sh:message "s223: A `Sensor` can be associated with a maximum of one `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasReferenceLocation`."^^xsd:string ;
                        sh:path s223:hasReferenceLocation ] ] [ sh:property [ rdfs:comment "A `Sensor` can be associated with a maximum of one `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasReferenceLocation`."^^xsd:string ;
                        sh:class s223:ConnectionPoint ;
                        sh:message "s223: A `Sensor` can be associated with a maximum of one `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasReferenceLocation`."^^xsd:string ;
                        sh:path s223:hasReferenceLocation ] ] ) ;
    sh:property [ rdfs:comment "A `Sensor` can be associated with a maximum of one `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasReferenceLocation`."^^xsd:string ;
            sh:maxCount 1 ;
            sh:message "s223: A `Sensor` can be associated with a maximum of one `Connectable`, `Connection`, or `ConnectionPoint` using the relation `hasReferenceLocation`."^^xsd:string ;
            sh:path s223:hasReferenceLocation ] ;
    sh:targetClass s223:Sensor .

s223:SensorShape a sh:NodeShape ;
    sh:rule [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `hasObservationLocation` relation for a `Sensor` from the `Property` that it is observing, only if that `Property` is associated with a single entity."^^xsd:string ;
            sh:construct """
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}
}
"""^^xsd:string ;
            sh:name "InferredMeasurementLocation"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ] ;
    sh:targetClass s223:Sensor .

s223:ServerComputer a s223:Class,
        sh:NodeShape ;
    rdfs:label "Server computer"^^xsd:string ;
    rdfs:comment "A `Computer` that is primarily used by multiple people, or for the execution of tasks not directly coupled to human interaction."^^xsd:string ;
    rdfs:subClassOf s223:Computer ;
    sh:property [ rdfs:comment "A `ServerComputer` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `ServerComputer` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:Shower a s223:Class,
        sh:NodeShape ;
    rdfs:label "Shower"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` for showering that receives as an input hot or cold water dispensed from one or two `Faucet`s, and is designed to hold a specific volume of water and release the held water through a `Drain`."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Shower` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Shower` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `Shower` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Shower` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:SingleDuctTerminal a s223:Class,
        sh:NodeShape ;
    rdfs:label "Single duct terminal"^^xsd:string ;
    rdfs:comment "A `TerminalUnit` unit that has one ducted air inlet and a damper for regulating the flow of air."^^xsd:string ;
    rdfs:subClassOf s223:TerminalUnit ;
    sh:property [ rdfs:comment "A `SingleDuctTerminal` shall contain at least one `Damper`."^^xsd:string ;
            sh:message "s223: A `SingleDuctTerminal` shall contain at least one `Damper`."^^xsd:string ;
            sh:path s223:contains ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Damper ] ] .

s223:Sink a s223:Class,
        sh:NodeShape ;
    rdfs:label "Sink"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` for manually washing hands, dishes, or other items that receives as an input hot or cold water dispensed from one or two `Faucet`s, and is designed to hold a specific volume of water and release the held water through a `Drain`."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Sink` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Sink` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `Sink` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `Sink` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:SolarThermalCollector a s223:Class,
        sh:NodeShape ;
    rdfs:label "Solar thermal collector"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that converts sunlight into thermal energy."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `SolarThermalCollector` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `SolarThermalCollector` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `SolarThermalCollector` shall have at least one inlet using the medium `EM-Light`."^^xsd:string ;
            sh:message "s223: A `SolarThermalCollector` shall have at least one inlet using the medium `EM-Light`."^^xsd:string ;
            sh: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 ] ] ] ] .

s223:SteamInjector a s223:Class,
        sh:NodeShape ;
    rdfs:label "Steam injector"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` for increasing the humidity of an air stream by injecting steam into the air stream."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `SteamInjector` shall have at least one inlet using the medium `Water-Steam`."^^xsd:string ;
            sh:message "s223: A `SteamInjector` shall have at least one inlet using the medium `Water-Steam`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Water-Steam ;
                                    sh:path s223:hasMedium ] ] ] ;
            sh:qualifiedValueShapesDisjoint true ],
        [ rdfs:comment "A `SteamInjector` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `SteamInjector` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ;
            sh:qualifiedValueShapesDisjoint true ],
        [ rdfs:comment "A `SteamInjector` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `SteamInjector` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ;
            sh:qualifiedValueShapesDisjoint true ] .

s223:SymmetricRelationShape a sh:NodeShape ;
    sh:rule [ a sh:SPARQLRule ;
            rdfs:comment "Declare the inverse triples for symmetric relations"^^xsd:string ;
            sh:construct """
CONSTRUCT {
?o ?p $this .
}
WHERE {
  $this ?p ?o .
  ?p a s223:SymmetricRelation .
}
			"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ] ;
    sh:targetClass s223:Concept .

s223:SystemShape a sh:NodeShape ;
    sh:rule [ a sh:SPARQLRule ;
            rdfs:comment "Infer the `hasBoundaryConnectionPoint` relation using `hasOptionalConnectionPoint`."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:hasBoundaryConnectionPoint ?thing .}
WHERE {
$this s223:hasOptionalConnectionPoint ?thing .
}
"""^^xsd:string ;
            sh:name "InferredSystemToBoundaryConnectionPointFromOptional"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ] ;
    sh:targetClass s223:System .

s223:Television a s223:Class,
        sh:NodeShape ;
    rdfs:label "Television"^^xsd:string ;
    rdfs:comment "An `ElectronicDisplay` that is designed primarily for the output of visual information supplied by a media broadcaster, and that typically has an integral tuner that is capable of selecting a single channel for display from the available input channel range."^^xsd:string ;
    rdfs:subClassOf s223:ElectronicDisplay .

s223:TemperatureSensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Temperature sensor"^^xsd:string ;
    rdfs:comment "A `Sensor` that `observes` a `QuantifiableObservableProperty` that represents a measure of temperature."^^xsd:string ;
    rdfs:subClassOf s223:Sensor ;
    sh:property [ rdfs:comment "A `TemperatureSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of `Temperature`."^^xsd:string ;
            sh:message "s223: A `TemperatureSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of `Temperature`."^^xsd:string ;
            sh:path s223:observes ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Property ;
                    sh:node [ sh:property [ sh:in ( quantitykind:Temperature ) ;
                                    sh:path qudt:hasQuantityKind ] ] ] ] .

s223:ThermalEnergyStorageUnit a s223:Class,
        sh:NodeShape ;
    rdfs:label "Thermal energy storage unit"^^xsd:string ;
    rdfs:comment "A device that stores thermal energy."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `ThermalEnergyStorageUnit` shall be associated with at least two connection points using the relation `hasConnectionPoint`."^^xsd:string ;
            sh:message "s223: A `ThermalEnergyStorageUnit` shall be associated with at least two connection points using the relation `hasConnectionPoint`."^^xsd:string ;
            sh:minCount 2 ;
            sh:path s223:hasConnectionPoint ] .

s223:Thermostat a s223:Class,
        sh:NodeShape ;
    rdfs:label "Thermostat"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that maintains temperature at a fixed or adjustable setpoint."^^xsd:string ;
    rdfs:subClassOf s223:Equipment .

s223:ThreeWayValve a s223:Class,
        sh:NodeShape ;
    rdfs:label "Three-way valve"^^xsd:string ;
    rdfs:comment "A `Valve` that can divert a fluid in one of three directions."^^xsd:string ;
    rdfs:subClassOf s223:Valve ;
    sh:property [ rdfs:comment "A `ThreeWayValve` shall be associated with at least three connection points using the relation `hasConnectionPoint`."^^xsd:string ;
            sh:message "s223: A `ThreeWayValve` shall be associated with at least three connection points using the relation `hasConnectionPoint`."^^xsd:string ;
            sh:minCount 3 ;
            sh:path s223:hasConnectionPoint ] .

s223:Turbine a s223:Class,
        sh:NodeShape ;
    rdfs:label "Turbine"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that converts mechanical energy into electric energy."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Turbine` shall have at least one outlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `Turbine` shall have at least one outlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:TwoWayValve a s223:Class,
        sh:NodeShape ;
    rdfs:label "Two-way valve"^^xsd:string ;
    rdfs:comment "A `Valve` that can divert a fluid in one of two directions."^^xsd:string ;
    rdfs:subClassOf s223:Valve ;
    sh:property [ rdfs:comment "A `TwoWayValve` shall have at least one outlet."^^xsd:string ;
            sh:message "s223: A `TwoWayValve` shall have at least one outlet."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ],
        [ rdfs:comment "A `TwoWayValve` shall have at least one inlet."^^xsd:string ;
            sh:message "s223: A `TwoWayValve` shall have at least one inlet."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ] .

s223:USBCable a s223:Class,
        sh:NodeShape ;
    rdfs:label "USB cable"^^xsd:string ;
    rdfs:comment "A type of `Conductor` that consists of 1 to 5 pairs of twisted wire and is used for `Signal-USB` communication."^^xsd:string ;
    rdfs:subClassOf s223:Conductor ;
    sh:property [ rdfs:comment "A `USBCable` shall be associated with exactly one `Signal-USB` using the relation `hasMedium`."^^xsd:string ;
            sh:class s223:Signal-USB ;
            sh:maxCount 1 ;
            sh:message "s223: A `USBCable` shall be associated with exactly one `Signal-USB` using the relation `hasMedium`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasMedium ] .

s223:USBOutlet a s223:Class,
        sh:NodeShape ;
    rdfs:label "USB outlet"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that contains one or more receptacles for connecting electrical equipment to a USB communication network, typically via a USB cable."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `USBOutlet` shall have exactly one inlet using the medium `Signal-USB`."^^xsd:string ;
            sh:message "s223: A `USBOutlet` shall have exactly one inlet using the medium `Signal-USB`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMaxCount 1 ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Signal-USB ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `USBOutlet` shall have at least one outlet using the medium `Signal-USB`."^^xsd:string ;
            sh:message "s223: A `USBOutlet` shall have at least one outlet using the medium `Signal-USB`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Signal-USB ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ValveCPShape a sh:NodeShape ;
    rdfs:label "Valve CP shape"^^xsd:string ;
    rdfs:comment "A `Valve` shall have at least one inlet and one outlet or two bidirectional connection points."^^xsd:string ;
    sh:message "s223: A `Valve` shall have at least one inlet and one outlet or two bidirectional connection points."^^xsd:string ;
    sh:or ( [ sh:property [ rdfs:comment "A `Valve` shall have at least one inlet and one outlet or two bidirectional connection points."^^xsd:string ;
                        sh:message "s223: A `Valve` shall have at least one inlet and one outlet or two bidirectional connection points."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ] ;
                        sh:qualifiedValueShapesDisjoint true ],
                    [ rdfs:comment "A `Valve` shall have at least one inlet and one outlet or two bidirectional connection points."^^xsd:string ;
                        sh:message "s223: A `Valve` shall have at least one inlet and one outlet or two bidirectional connection points."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ] ;
                        sh:qualifiedValueShapesDisjoint true ] ] [ sh:property [ rdfs:comment "A `Valve` shall have at least one inlet and one outlet or two bidirectional connection points."^^xsd:string ;
                        sh:message "s223: A `Valve` shall have at least one inlet and one outlet or two bidirectional connection points."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMinCount 2 ;
                        sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ] ;
                        sh:qualifiedValueShapesDisjoint true ] ] ) ;
    sh:severity sh:Warning ;
    sh:targetClass s223:Valve .

s223:VariableFrequencyDrive a s223:Class,
        sh:NodeShape ;
    rdfs:label "Variable frequency drive"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that varies its output frequency to vary the rotating speed and torque of a motor, given a fixed input frequency. Used with fans or pumps to vary the flow in the system as a function of a maintained pressure."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `VariableFrequencyDrive` shall have at least one outlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `VariableFrequencyDrive` shall have at least one outlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `VariableFrequencyDrive` shall be associated with zero or more pieces of `Equipment` using the relation `connectedTo`."^^xsd:string ;
            sh:class s223:Equipment ;
            sh:message "s223: A `VariableFrequencyDrive` shall be associated with zero or more pieces of `Equipment` using the relation `connectedTo`."^^xsd:string ;
            sh:path s223:connectedTo ],
        [ rdfs:comment "A `VariableFrequencyDrive` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `VariableFrequencyDrive` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ;
            sh:severity sh:Warning ] .

s223:WaterOutlet a s223:Class,
        sh:NodeShape ;
    rdfs:label "Water outlet"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that contains one or more pipe fittings for connecting plumbing equipment (e.g., `Faucet`) to a plumbing system."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `WaterOutlet` shall have exactly one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `WaterOutlet` shall have exactly one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMaxCount 1 ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `WaterOutlet` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `WaterOutlet` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:WaterToAirHeatPump a s223:Class,
        sh:NodeShape ;
    rdfs:label "Water-to-air heat pump"^^xsd:string ;
    rdfs:comment "A `HeatPump` that transfers thermal energy between air and a body of water."^^xsd:string ;
    rdfs:subClassOf s223:HeatPump ;
    sh:property [ rdfs:comment "A `WaterToAirHeatPump` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `WaterToAirHeatPump` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `WaterToAirHeatPump` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `WaterToAirHeatPump` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `WaterToAirHeatPump` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `WaterToAirHeatPump` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `WaterToAirHeatPump` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `WaterToAirHeatPump` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:WaterToWaterHeatPump a s223:Class,
        sh:NodeShape ;
    rdfs:label "Water-to-water heat pump"^^xsd:string ;
    rdfs:comment "A `HeatPump` that transfers thermal energy between two flows of water."^^xsd:string ;
    rdfs:subClassOf s223:HeatPump ;
    sh:property [ rdfs:comment "A `WaterToWaterHeatPump` shall have at least two outlets using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `WaterToWaterHeatPump` shall have at least two outlets using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `WaterToWaterHeatPump` shall have at least two inlets using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `WaterToWaterHeatPump` shall have at least two inlets using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:WindowShade a s223:Class,
        sh:NodeShape ;
    rdfs:label "Window shade"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that can be adjusted to allow, regulate, or stop the flow of light through a `Window`."^^xsd:string ;
    rdfs:subClassOf s223:Equipment .

s223:WiredEthernetOutlet a s223:Class,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet outlet"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that contains one or more receptacles for connecting electrical equipment to a wired Ethernet communication network, typically via a wired Ethernet cable."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `WiredEthernetOutlet` shall have exactly one inlet using the medium `Signal-WiredEthernet`."^^xsd:string ;
            sh:message "s223: A `WiredEthernetOutlet` shall have exactly one inlet using the medium `Signal-WiredEthernet`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMaxCount 1 ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Signal-WiredEthernet ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `WiredEthernetOutlet` shall have at least one outlet using the medium `Signal-WiredEthernet`."^^xsd:string ;
            sh:message "s223: A `WiredEthernetOutlet` shall have at least one outlet using the medium `Signal-WiredEthernet`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Signal-WiredEthernet ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ZoneLoopShape a sh:NodeShape ;
    rdfs:label "Zone loop shape"^^xsd:string ;
    rdfs:comment "A `Zone` must not contain itself, directly or indirectly."^^xsd:string ;
    sh:message "s223: A `Zone` must not contain itself, directly or indirectly."^^xsd:string ;
    sh:property [ rdfs:comment "A `Zone` must not contain itself, directly or indirectly."^^xsd:string ;
            sh:message "s223: A `Zone` must not contain itself, directly or indirectly."^^xsd:string ;
            sh:path s223:hasZone ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "A `Zone` must not contain itself, directly or indirectly."^^xsd:string ;
                    sh:message "s223: `Zone` {$this} must not contain itself (via s223:hasZone), directly or indirectly."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this
WHERE {
$this s223:hasZone+ ?nestedZone .
FILTER ($this = ?nestedZone) .
}
"""^^xsd:string ] ] ;
    sh:targetClass s223:Zone .

s223:ZoneShape a sh:NodeShape ;
    sh:rule [ a sh:SPARQLRule ;
            rdfs:comment "Infer a `hasDomain` relation by checking any enclosed `Zone` to determine the domain."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:hasDomain ?domain .}
WHERE {
$this s223:hasZone/s223:hasDomain ?domain .
}
"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ],
        [ a sh:SPARQLRule ;
            rdfs:comment "Infer a `hasDomain` relation by checking any enclosed `DomainSpace`s to determine the domain."^^xsd:string ;
            sh:construct """
CONSTRUCT {$this s223:hasDomain ?domain .}
WHERE {
$this s223:hasDomainSpace/s223:hasDomain ?domain .
}
"""^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ] ;
    sh:targetClass s223:Zone .

g36:ChilledWaterCoilAnnotation a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "If an instance of s223:CoolingCoil matches the constraints defined by g36:ChilledWaterCoil, it will be declared as an instance of that class."^^xsd:string ;
            sh:condition g36:ChilledWaterCoil ;
            sh:object g36:ChilledWaterCoil ;
            sh:predicate rdf:type ;
            sh:subject sh:this ] ;
    sh:targetClass s223:CoolingCoil .

g36:ChilledWaterValveAnnotation a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "If an instance of s223:Valve matches the constraints defined by g36:ChilledWaterValve, it will be declared as an instance of that class."^^xsd:string ;
            sh:condition g36:ChilledWaterValve,
                g36:ChilledWaterValveOrShape1 ;
            sh:object g36:ChilledWaterValve ;
            sh:predicate rdf:type ;
            sh:subject sh:this ] ;
    sh:targetClass s223:Valve .

g36:DamperAnnotation a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "If an instance of s223:Damper matches the constraints defined by g36:Damper, it will be declared as an instance of that class."^^xsd:string ;
            sh:condition g36:Damper,
                g36:DamperOrShape1 ;
            sh:object g36:Damper ;
            sh:predicate rdf:type ;
            sh:subject sh:this ] ;
    sh:targetClass s223:Damper .

g36:ElectricHeatingCoilAnnotation a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "If an instance of s223:ElectricResistanceElement matches the constraints defined by g36:ElectricHeatingCoil, it will be declared as an instance of that class."^^xsd:string ;
            sh:condition g36:ElectricHeatingCoil ;
            sh:object g36:ElectricHeatingCoil ;
            sh:predicate rdf:type ;
            sh:subject sh:this ] ;
    sh:targetClass s223:ElectricResistanceElement .

g36:FanAnnotation a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "If an instance of s223:Fan matches the constraints defined by g36:Fan, it will be declared as an instance of that class."^^xsd:string ;
            sh:condition g36:Fan ;
            sh:object g36:Fan ;
            sh:predicate rdf:type ;
            sh:subject sh:this ] ;
    sh:targetClass s223:Fan .

g36:FanWithVFDAnnotation a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "If an instance of s223:Fan matches the constraints defined by g36:FanWithVFD, it will be declared as an instance of that class."^^xsd:string ;
            sh:condition g36:FanWithVFD ;
            sh:object g36:FanWithVFD ;
            sh:predicate rdf:type ;
            sh:subject sh:this ] ;
    sh:targetClass s223:Fan .

g36:HotWaterCoilAnnotation a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "If an instance of s223:HeatingCoil matches the constraints defined by g36:HotWaterCoil, it will be declared as an instance of that class."^^xsd:string ;
            sh:condition g36:HotWaterCoil ;
            sh:object g36:HotWaterCoil ;
            sh:predicate rdf:type ;
            sh:subject sh:this ] ;
    sh:targetClass s223:HeatingCoil .

g36:HotWaterValveAnnotation a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "If an instance of s223:Valve matches the constraints defined by g36:HotWaterValve, it will be declared as an instance of that class."^^xsd:string ;
            sh:condition g36:HotWaterValve,
                g36:HotWaterValveOrShape1 ;
            sh:object g36:HotWaterValve ;
            sh:predicate rdf:type ;
            sh:subject sh:this ] ;
    sh:targetClass s223:Valve .

g36:TwoPositionDamperAnnotation a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "If an instance of s223:Damper matches the constraints defined by g36:TwoPositionDamper, it will be declared as an instance of that class."^^xsd:string ;
            sh:condition g36:TwoPositionDamper ;
            sh:object g36:TwoPositionDamper ;
            sh:predicate rdf:type ;
            sh:subject sh:this ] ;
    sh:targetClass s223:Damper .

g36:ZoneAnnotation a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "If an instance of `Zone` matches the constraints defined by g36:Zone, it will be declared as an instance of that class."^^xsd:string ;
            sh:condition g36:Zone ;
            sh:object g36:Zone ;
            sh:predicate rdf:type ;
            sh:subject sh:this ] ;
    sh:targetClass s223:Zone .

g36:ZoneGroupAnnotation a sh:NodeShape ;
    sh:rule [ a sh:TripleRule ;
            rdfs:comment "If an instance of `Zone` matches the constraints defined by g36:ZoneGroup, it will be declared as an instance of that class."^^xsd:string ;
            sh:condition g36:ZoneGroup ;
            sh:object g36:ZoneGroup ;
            sh:predicate rdf:type ;
            sh:subject sh:this ] ;
    sh:targetClass s223:Zone .

<http://data.ashrae.org/standard223/1.0/extensions/settings> rdfs:comment """This file can be used to control which extensions are to be loaded with the 223 ontology by importing the appropriate graph(s). Options include:
For validation of the schema, model, or data - http://data.ashrae.org/standard223/1.0/validation/schema (or model or data).  
For inferred relations - http://data.ashrae.org/standard223/1.0/inference/model-rules (and/or schema-rules, data-rules).
For G36 extensions - http://data.ashrae.org/standard223/1.0/extensions/g36/core (and/or vav-terminal-unit, multiple-zone-vav-air-handling-unit, etc.)."""^^xsd:string .

bacnet:device-identifier a rdf:Property ;
    rdfs:label "Device identifier"^^xsd:string ;
    rdfs:comment "The Object_Identifier property of the device object within the BACnet device.  See ASHRAE 135-2024 Clause 12.11.1."^^xsd:string .

bacnet:device-name a rdf:Property ;
    rdfs:label "Device name"^^xsd:string ;
    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-2024 Clause 12.11.2."^^xsd:string .

bacnet:object-identifier a rdf:Property ;
    rdfs:label "Object identifier"^^xsd:string ;
    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-2024 Clause 12.4.1."^^xsd:string .

bacnet:object-name a rdf:Property ;
    rdfs:label "Object name"^^xsd:string ;
    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-2024 Clause 12.4.2."^^xsd:string .

bacnet:priority-for-writing a rdf:Property ;
    rdfs:label "Priority for writing"^^xsd:string ;
    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-2024 Clause 15.9.1.1.5."""^^xsd:string .

bacnet:property-array-index a rdf:Property ;
    rdfs:label "Property array index"^^xsd:string ;
    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-2024 Clause 15.5.1.1.3 and Clause 15.7.1.1.1."""^^xsd:string .

bacnet:property-identifier a rdf:Property ;
    rdfs:label "Property identifier"^^xsd:string ;
    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-2024 Clause 12.4.1."^^xsd:string .

s223:12V-12V-Neg a s223:12V-12V-Neg,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Negative 12 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-12V ;
    s223:hasDCNegativeVoltage s223:Voltage-12V ;
    s223:hasDCZeroVoltage s223:Voltage-0V ;
    rdfs:comment "12V-Neg"^^xsd:string ;
    rdfs:subClassOf s223:DC-12V .

s223:12V-12V-Pos a s223:12V-12V-Pos,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Positive 12 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-12V ;
    s223:hasDCPositiveVoltage s223:Voltage-12V ;
    s223:hasDCZeroVoltage s223:Voltage-0V ;
    rdfs:comment "12V-Pos"^^xsd:string ;
    rdfs:subClassOf s223:DC-12V .

s223:12V-6V-Neg-6V-Pos a s223:12V-6V-Neg-6V-Pos,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Negative 6 VDC and positive 6 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-12V ;
    s223:hasDCNegativeVoltage s223:Voltage-6V ;
    s223:hasDCPositiveVoltage s223:Voltage-6V ;
    rdfs:comment "6V-Neg-6V-Pos"^^xsd:string ;
    rdfs:subClassOf s223:DC-12V .

s223:24V-12V-Neg-12V-Pos a s223:24V-12V-Neg-12V-Pos,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Negative 12 VDC and positive 12 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-24V ;
    s223:hasDCNegativeVoltage s223:Voltage-12V ;
    s223:hasDCPositiveVoltage s223:Voltage-12V ;
    rdfs:comment "12V-Neg-12V-Pos"^^xsd:string ;
    rdfs:subClassOf s223:DC-24V .

s223:24V-24V-Neg a s223:24V-24V-Neg,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Negative 24 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-24V ;
    s223:hasDCNegativeVoltage s223:Voltage-24V ;
    s223:hasDCZeroVoltage s223:Voltage-0V ;
    rdfs:comment "24V-Neg"^^xsd:string ;
    rdfs:subClassOf s223:DC-24V .

s223:24V-24V-Pos a s223:24V-24V-Pos,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Positive 24 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-24V ;
    s223:hasDCPositiveVoltage s223:Voltage-24V ;
    s223:hasDCZeroVoltage s223:Voltage-0V ;
    rdfs:comment "24V-Pos"^^xsd:string ;
    rdfs:subClassOf s223:DC-24V .

s223:380V-190V-Neg-190V-Pos a s223:380V-190V-Neg-190V-Pos,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Negative 190 VDC and positive 190 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-380V ;
    s223:hasDCNegativeVoltage s223:Voltage-190V ;
    s223:hasDCPositiveVoltage s223:Voltage-190V ;
    rdfs:comment "190V-Neg-190V-Pos"^^xsd:string ;
    rdfs:subClassOf s223:DC-380V .

s223:380V-380V-Neg a s223:380V-380V-Neg,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Negative 380 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-380V ;
    s223:hasDCNegativeVoltage s223:Voltage-380V ;
    s223:hasDCZeroVoltage s223:Voltage-0V ;
    rdfs:comment "380V-Neg"^^xsd:string ;
    rdfs:subClassOf s223:DC-380V .

s223:380V-380V-Pos a s223:380V-380V-Pos,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Positive 380 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-380V ;
    s223:hasDCPositiveVoltage s223:Voltage-380V ;
    s223:hasDCZeroVoltage s223:Voltage-0V ;
    rdfs:comment "380V-Pos"^^xsd:string ;
    rdfs:subClassOf s223:DC-380V .

s223:48V-24V-Neg-24V-Pos a s223:48V-24V-Neg-24V-Pos,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Negative 24 VDC and positive 24 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-48V ;
    s223:hasDCNegativeVoltage s223:Voltage-24V ;
    s223:hasDCPositiveVoltage s223:Voltage-24V ;
    rdfs:comment "24V-Neg-24V-Pos"^^xsd:string ;
    rdfs:subClassOf s223:DC-48V .

s223:48V-48V-Neg a s223:48V-48V-Neg,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Negative 48 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-48V ;
    s223:hasDCNegativeVoltage s223:Voltage-48V ;
    s223:hasDCZeroVoltage s223:Voltage-0V ;
    rdfs:comment "48V-Neg"^^xsd:string ;
    rdfs:subClassOf s223:DC-48V .

s223:48V-48V-Pos a s223:48V-48V-Pos,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Positive 48 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-48V ;
    s223:hasDCPositiveVoltage s223:Voltage-48V ;
    s223:hasDCZeroVoltage s223:Voltage-0V ;
    rdfs:comment "48V-Pos"^^xsd:string ;
    rdfs:subClassOf s223:DC-48V .

s223:5V-2.5V-Neg-2.5V-Pos a s223:5V-2.5V-Neg-2.5V-Pos,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Negative 2.5 VDC and positive 2.5 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-5V ;
    s223:hasDCNegativeVoltage s223:Voltage-2.5V ;
    s223:hasDCPositiveVoltage s223:Voltage-2.5V ;
    rdfs:comment "2.5V-Neg-2.5V-Pos"^^xsd:string ;
    rdfs:subClassOf s223:DC-5V .

s223:5V-5V-Neg a s223:5V-5V-Neg,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Negative 5 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-5V ;
    s223:hasDCNegativeVoltage s223:Voltage-5V ;
    s223:hasDCZeroVoltage s223:Voltage-0V ;
    rdfs:comment "5V-Neg"^^xsd:string ;
    rdfs:subClassOf s223:DC-5V .

s223:5V-5V-Pos a s223:5V-5V-Pos,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Positive 5 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-5V ;
    s223:hasDCPositiveVoltage s223:Voltage-5V ;
    s223:hasDCZeroVoltage s223:Voltage-0V ;
    rdfs:comment "5V-Pos"^^xsd:string ;
    rdfs:subClassOf s223:DC-5V .

s223:6V-3V-Neg-3V-Pos a s223:6V-3V-Neg-3V-Pos,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Negative 3 VDC and positive 3 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-6V ;
    s223:hasDCNegativeVoltage s223:Voltage-3V ;
    s223:hasDCPositiveVoltage s223:Voltage-3V ;
    rdfs:comment "3V-Neg-3V-Pos"^^xsd:string ;
    rdfs:subClassOf s223:DC-6V .

s223:6V-6V-Neg a s223:6V-6V-Neg,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Negative 6 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-6V ;
    s223:hasDCNegativeVoltage s223:Voltage-6V ;
    s223:hasDCZeroVoltage s223:Voltage-0V ;
    rdfs:comment "6V-Neg"^^xsd:string ;
    rdfs:subClassOf s223:DC-6V .

s223:6V-6V-Pos a s223:6V-6V-Pos,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Positive 6 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-6V ;
    s223:hasDCPositiveVoltage s223:Voltage-6V ;
    s223:hasDCZeroVoltage s223:Voltage-0V ;
    rdfs:comment "6V-Pos"^^xsd:string ;
    rdfs:subClassOf s223:DC-6V .

s223:AC-10000VLL-1Ph-60Hz a s223:AC-10000VLL-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-10000VLL-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-10000V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-10000VLL-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-10000VLL-3Ph-60Hz a s223:AC-10000VLL-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-10000VLL-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-10000V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-10000VLL-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-10000VLL-5770VLN-1Ph-60Hz a s223:AC-10000VLL-5770VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-10000VLL-5770VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-10000V ;
    s223:hasACLineNeutralVoltage s223:Voltage-5770V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-10000VLL-5770VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-10000VLL-5770VLN-3Ph-60Hz a s223:AC-10000VLL-5770VLN-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-10000VLL-5770VLN-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-10000V ;
    s223:hasACLineNeutralVoltage s223:Voltage-5770V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-10000VLL-5770VLN-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-110VLN-1Ph-50Hz a s223:AC-110VLN-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-110VLN-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-110V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-110VLN-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-120VLN-1Ph-60Hz a s223:AC-120VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-120VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-120V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-120VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-127VLN-1Ph-50Hz a s223:AC-127VLN-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-127VLN-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-127V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-127VLN-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-139VLN-1Ph-50Hz a s223:AC-139VLN-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-139VLN-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-139V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-139VLN-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-1730VLN-1Ph-60Hz a s223:AC-1730VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-1730VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-1730V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-1730VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-1900VLN-1Ph-60Hz a s223:AC-1900VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-1900VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-1900V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-1900VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-190VLL-110VLN-1Ph-50Hz a s223:AC-190VLL-110VLN-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-190VLL-110VLN-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-190V ;
    s223:hasACLineNeutralVoltage s223:Voltage-110V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-190VLL-110VLN-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-190VLL-110VLN-3Ph-50Hz a s223:AC-190VLL-110VLN-3Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-190VLL-110VLN-3Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-190V ;
    s223:hasACLineNeutralVoltage s223:Voltage-110V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-190VLL-110VLN-3Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-190VLL-1Ph-50Hz a s223:AC-190VLL-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-190VLL-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-190V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-190VLL-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-190VLL-3Ph-50Hz a s223:AC-190VLL-3Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-190VLL-3Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-190V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-190VLL-3Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-208VLL-120VLN-1Ph-60Hz a s223:AC-208VLL-120VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-208VLL-120VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-208V ;
    s223:hasACLineNeutralVoltage s223:Voltage-120V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-208VLL-120VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-208VLL-120VLN-3Ph-60Hz a s223:AC-208VLL-120VLN-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-208VLL-120VLN-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-208V ;
    s223:hasACLineNeutralVoltage s223:Voltage-120V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-208VLL-120VLN-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-208VLL-1Ph-60Hz a s223:AC-208VLL-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-208VLL-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-208V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-208VLL-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-208VLL-3Ph-60Hz a s223:AC-208VLL-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-208VLL-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-208V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-208VLL-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-208VLN-1Ph-60Hz a s223:AC-208VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-208VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-208V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-208VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-219VLN-1Ph-60Hz a s223:AC-219VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-219VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-219V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-219VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-220VLL-127VLN-1Ph-50Hz a s223:AC-220VLL-127VLN-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-220VLL-127VLN-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-220V ;
    s223:hasACLineNeutralVoltage s223:Voltage-127V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-220VLL-127VLN-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-220VLL-127VLN-3Ph-50Hz a s223:AC-220VLL-127VLN-3Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-220VLL-127VLN-3Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-220V ;
    s223:hasACLineNeutralVoltage s223:Voltage-127V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-220VLL-127VLN-3Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-220VLL-1Ph-50Hz a s223:AC-220VLL-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-220VLL-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-220V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-220VLL-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-220VLL-3Ph-50Hz a s223:AC-220VLL-3Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-220VLL-3Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-220V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-220VLL-3Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-230VLN-1Ph-50Hz a s223:AC-230VLN-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-230VLN-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-230V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-230VLN-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-2400VLN-1Ph-60Hz a s223:AC-2400VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-2400VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-2400V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-2400VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-240VLL-120VLN-1Ph-60Hz a s223:AC-240VLL-120VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-240VLL-120VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-240V ;
    s223:hasACLineNeutralVoltage s223:Voltage-120V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-240VLL-120VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-240VLL-139VLN-1Ph-50Hz a s223:AC-240VLL-139VLN-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-240VLL-139VLN-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-240V ;
    s223:hasACLineNeutralVoltage s223:Voltage-139V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-240VLL-139VLN-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-240VLL-139VLN-3Ph-50Hz a s223:AC-240VLL-139VLN-3Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-240VLL-139VLN-3Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-240V ;
    s223:hasACLineNeutralVoltage s223:Voltage-139V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-240VLL-139VLN-3Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-240VLL-1Ph-50Hz a s223:AC-240VLL-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-240VLL-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-240V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-240VLL-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-240VLL-1Ph-60Hz a s223:AC-240VLL-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-240VLL-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-240V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-240VLL-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-240VLL-208VLN-120VLN-1Ph-60Hz a s223:AC-240VLL-208VLN-120VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-240VLL-208VLN-120VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-240V ;
    s223:hasACLineNeutralVoltage s223:Voltage-120V,
        s223:Voltage-208V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-240VLL-208VLN-120VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-240VLL-208VLN-120VLN-3Ph-60Hz a s223:AC-240VLL-208VLN-120VLN-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-240VLL-208VLN-120VLN-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-240V ;
    s223:hasACLineNeutralVoltage s223:Voltage-120V,
        s223:Voltage-208V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-240VLL-208VLN-120VLN-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-240VLL-3Ph-50Hz a s223:AC-240VLL-3Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-240VLL-3Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-240V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-240VLL-3Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-240VLL-3Ph-60Hz a s223:AC-240VLL-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-240VLL-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-240V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-240VLL-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-240VLN-1Ph-50Hz a s223:AC-240VLN-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-240VLN-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-240V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-240VLN-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-24VLN-1Ph-50Hz a s223:AC-24VLN-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-24VLN-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-24V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-24VLN-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-24VLN-1Ph-60Hz a s223:AC-24VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-24VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-24V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-24VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-277VLN-1Ph-60Hz a s223:AC-277VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-277VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-277V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-277VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-3000VLL-1730VLN-1Ph-60Hz a s223:AC-3000VLL-1730VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-3000VLL-1730VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-3000V ;
    s223:hasACLineNeutralVoltage s223:Voltage-1730V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-3000VLL-1730VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-3000VLL-1730VLN-3Ph-60Hz a s223:AC-3000VLL-1730VLN-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-3000VLL-1730VLN-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-3000V ;
    s223:hasACLineNeutralVoltage s223:Voltage-1730V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-3000VLL-1730VLN-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-3000VLL-1Ph-60Hz a s223:AC-3000VLL-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-3000VLL-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-3000V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-3000VLL-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-3000VLL-3Ph-60Hz a s223:AC-3000VLL-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-3000VLL-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-3000V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-3000VLL-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-3300VLL-1900VLN-1Ph-60Hz a s223:AC-3300VLL-1900VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-3300VLL-1900VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-3300V ;
    s223:hasACLineNeutralVoltage s223:Voltage-1900V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-3300VLL-1900VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-3300VLL-1900VLN-3Ph-60Hz a s223:AC-3300VLL-1900VLN-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-3300VLL-1900VLN-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-3300V ;
    s223:hasACLineNeutralVoltage s223:Voltage-1900V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-3300VLL-1900VLN-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-3300VLL-1Ph-60Hz a s223:AC-3300VLL-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-3300VLL-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-3300V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-3300VLL-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-3300VLL-3Ph-60Hz a s223:AC-3300VLL-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-3300VLL-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-3300V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-3300VLL-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-3460VLN-1Ph-60Hz a s223:AC-3460VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-3460VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-3460V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-3460VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-347VLN-1Ph-60Hz a s223:AC-347VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-347VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-347V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-347VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-380VLL-1Ph-60Hz a s223:AC-380VLL-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-380VLL-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-380V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-380VLL-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-380VLL-219VLN-1Ph-60Hz a s223:AC-380VLL-219VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-380VLL-219VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-380V ;
    s223:hasACLineNeutralVoltage s223:Voltage-219V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-380VLL-219VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-380VLL-219VLN-3Ph-60Hz a s223:AC-380VLL-219VLN-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-380VLL-219VLN-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-380V ;
    s223:hasACLineNeutralVoltage s223:Voltage-219V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-380VLL-219VLN-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-380VLL-3Ph-60Hz a s223:AC-380VLL-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-380VLL-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-380V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-380VLL-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-3810VLN-1Ph-60Hz a s223:AC-3810VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-3810VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-3810V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-3810VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-400VLL-1Ph-50Hz a s223:AC-400VLL-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-400VLL-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-400V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-400VLL-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-400VLL-230VLN-1Ph-50Hz a s223:AC-400VLL-230VLN-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-400VLL-230VLN-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-400V ;
    s223:hasACLineNeutralVoltage s223:Voltage-230V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-400VLL-230VLN-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-400VLL-230VLN-3Ph-50Hz a s223:AC-400VLL-230VLN-3Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-400VLL-230VLN-3Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-400V ;
    s223:hasACLineNeutralVoltage s223:Voltage-230V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-400VLL-230VLN-3Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-400VLL-3Ph-50Hz a s223:AC-400VLL-3Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-400VLL-3Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-400V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-400VLL-3Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-415VLL-1Ph-50Hz a s223:AC-415VLL-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-415VLL-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-415V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-415VLL-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-415VLL-240VLN-1Ph-50Hz a s223:AC-415VLL-240VLN-1Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-415VLL-240VLN-1Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-415V ;
    s223:hasACLineNeutralVoltage s223:Voltage-240V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-415VLL-240VLN-1Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-415VLL-240VLN-3Ph-50Hz a s223:AC-415VLL-240VLN-3Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-415VLL-240VLN-3Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-415V ;
    s223:hasACLineNeutralVoltage s223:Voltage-240V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-415VLL-240VLN-3Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-415VLL-3Ph-50Hz a s223:AC-415VLL-3Ph-50Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-415VLL-3Ph-50Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-415V ;
    s223:hasFrequency s223:Frequency-50Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-415VLL-3Ph-50Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-4160VLL-1Ph-60Hz a s223:AC-4160VLL-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-4160VLL-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-4160V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-4160VLL-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-4160VLL-2400VLN-1Ph-60Hz a s223:AC-4160VLL-2400VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-4160VLL-2400VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-4160V ;
    s223:hasACLineNeutralVoltage s223:Voltage-2400V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-4160VLL-2400VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-4160VLL-2400VLN-3Ph-60Hz a s223:AC-4160VLL-2400VLN-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-4160VLL-2400VLN-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-4160V ;
    s223:hasACLineNeutralVoltage s223:Voltage-2400V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-4160VLL-2400VLN-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-4160VLL-3Ph-60Hz a s223:AC-4160VLL-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-4160VLL-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-4160V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-4160VLL-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-480VLL-1Ph-60Hz a s223:AC-480VLL-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-480VLL-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-480V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-480VLL-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-480VLL-277VLN-1Ph-60Hz a s223:AC-480VLL-277VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-480VLL-277VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-480V ;
    s223:hasACLineNeutralVoltage s223:Voltage-277V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-480VLL-277VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-480VLL-277VLN-3Ph-60Hz a s223:AC-480VLL-277VLN-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-480VLL-277VLN-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-480V ;
    s223:hasACLineNeutralVoltage s223:Voltage-277V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-480VLL-277VLN-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-480VLL-3Ph-60Hz a s223:AC-480VLL-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-480VLL-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-480V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-480VLL-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-5770VLN-1Ph-60Hz a s223:AC-5770VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-5770VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineNeutralVoltage s223:Voltage-5770V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-5770VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-6000VLL-1Ph-60Hz a s223:AC-6000VLL-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-6000VLL-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-6000V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-6000VLL-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-6000VLL-3460VLN-1Ph-60Hz a s223:AC-6000VLL-3460VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-6000VLL-3460VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-6000V ;
    s223:hasACLineNeutralVoltage s223:Voltage-3460V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-6000VLL-3460VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-6000VLL-3460VLN-3Ph-60Hz a s223:AC-6000VLL-3460VLN-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-6000VLL-3460VLN-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-6000V ;
    s223:hasACLineNeutralVoltage s223:Voltage-3460V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-6000VLL-3460VLN-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-6000VLL-3Ph-60Hz a s223:AC-6000VLL-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-6000VLL-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-6000V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-6000VLL-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-600VLL-1Ph-60Hz a s223:AC-600VLL-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-600VLL-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-600V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-600VLL-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-600VLL-347VLN-1Ph-60Hz a s223:AC-600VLL-347VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-600VLL-347VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-600V ;
    s223:hasACLineNeutralVoltage s223:Voltage-347V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-600VLL-347VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-600VLL-347VLN-3Ph-60Hz a s223:AC-600VLL-347VLN-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-600VLL-347VLN-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-600V ;
    s223:hasACLineNeutralVoltage s223:Voltage-347V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-600VLL-347VLN-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-600VLL-3Ph-60Hz a s223:AC-600VLL-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-600VLL-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-600V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-600VLL-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-6600VLL-1Ph-60Hz a s223:AC-6600VLL-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-6600VLL-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-6600V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-6600VLL-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-6600VLL-3810VLN-1Ph-60Hz a s223:AC-6600VLL-3810VLN-1Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-6600VLL-3810VLN-1Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-6600V ;
    s223:hasACLineNeutralVoltage s223:Voltage-3810V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-SinglePhase ;
    rdfs:comment "`AC-6600VLL-3810VLN-1Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-6600VLL-3810VLN-3Ph-60Hz a s223:AC-6600VLL-3810VLN-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-6600VLL-3810VLN-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-6600V ;
    s223:hasACLineNeutralVoltage s223:Voltage-3810V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-6600VLL-3810VLN-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AC-6600VLL-3Ph-60Hz a s223:AC-6600VLL-3Ph-60Hz,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "AC-6600VLL-3Ph-60Hz"^^xsd:string ;
    s223:hasACLineLineVoltage s223:Voltage-6600V ;
    s223:hasFrequency s223:Frequency-60Hz ;
    s223:hasNumberOfElectricalPhases s223:NumberOfElectricalPhases-ThreePhase ;
    rdfs:comment "`AC-6600VLL-3Ph-60Hz`"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-AC .

s223:AirHeatExchanger a s223:Class,
        sh:NodeShape ;
    rdfs:label "Air heat exchanger"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that transfers heat from one air stream to another while keeping the two media separate."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `AirHeatExchanger` shall have at least two outlets using the medium `Fluid-Air`, each paired with an inlet."^^xsd:string ;
            sh:message "s223: An `AirHeatExchanger` shall have at least two outlets using the medium `Fluid-Air`, each paired with an inlet."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:InletConnectionPoint ;
                                    sh:minCount 1 ;
                                    sh:path s223:pairedConnectionPoint ],
                                [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "An `AirHeatExchanger` shall have at least two inlets using the medium `Fluid-Air`, each paired with an outlet."^^xsd:string ;
            sh:message "s223: An `AirHeatExchanger` shall have at least two inlets using the medium `Fluid-Air`, each paired with an outlet."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ],
                                [ sh:class s223:OutletConnectionPoint ;
                                    sh:minCount 1 ;
                                    sh:path s223:pairedConnectionPoint ] ] ] ],
        [ rdfs:comment "An `AirHeatExchanger` shall have no bidirectional connection points."^^xsd:string ;
            sh:message "s223: An `AirHeatExchanger` shall have no bidirectional connection points."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMaxCount 0 ;
            sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ;
                    sh:message "s223: An `AirHeatExchanger` shall have no bidirectional connection points."^^xsd:string ] ] .

s223:Aspect-Alarm a s223:Aspect-Alarm,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Alarm"^^xsd:string ;
    rdfs:comment "The property value indicates whether an alarm condition is active or provides details about an active alarm."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-CatalogNumber a s223:Aspect-CatalogNumber,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Catalog number"^^xsd:string ;
    rdfs:comment "The property value is a number or other identifier of a product in a manufacturer’s catalog."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-Deadband a s223:Aspect-Deadband,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Deadband"^^xsd:string ;
    rdfs:comment "The property value is a range around a setpoint where no control action is taken to avoid unnecessary corrections."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-Fault a s223:Aspect-Fault,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Fault"^^xsd:string ;
    rdfs:comment "The property value is a fault indicator or code that signals a malfunction or issue with the system or equipment."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-HighLimit a s223:Aspect-HighLimit,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "High limit"^^xsd:string ;
    rdfs:comment "The property value is an upper threshold used in a control or alarm detection algorithm."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-LowLimit a s223:Aspect-LowLimit,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Low limit"^^xsd:string ;
    rdfs:comment "The property value is a lower threshold used in a control or alarm detection algorithm."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-Manufacturer a s223:Aspect-Manufacturer,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Manufacturer"^^xsd:string ;
    rdfs:comment "The property value is a name or other identifier of the product’s manufacturer."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-Maximum a s223:Aspect-Maximum,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Maximum"^^xsd:string ;
    rdfs:comment "The property value is a highest specified or observed value. (Examples: upper limit of the specified operating voltage range; maximum measured temperature.)"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-Minimum a s223:Aspect-Minimum,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Minimum"^^xsd:string ;
    rdfs:comment "The property value is a lowest specified or observed value. (Examples: lower limit of the specified operating voltage range; minimum measured temperature.)"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-Model a s223:Aspect-Model,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Model"^^xsd:string ;
    rdfs:comment "The property value is a model identifier of the product."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-Nominal a s223:Aspect-Nominal,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Nominal"^^xsd:string ;
    rdfs:comment "The property value is a value that is expected or desired under normal operating conditions, but may not reflect the actual value at all times. (Example: nominal voltage.)"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-OperatingMode a s223:Aspect-OperatingMode,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Operating mode"^^xsd:string ;
    rdfs:comment "The property value is the current intended mode of operation, such as 'Automatic', 'On', or 'Off'."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-OperatingStatus a s223:Aspect-OperatingStatus,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Operating status"^^xsd:string ;
    rdfs:comment "The property value is the current operational status of the system or equipment, such as 'Running,' 'Stopped,' or 'Maintenance Mode.'"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-Rated a s223:Aspect-Rated,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Rated"^^xsd:string ;
    rdfs:comment "The property value indicates a limit for continuous safe operation set by the manufacturer, but may not reflect the actual value at all times. (Example: rated voltage.)"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-SerialNumber a s223:Aspect-SerialNumber,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Serial number"^^xsd:string ;
    rdfs:comment "The property value is the serial number assigned by the manufacturer to the system or equipment."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-Setpoint a s223:Aspect-Setpoint,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Setpoint"^^xsd:string ;
    rdfs:comment "The property value is a target value for a control algorithm."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:Aspect-Threshold a s223:Aspect-Threshold,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Threshold"^^xsd:string ;
    rdfs:comment "The property value is a threshold used in a control algorithm."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:BACnetExternalReference a s223:Class,
        sh:NodeShape ;
    rdfs:label "BACnet external reference"^^xsd:string ;
    rdfs:comment "An `ExternalReference` that contains BACnet protocol parameter values necessary to associate a `Property` with a value."^^xsd:string ;
    rdfs:subClassOf s223:ExternalReference .

s223:Battery a s223:Class,
        sh:NodeShape ;
    rdfs:label "Battery"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that stores a defined amount of chemical energy that can be converted to electrical energy via a chemical process. This process, typically referred to as discharging, produces a specific electrical voltage and current."^^xsd:string ;
    rdfs:subClassOf s223:Equipment .

s223:Constituent-Ar a s223:Class,
        s223:Constituent-Ar,
        sh:NodeShape ;
    rdfs:label "Ar"^^xsd:string ;
    rdfs:comment "Argon"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:Constituent-CH4 a s223:Class,
        s223:Constituent-CH4,
        sh:NodeShape ;
    rdfs:label "CH4"^^xsd:string ;
    rdfs:comment "Methane"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:Constituent-CO a s223:Class,
        s223:Constituent-CO,
        sh:NodeShape ;
    rdfs:label "CO"^^xsd:string ;
    rdfs:comment "Carbon monoxide"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:Constituent-H2S a s223:Class,
        s223:Constituent-H2S,
        sh:NodeShape ;
    rdfs:label "H2S"^^xsd:string ;
    rdfs:comment "Hydrogen sulfide"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:Constituent-N2 a s223:Class,
        s223:Constituent-N2,
        sh:NodeShape ;
    rdfs:label "N2"^^xsd:string ;
    rdfs:comment "Nitrogen"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:Constituent-NH3 a s223:Class,
        s223:Constituent-NH3,
        sh:NodeShape ;
    rdfs:label "NH3"^^xsd:string ;
    rdfs:comment "Ammonia"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:Constituent-O2 a s223:Class,
        s223:Constituent-O2,
        sh:NodeShape ;
    rdfs:label "O2"^^xsd:string ;
    rdfs:comment "Oxygen"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:Constituent-O3 a s223:Class,
        s223:Constituent-O3,
        sh:NodeShape ;
    rdfs:label "O3"^^xsd:string ;
    rdfs:comment "Ozone"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:Constituent-Oil a s223:Class,
        s223:Constituent-Oil,
        sh:NodeShape ;
    rdfs:label "Oil"^^xsd:string ;
    rdfs:comment "Oil as an impurity within some `Mix-Fluid`"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:Constituent-Radon a s223:Class,
        s223:Constituent-Radon,
        sh:NodeShape ;
    rdfs:label "Radon"^^xsd:string ;
    rdfs:comment "Radon"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:Constituent-SO2 a s223:Class,
        s223:Constituent-SO2,
        sh:NodeShape ;
    rdfs:label "SO2"^^xsd:string ;
    rdfs:comment "Sulfur dioxide"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:Constituent-VolatileOrganicCompounds a s223:Class,
        s223:Constituent-VolatileOrganicCompounds,
        sh:NodeShape ;
    rdfs:label "Volatile organic compounds"^^xsd:string ;
    rdfs:comment "`Constituent-VolatileOrganicCompounds`"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:Domain-ConveyanceSystems a s223:Class,
        s223:Domain-ConveyanceSystems,
        sh:NodeShape ;
    rdfs:label "Conveyance systems domain"^^xsd:string ;
    rdfs:comment "The domain that represents equipment that moves people or things within a building. Example `Domain-ConveyanceSystems` equipment include `Elevator` and `Escalator`."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Domain .

s223:Domain-Electrical a s223:Class,
        s223:Domain-Electrical,
        sh:NodeShape ;
    rdfs:label "Electrical domain"^^xsd:string ;
    rdfs:comment "The domain that represents equipment that distributes and monitors electrical power within a building. Example `Domain-Electrical` equipment include `ElectricityBreaker`, `ElectricEnergyConverter`, and `ElectricityMeter`."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Domain .

s223:Domain-FireProtection a s223:Class,
        s223:Domain-FireProtection,
        sh:NodeShape ;
    rdfs:label "Fire protection domain"^^xsd:string ;
    rdfs:comment "The domain that represents equipment that detect and mitigate the spread of fire within a building. Example `Domain-FireProtection` equipment include smoke detectors, alarms, and emergency public address systems."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Domain .

s223:Domain-Lighting a s223:Class,
        s223:Domain-Lighting,
        sh:NodeShape ;
    rdfs:label "Lighting domain"^^xsd:string ;
    rdfs:comment "The domain that represents equipment that illuminate and manage the distribution of light within or outside of a building. Example `Domain-Lighting` equipment include `Luminaire`, `LightSensor`, and `WindowShade`."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Domain .

s223:Domain-Networking a s223:Class,
        s223:Domain-Networking,
        sh:NodeShape ;
    rdfs:label "Networking domain"^^xsd:string ;
    rdfs:comment "The domain that represents equipment that distributes and manages the flow of communication signals within a building. Example `Domain-Networking` equipment include `EthernetSwitch` and `PowerOverEthernetSwitch`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Domain .

s223:Domain-Occupancy a s223:Class,
        s223:Domain-Occupancy,
        sh:NodeShape ;
    rdfs:label "Occupancy domain"^^xsd:string ;
    rdfs:comment "The domain that represents equipment that determine whether and how many people are moving or present within a building. Example `Domain-Occupancy` equipment include `OccupantMotionSensor`, `OccupantPresenceSensor` and `OccupantCountSensor`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Domain .

s223:Domain-PhysicalSecurity a s223:Class,
        s223:Domain-PhysicalSecurity,
        sh:NodeShape ;
    rdfs:label "Physical security domain"^^xsd:string ;
    rdfs:comment "The domain that represents equipment that control and monitor physical access to spaces within or outside of a building. Example `Domain-PhysicalSecurity` equipment include cameras, keycard sensors, and biometric scanners."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Domain .

s223:Domain-Plumbing a s223:Class,
        s223:Domain-Plumbing,
        sh:NodeShape ;
    rdfs:label "Plumbing domain"^^xsd:string ;
    rdfs:comment "The domain that represents equipment that distributes, holds, removes and monitors water within or outside of a building. Example `Domain-Plumbing` equipment include `Faucet`, `Sink`, and `FlushToilet`."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Domain .

s223:Domain-Refrigeration a s223:Class,
        s223:Domain-Refrigeration,
        sh:NodeShape ;
    rdfs:label "Refrigeration domain"^^xsd:string ;
    rdfs:comment "The domain that represents equipment that maintain internal temperatures below the surrounding ambient temperature with a building. Example `Domain-Refrigeration` equipment include `Refrigerator` and `Freezer`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Domain .

s223:EM-Microwave a s223:Class,
        s223:EM-Microwave,
        sh:NodeShape ;
    rdfs:label "Microwave"^^xsd:string ;
    rdfs:comment "`EM-Microwave`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-EM .

s223:ElectricCurrentSensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Electric current sensor"^^xsd:string ;
    rdfs:comment "A `Sensor` that `observes` a `QuantifiableObservableProperty` that represents a measure of electric current."^^xsd:string ;
    rdfs:subClassOf s223:Sensor ;
    sh:property [ rdfs:comment "An `ElectricCurrentSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of `ElectricCurrent`."^^xsd:string ;
            sh:message "s223: An `ElectricCurrentSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of `ElectricCurrent`."^^xsd:string ;
            sh:path ( s223:observes qudt:hasQuantityKind ) ;
            sh:value quantitykind:ElectricCurrent ] .

s223:ElectricOven a s223:Class,
        sh:NodeShape ;
    rdfs:label "Electric oven"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` with an enclosed chamber designed for baking, roasting, and other cooking methods that rely on circulating heat."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `ElectricOven` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `ElectricOven` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ElectricalPhaseIdentifier-A a s223:Class,
        s223:ElectricalPhaseIdentifier-A,
        sh:NodeShape ;
    rdfs:label "Electrical phase identifier A"^^xsd:string ;
    rdfs:comment "ElectricalPhaseIdentifier-A"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-ElectricalPhaseIdentifier .

s223:ElectricalPhaseIdentifier-AB a s223:Class,
        s223:ElectricalPhaseIdentifier-AB,
        sh:NodeShape ;
    rdfs:label "Electrical phase identifier AB"^^xsd:string ;
    rdfs:comment "ElectricalPhaseIdentifier-AB"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-ElectricalPhaseIdentifier .

s223:ElectricalPhaseIdentifier-ABC a s223:Class,
        s223:ElectricalPhaseIdentifier-ABC,
        sh:NodeShape ;
    rdfs:label "Electrical phase identifier ABC"^^xsd:string ;
    rdfs:comment "ElectricalPhaseIdentifier-ABC"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-ElectricalPhaseIdentifier .

s223:ElectricalPhaseIdentifier-B a s223:Class,
        s223:ElectricalPhaseIdentifier-B,
        sh:NodeShape ;
    rdfs:label "Electrical phase identifier B"^^xsd:string ;
    rdfs:comment "ElectricalPhaseIdentifier-B"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-ElectricalPhaseIdentifier .

s223:ElectricalPhaseIdentifier-BC a s223:Class,
        s223:ElectricalPhaseIdentifier-BC,
        sh:NodeShape ;
    rdfs:label "Electrical phase identifier BC"^^xsd:string ;
    rdfs:comment "ElectricalPhaseIdentifier-BC"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-ElectricalPhaseIdentifier .

s223:ElectricalPhaseIdentifier-C a s223:Class,
        s223:ElectricalPhaseIdentifier-C,
        sh:NodeShape ;
    rdfs:label "Electrical phase identifier C"^^xsd:string ;
    rdfs:comment "ElectricalPhaseIdentifier-C"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-ElectricalPhaseIdentifier .

s223:ElectricalPhaseIdentifier-CA a s223:Class,
        s223:ElectricalPhaseIdentifier-CA,
        sh:NodeShape ;
    rdfs:label "Electrical phase identifier CA"^^xsd:string ;
    rdfs:comment "ElectricalPhaseIdentifier-CA"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-ElectricalPhaseIdentifier .

s223:Electricity-Earth a s223:Class,
        s223:Electricity-Earth,
        sh:NodeShape ;
    rdfs:label "Earth"^^xsd:string ;
    rdfs:comment "`Electricity-Earth`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Electricity .

s223:Electricity-Neutral a s223:Class,
        s223:Electricity-Neutral,
        sh:NodeShape ;
    rdfs:label "Neutral"^^xsd:string ;
    rdfs:comment "`Electricity-Neutral`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Electricity .

s223:ElectricityMeter a s223:Class,
        sh:NodeShape ;
    rdfs:label "Electricity meter"^^xsd:string ;
    rdfs:comment """A piece of `Equipment` that contains at least one `VoltageSensor` and one `ElectricCurrentSensor`, and reports one or more
properties of electricity. Example reported properties include the following `QuantityKind`s: `Voltage`, `ElectricCurrent`, `ActiveEnergy`,
`ActivePower`, `ReactivePower`, `ApparentPower`, `PowerFactor`, and `Frequency` with unit Hertz. An `ElectricityMeter` may optionally contain a `Function` that represents the mathematical calculations of the reported properties of electricity."""^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "The medium observed by the sensors contained by an `ElectricityMeter` shall be a `Constituent-Electricity`."^^xsd:string ;
            sh:class s223:Constituent-Electricity ;
            sh:message "s223: The medium observed by the sensors contained by an `ElectricityMeter` shall be a `Constituent-Electricity`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path ( s223:contains s223:hasObservationLocation s223:hasMedium ) ],
        [ rdfs:comment "An `ElectricityMeter` shall contain at least one `VoltageSensor`."^^xsd:string ;
            sh:message "s223: An `ElectricityMeter` shall contain at least one `VoltageSensor`."^^xsd:string ;
            sh:path s223:contains ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:VoltageSensor ] ;
            sh:qualifiedValueShapesDisjoint true ],
        [ rdfs:comment "An `ElectricityMeter` shall contain at least one `ElectricCurrentSensor`."^^xsd:string ;
            sh:message "s223: An `ElectricityMeter` shall contain at least one `ElectricCurrentSensor`."^^xsd:string ;
            sh:path s223:contains ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:ElectricCurrentSensor ] ;
            sh:qualifiedValueShapesDisjoint true ],
        [ rdfs:comment "The observation location of the sensors contained by an `ElectricityMeter` shall be either a `Connection` or a `ConnectionPoint`."^^xsd:string ;
            sh:message "s223: The observation location of the sensors contained by an `ElectricityMeter` shall be either a `Connection` or a `ConnectionPoint`."^^xsd:string ;
            sh:minCount 1 ;
            sh:or ( [ sh:class s223:Connection ] [ sh:class s223:ConnectionPoint ] ) ;
            sh:path ( s223:contains s223:hasObservationLocation ) ] .

s223:FiberEthernet-1X9 a s223:Class,
        s223:FiberEthernet-1X9,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet 1X9"^^xsd:string ;
    rdfs:comment "FiberEthernet-1X9"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:FiberEthernet-300PIN a s223:Class,
        s223:FiberEthernet-300PIN,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet 300PIN"^^xsd:string ;
    rdfs:comment "FiberEthernet-300PIN"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:FiberEthernet-CFP a s223:Class,
        s223:FiberEthernet-CFP,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet CFP"^^xsd:string ;
    rdfs:comment "FiberEthernet-CFP"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:FiberEthernet-CFP2 a s223:Class,
        s223:FiberEthernet-CFP2,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet CFP2"^^xsd:string ;
    rdfs:comment "FiberEthernet-CFP2"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:FiberEthernet-CFP4 a s223:Class,
        s223:FiberEthernet-CFP4,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet CFP4"^^xsd:string ;
    rdfs:comment "FiberEthernet-CFP4"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:FiberEthernet-CPAK a s223:Class,
        s223:FiberEthernet-CPAK,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet CPAK"^^xsd:string ;
    rdfs:comment "FiberEthernet-CPAK"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:FiberEthernet-CXP a s223:Class,
        s223:FiberEthernet-CXP,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet CXP"^^xsd:string ;
    rdfs:comment "FiberEthernet-CXP"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:FiberEthernet-GBIC a s223:Class,
        s223:FiberEthernet-GBIC,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet GBIC"^^xsd:string ;
    rdfs:comment "FiberEthernet-GBIC"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:FiberEthernet-QSFP a s223:Class,
        s223:FiberEthernet-QSFP,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet QSFP"^^xsd:string ;
    rdfs:comment "FiberEthernet-QSFP"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

<http://data.ashrae.org/standard223#FiberEthernet-QSFP+> a s223:Class,
        <http://data.ashrae.org/standard223#FiberEthernet-QSFP+>,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet QSFP+"^^xsd:string ;
    rdfs:comment "FiberEthernet-QSFP+"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:FiberEthernet-QSFP28 a s223:Class,
        s223:FiberEthernet-QSFP28,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet QSFP28"^^xsd:string ;
    rdfs:comment "FiberEthernet-QSFP28"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:FiberEthernet-SFF a s223:Class,
        s223:FiberEthernet-SFF,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet SFF"^^xsd:string ;
    rdfs:comment "FiberEthernet-SFF"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:FiberEthernet-SFP a s223:Class,
        s223:FiberEthernet-SFP,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet SFP"^^xsd:string ;
    rdfs:comment "FiberEthernet-SFP"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

<http://data.ashrae.org/standard223#FiberEthernet-SFP+> a s223:Class,
        <http://data.ashrae.org/standard223#FiberEthernet-SFP+>,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet SFP+"^^xsd:string ;
    rdfs:comment "FiberEthernet-SFP+"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:FiberEthernet-X2 a s223:Class,
        s223:FiberEthernet-X2,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet X2"^^xsd:string ;
    rdfs:comment "FiberEthernet-X2"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:FiberEthernet-XENPAK a s223:Class,
        s223:FiberEthernet-XENPAK,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet XENPAK"^^xsd:string ;
    rdfs:comment "FiberEthernet-XENPAK"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:FiberEthernet-XFP a s223:Class,
        s223:FiberEthernet-XFP,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet XFP"^^xsd:string ;
    rdfs:comment "FiberEthernet-XFP"^^xsd:string ;
    rdfs:subClassOf s223:Signal-FiberEthernet .

s223:Gas-Superheated a s223:Class,
        s223:Gas-Superheated,
        sh:NodeShape ;
    rdfs:label "Superheated gas"^^xsd:string ;
    rdfs:comment "Gas-Superheated"^^xsd:string ;
    rdfs:subClassOf s223:ThermodynamicPhase-Gas .

s223:GlycolSolution-15Percent a s223:Class,
        s223:GlycolSolution-15Percent,
        sh:NodeShape ;
    rdfs:label "15 percent glycol solution"^^xsd:string ;
    s223:composedOf [ a s223:QuantifiableProperty ;
            rdfs:label "Glycol concentration"^^xsd:string ;
            s223:hasValue 15.0 ;
            s223:ofConstituent s223:Constituent-Glycol ;
            qudt:hasQuantityKind quantitykind:VolumeFraction ;
            qudt:hasUnit unit:PERCENT ],
        [ a s223:QuantifiableProperty ;
            rdfs:label "Water concentration"^^xsd:string ;
            s223:hasValue 85.0 ;
            s223:ofConstituent s223:Constituent-H2O ;
            qudt:hasQuantityKind quantitykind:VolumeFraction ;
            qudt:hasUnit unit:PERCENT ] ;
    s223:hasFreezingPoint [ a s223:QuantifiableProperty ;
            rdfs:label "Freezing point"^^xsd:string ;
            qudt:hasQuantityKind quantitykind:Temperature ] ;
    rdfs:comment "`GlycolSolution-15Percent`"^^xsd:string ;
    rdfs:subClassOf s223:Water-GlycolSolution .

s223:GlycolSolution-30Percent a s223:Class,
        s223:GlycolSolution-30Percent,
        sh:NodeShape ;
    rdfs:label "30 percent glycol solution"^^xsd:string ;
    s223:composedOf [ a s223:QuantifiableProperty ;
            rdfs:label "Glycol concentration"^^xsd:string ;
            s223:hasValue 30.0 ;
            s223:ofConstituent s223:Constituent-Glycol ;
            qudt:hasQuantityKind quantitykind:VolumeFraction ;
            qudt:hasUnit unit:PERCENT ],
        [ a s223:QuantifiableProperty ;
            rdfs:label "Water concentration"^^xsd:string ;
            s223:hasValue 70.0 ;
            s223:ofConstituent s223:Constituent-H2O ;
            qudt:hasQuantityKind quantitykind:VolumeFraction ;
            qudt:hasUnit unit:PERCENT ] ;
    s223:hasFreezingPoint [ a s223:QuantifiableProperty ;
            rdfs:label "Freezing point"^^xsd:string ;
            qudt:hasQuantityKind quantitykind:Temperature ] ;
    rdfs:comment "`GlycolSolution-30Percent`"^^xsd:string ;
    rdfs:subClassOf s223:Water-GlycolSolution .

s223:HydronicHeatExchanger a s223:Class,
        sh:NodeShape ;
    rdfs:label "Hydronic heat exchanger"^^xsd:string ;
    rdfs:comment "A piece of equipment that transfers heat from one liquid stream to another while keeping the two media separate."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `HydronicHeatExchanger` shall have at least two inlets using the medium `Mix-Fluid`, each paired with an outlet."^^xsd:string ;
            sh:message "s223: A `HydronicHeatExchanger` shall have at least two inlets using the medium `Mix-Fluid`, each paired with an outlet."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:OutletConnectionPoint ;
                                    sh:minCount 1 ;
                                    sh:path s223:pairedConnectionPoint ],
                                [ sh:class s223:Mix-Fluid ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `HydronicHeatExchanger` shall have no connection points using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `HydronicHeatExchanger` shall have no connection points using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMaxCount 0 ;
            sh:qualifiedValueShape [ sh:property [ sh:class s223:Fluid-Air ;
                            sh:path s223:hasMedium ] ] ],
        [ rdfs:comment "A `HydronicHeatExchanger` shall have no bidirectional connection points."^^xsd:string ;
            sh:message "s223: A `HydronicHeatExchanger` shall have no bidirectional connection points."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMaxCount 0 ;
            sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ] ],
        [ rdfs:comment "A `HydronicHeatExchanger` shall have at least two outlets using the medium `Mix-Fluid`, each paired with an inlet."^^xsd:string ;
            sh:message "s223: A `HydronicHeatExchanger` shall have at least two outlets using the medium `Mix-Fluid`, each paired with an inlet."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:InletConnectionPoint ;
                                    sh:minCount 1 ;
                                    sh:path s223:pairedConnectionPoint ],
                                [ sh:class s223:Mix-Fluid ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ISMBand-BluetoothLE a s223:Class,
        s223:ISMBand-BluetoothLE,
        sh:NodeShape ;
    rdfs:label "BluetoothLE"^^xsd:string ;
    rdfs:comment "The BluetoothLE radio frequency communication protocol"^^xsd:string ;
    rdfs:subClassOf s223:UHF-ISMBand .

s223:ISMBand-IEEE802.11 a s223:Class,
        s223:ISMBand-IEEE802.11,
        sh:NodeShape ;
    rdfs:label "IEEE 802.11"^^xsd:string ;
    rdfs:comment "The IEEE 802.11 radio frequency communication protocol"^^xsd:string ;
    rdfs:subClassOf s223:UHF-ISMBand .

s223:ISMBand-IEEE802.15.4 a s223:Class,
        s223:ISMBand-IEEE802.15.4,
        sh:NodeShape ;
    rdfs:label "IEEE 802.15.4"^^xsd:string ;
    rdfs:comment "The IEEE 802.15.4 radio frequency communication protocol"^^xsd:string ;
    rdfs:subClassOf s223:UHF-ISMBand .

s223:ISMBand-LoRaWAN a s223:Class,
        s223:ISMBand-LoRaWAN,
        sh:NodeShape ;
    rdfs:label "LoRaWAN"^^xsd:string ;
    rdfs:comment "The LoRaWAN radio frequency communication protocol"^^xsd:string ;
    rdfs:subClassOf s223:UHF-ISMBand .

s223:ISMBand-NFC a s223:Class,
        s223:ISMBand-NFC,
        sh:NodeShape ;
    rdfs:label "NFC"^^xsd:string ;
    rdfs:comment "NFC radio frequency communication protocols"^^xsd:string ;
    rdfs:subClassOf s223:UHF-ISMBand .

s223:ISMBand-RFID a s223:Class,
        s223:ISMBand-RFID,
        sh:NodeShape ;
    rdfs:label "RFID"^^xsd:string ;
    rdfs:comment "RFID radio frequency communication protocols"^^xsd:string ;
    rdfs:subClassOf s223:UHF-ISMBand .

s223:Light-Ultraviolet a s223:Class,
        s223:Light-Ultraviolet,
        sh:NodeShape ;
    rdfs:label "Ultraviolet light"^^xsd:string ;
    rdfs:comment "`Light-Ultraviolet`"^^xsd:string ;
    rdfs:subClassOf s223:EM-Light .

s223:Light-Visible a s223:Class,
        s223:Light-Visible,
        sh:NodeShape ;
    rdfs:label "Visible light"^^xsd:string ;
    rdfs:comment "`Light-Visible`"^^xsd:string ;
    rdfs:subClassOf s223:EM-Light .

s223:Liquid-Subcooled a s223:Class,
        s223:Liquid-Subcooled,
        sh:NodeShape ;
    rdfs:label "Subcooled liquid"^^xsd:string ;
    rdfs:comment "Liquid-Subcooled"^^xsd:string ;
    rdfs:subClassOf s223:ThermodynamicPhase-Liquid .

s223:Logical-False a s223:Class,
        s223:Logical-False,
        sh:NodeShape ;
    rdfs:label "Logical false"^^xsd:string ;
    rdfs:comment "Logical-False"^^xsd:string ;
    rdfs:subClassOf s223:Binary-Logical .

s223:Logical-True a s223:Class,
        s223:Logical-True,
        sh:NodeShape ;
    rdfs:label "Logical true"^^xsd:string ;
    rdfs:comment "Logical-True"^^xsd:string ;
    rdfs:subClassOf s223:Binary-Logical .

s223:Medium-MechanicalLinkage a s223:Class,
        s223:Medium-MechanicalLinkage,
        sh:NodeShape ;
    rdfs:label "Mechanical linkage"^^xsd:string ;
    rdfs:comment "This class supports the transfer of mechanical power at `ConnectionPoint`s or through `Connection`s."^^xsd:string ;
    rdfs:subClassOf s223:Substance-Medium .

s223:Modulated-0-10V a s223:Class,
        s223:Modulated-0-10V,
        sh:NodeShape ;
    rdfs:label "Modulated 0-10 V"^^xsd:string ;
    rdfs:comment "Modulated-0-10V"^^xsd:string ;
    rdfs:subClassOf s223:Signal-Modulated .

s223:Modulated-4-20mA a s223:Class,
        s223:Modulated-4-20mA,
        sh:NodeShape ;
    rdfs:label "Modulated 4-20 mA"^^xsd:string ;
    rdfs:comment "Modulated-4-20mA"^^xsd:string ;
    rdfs:subClassOf s223:Signal-Modulated .

s223:Modulated-Resistive a s223:Class,
        s223:Modulated-Resistive,
        sh:NodeShape ;
    rdfs:label "Modulated resistive"^^xsd:string ;
    rdfs:comment "Modulated-Resistive"^^xsd:string ;
    rdfs:subClassOf s223:Signal-Modulated .

s223:Motion-False a s223:Class,
        s223:Motion-False,
        sh:NodeShape ;
    rdfs:label "Motion-based false"^^xsd:string ;
    rdfs:comment "`Motion-False`"^^xsd:string ;
    rdfs:subClassOf s223:Occupancy-Motion .

s223:Motion-True a s223:Class,
        s223:Motion-True,
        sh:NodeShape ;
    rdfs:label "Motion-based true"^^xsd:string ;
    rdfs:comment "`Motion-True`"^^xsd:string ;
    rdfs:subClassOf s223:Occupancy-Motion .

s223:NOX-NO a s223:Class,
        s223:NOX-NO,
        sh:NodeShape ;
    rdfs:label "NO"^^xsd:string ;
    rdfs:comment "Nitric oxide (NO)"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-NOX .

s223:NOX-NO2 a s223:Class,
        s223:NOX-NO2,
        sh:NodeShape ;
    rdfs:label "NO2"^^xsd:string ;
    rdfs:comment "Nitrogen dioxide (NO2)"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-NOX .

s223:Occupied-False a s223:Class,
        s223:Occupied-False,
        sh:NodeShape ;
    rdfs:label "False"^^xsd:string ;
    rdfs:comment "`Occupied-False`"^^xsd:string ;
    rdfs:subClassOf s223:Occupancy-Occupied .

s223:Occupied-True a s223:Class,
        s223:Occupied-True,
        sh:NodeShape ;
    rdfs:label "True"^^xsd:string ;
    rdfs:comment "`Occupied-True`"^^xsd:string ;
    rdfs:subClassOf s223:Occupancy-Occupied .

s223:OnOff-Off a s223:Class,
        s223:OnOff-Off,
        sh:NodeShape ;
    rdfs:label "Off"^^xsd:string ;
    rdfs:comment "OnOff-Off"^^xsd:string ;
    rdfs:subClassOf s223:Binary-OnOff .

s223:OnOff-On a s223:Class,
        s223:OnOff-On,
        sh:NodeShape ;
    rdfs:label "On"^^xsd:string ;
    rdfs:comment "OnOff-On"^^xsd:string ;
    rdfs:subClassOf s223:Binary-OnOff .

s223:Particulate-PM1.0 a s223:Class,
        s223:Particulate-PM1.0,
        sh:NodeShape ;
    rdfs:label "PM 1.0"^^xsd:string ;
    rdfs:comment "Particulate-PM1.0"^^xsd:string ;
    rdfs:subClassOf s223:Substance-Particulate .

s223:Particulate-PM10.0 a s223:Class,
        s223:Particulate-PM10.0,
        sh:NodeShape ;
    rdfs:label "PM 10.0"^^xsd:string ;
    rdfs:comment "Particulate-PM10.0"^^xsd:string ;
    rdfs:subClassOf s223:Substance-Particulate .

s223:Particulate-PM2.5 a s223:Class,
        s223:Particulate-PM2.5,
        sh:NodeShape ;
    rdfs:label "PM 2.5"^^xsd:string ;
    rdfs:comment "Particulate-PM2.5"^^xsd:string ;
    rdfs:subClassOf s223:Substance-Particulate .

s223:Particulate-Smoke a s223:Class,
        s223:Particulate-Smoke,
        sh:NodeShape ;
    rdfs:label "Smoke"^^xsd:string ;
    rdfs:comment "Smoke as a particulate of unspecified size, but formed as a product of combustion"^^xsd:string ;
    rdfs:subClassOf s223:Substance-Particulate .

s223:PoE-802.3af-1 a s223:Class,
        s223:PoE-802.3af-1,
        sh:NodeShape ;
    rdfs:label "PoE 802.3af-1"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-PoE ;
    rdfs:comment "PoE-802.3af-1"^^xsd:string ;
    rdfs:subClassOf s223:DC-PoE .

s223:PoE-802.3at-2 a s223:Class,
        s223:PoE-802.3at-2,
        sh:NodeShape ;
    rdfs:label "PoE 802.3at-2"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-PoE ;
    rdfs:comment "PoE-802.3at-2"^^xsd:string ;
    rdfs:subClassOf s223:DC-PoE .

s223:PoE-802.3bt-3 a s223:Class,
        s223:PoE-802.3bt-3,
        sh:NodeShape ;
    rdfs:label "PoE 802.3bt-3"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-PoE ;
    rdfs:comment "PoE-802.3bt-3"^^xsd:string ;
    rdfs:subClassOf s223:DC-PoE .

s223:PoE-802.3bt-4 a s223:Class,
        s223:PoE-802.3bt-4,
        sh:NodeShape ;
    rdfs:label "PoE 802.3bt-4"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-PoE ;
    rdfs:comment "PoE-802.3bt-4"^^xsd:string ;
    rdfs:subClassOf s223:DC-PoE .

s223:Position-Closed a s223:Class,
        s223:Position-Closed,
        sh:NodeShape ;
    rdfs:label "Closed"^^xsd:string ;
    rdfs:comment "Position-Closed"^^xsd:string ;
    rdfs:subClassOf s223:Binary-Position .

s223:Position-Open a s223:Class,
        s223:Position-Open,
        sh:NodeShape ;
    rdfs:label "Open"^^xsd:string ;
    rdfs:comment "Position-Open"^^xsd:string ;
    rdfs:subClassOf s223:Binary-Position .

s223:Presence-False a s223:Class,
        s223:Presence-False,
        sh:NodeShape ;
    rdfs:label "Presence-based false"^^xsd:string ;
    rdfs:comment "`Presence-False`"^^xsd:string ;
    rdfs:subClassOf s223:Occupancy-Presence .

s223:Presence-True a s223:Class,
        s223:Presence-True,
        sh:NodeShape ;
    rdfs:label "Presence-based true"^^xsd:string ;
    rdfs:comment "`Presence-True`"^^xsd:string ;
    rdfs:subClassOf s223:Occupancy-Presence .

s223:PressureSensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Pressure sensor"^^xsd:string ;
    rdfs:comment "A `Sensor` that `observes` a `QuantifiableObservableProperty` that represents a measure of pressure."^^xsd:string ;
    rdfs:subClassOf s223:Sensor ;
    sh:property [ rdfs:comment "A `PressureSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of Pressure."^^xsd:string ;
            sh:message "s223: A `PressureSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of Pressure."^^xsd:string ;
            sh:path ( s223:observes qudt:hasQuantityKind ) ;
            sh:value quantitykind:Pressure ] .

s223:RadiantHeater a s223:Class,
        sh:NodeShape ;
    rdfs:label "Radiant heater"^^xsd:string ;
    rdfs:comment """
A piece of `Equipment` with heating or cooling surface that delivers 50% or more of its heat transfer by radiation.
A `RadiantHeater` shall:

- Have the role `Role-Heating`.

- Have at least one outlet connection point using the medium `Light-Infrared`.

- Conform to exactly one of the following patterns:
  - **Pattern 1:**
    - Exactly one inlet connection point using the medium `Constituent-Electricity` or `Fluid-NaturalGas`.
  - **Pattern 2:**
    - Exactly one inlet connection point using the medium `Fluid-Water`.
    - Exactly one outlet connection point using the medium Fluid-Water.
"""^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `RadiantHeater` shall have at least one outlet using the medium `Light-Infrared`."^^xsd:string ;
            sh:message "s223: A `RadiantHeater` shall have at least one outlet using the medium `Light-Infrared`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Light-Infrared ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `RadiantHeater` shall at least have the role `Role-Heating`."^^xsd:string ;
            sh:message "s223: A `RadiantHeater` shall at least have the role `Role-Heating`."^^xsd:string ;
            sh:path s223:hasRole ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Role-Heating ] ] ;
    sh:xone ( [ sh:property [ rdfs:comment "Pattern 1: A radiant heater shall have at least one inlet using the medium `Constituent-Electricity` or `Fluid-NaturalGas`."^^xsd:string ;
                        sh:message "s223: Pattern 1: A radiant heater shall have at least one inlet using the medium `Constituent-Electricity` or `Fluid-NaturalGas`."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                                sh:node [ sh:property [ sh:or ( [ sh:class s223:Constituent-Electricity ] [ sh:class s223:Fluid-NaturalGas ] ) ;
                                                sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "Pattern 2: A radiant heater shall have an outlet using the medium `Fluid-Water`."^^xsd:string ;
                        sh:message "s223: Pattern 2: A radiant heater shall have an outlet using the medium `Fluid-Water`."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                                sh:path s223:hasMedium ] ] ] ],
                    [ rdfs:comment "Pattern 2: A radiant heater shall have an inlet using the medium `Fluid-Water`."^^xsd:string ;
                        sh:message "s223: Pattern 2: A radiant heater shall have an inlet using the medium `Fluid-Water`."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                                sh:path s223:hasMedium ] ] ] ] ] ) .

s223:Refrigerant-R-123 a s223:Class,
        s223:Refrigerant-R-123,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-123"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-123`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-1234yf a s223:Class,
        s223:Refrigerant-R-1234yf,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-1234yf"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-1234yf`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-1234ze a s223:Class,
        s223:Refrigerant-R-1234ze,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-1234ze"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-1234ze`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-134A a s223:Class,
        s223:Refrigerant-R-134A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-134A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-134A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-22 a s223:Class,
        s223:Refrigerant-R-22,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-22"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-22`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-290 a s223:Class,
        s223:Refrigerant-R-290,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-290"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-290` (Propane)"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-32 a s223:Class,
        s223:Refrigerant-R-32,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-32"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-32`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-404A a s223:Class,
        s223:Refrigerant-R-404A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-404A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-404A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-407A a s223:Class,
        s223:Refrigerant-R-407A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-407A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-407A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-407C a s223:Class,
        s223:Refrigerant-R-407C,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-407C"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-407C`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-407F a s223:Class,
        s223:Refrigerant-R-407F,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-407F"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-407F`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-410A a s223:Class,
        s223:Refrigerant-R-410A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-410A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-410A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-422A a s223:Class,
        s223:Refrigerant-R-422A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-422A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-422A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-422C a s223:Class,
        s223:Refrigerant-R-422C,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-422C"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-422C`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-422D a s223:Class,
        s223:Refrigerant-R-422D,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-422D"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-422D`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-427A a s223:Class,
        s223:Refrigerant-R-427A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-427A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-427A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-438A a s223:Class,
        s223:Refrigerant-R-438A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-438A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-438A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-444A a s223:Class,
        s223:Refrigerant-R-444A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-444A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-444A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-445A a s223:Class,
        s223:Refrigerant-R-445A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-445A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-445A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-448A a s223:Class,
        s223:Refrigerant-R-448A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-448A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-448A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-449A a s223:Class,
        s223:Refrigerant-R-449A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-449A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-449A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-450A a s223:Class,
        s223:Refrigerant-R-450A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-450A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-450A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-454A a s223:Class,
        s223:Refrigerant-R-454A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-454A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-454A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-454C a s223:Class,
        s223:Refrigerant-R-454C,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-454C"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-454C`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-455A a s223:Class,
        s223:Refrigerant-R-455A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-455A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-455A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-457A a s223:Class,
        s223:Refrigerant-R-457A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-457A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-457A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-459B a s223:Class,
        s223:Refrigerant-R-459B,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-459B"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-459B`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-507 a s223:Class,
        s223:Refrigerant-R-507,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-507"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-507`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-513A a s223:Class,
        s223:Refrigerant-R-513A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-513A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-513A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-516A a s223:Class,
        s223:Refrigerant-R-516A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-516A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-516A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-600A a s223:Class,
        s223:Refrigerant-R-600A,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-600A"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-600A`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-717 a s223:Class,
        s223:Refrigerant-R-717,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-717"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-717`"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Refrigerant-R-744 a s223:Class,
        s223:Refrigerant-R-744,
        sh:NodeShape ;
    rdfs:label "Refrigerant R-744"^^xsd:string ;
    rdfs:comment "`Refrigerant-R-744` (Transcritical CO2)"^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Refrigerant .

s223:Role-Condenser a s223:Class,
        s223:Role-Condenser,
        sh:NodeShape ;
    rdfs:label "Condenser role"^^xsd:string ;
    rdfs:comment "`Role-Condenser`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Dehumidifying a s223:Class,
        s223:Role-Dehumidifying,
        sh:NodeShape ;
    rdfs:label "Dehumidifying role"^^xsd:string ;
    rdfs:comment "`Role-Dehumidifying`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Discharge a s223:Class,
        s223:Role-Discharge,
        sh:NodeShape ;
    rdfs:label "Discharge role"^^xsd:string ;
    rdfs:comment "`Role-Discharge`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Economizer a s223:Class,
        s223:Role-Economizer,
        sh:NodeShape ;
    rdfs:label "Economizer role"^^xsd:string ;
    rdfs:comment "`Role-Economizer`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Evaporator a s223:Class,
        s223:Role-Evaporator,
        sh:NodeShape ;
    rdfs:label "Evaporator role"^^xsd:string ;
    rdfs:comment "`Role-Evaporator`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Exhaust a s223:Class,
        s223:Role-Exhaust,
        sh:NodeShape ;
    rdfs:label "Exhaust role"^^xsd:string ;
    rdfs:comment "`Role-Exhaust`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Expansion a s223:Class,
        s223:Role-Expansion,
        sh:NodeShape ;
    rdfs:label "Expansion role"^^xsd:string ;
    rdfs:comment "`Role-Expansion`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Generator a s223:Class,
        s223:Role-Generator,
        sh:NodeShape ;
    rdfs:label "Generator role"^^xsd:string ;
    rdfs:comment "`Role-Generator`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-HeatRecovery a s223:Class,
        s223:Role-HeatRecovery,
        sh:NodeShape ;
    rdfs:label "Heat recovery role"^^xsd:string ;
    rdfs:comment "Role-HeatRecovery"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Load a s223:Class,
        s223:Role-Load,
        sh:NodeShape ;
    rdfs:label "Load role"^^xsd:string ;
    rdfs:comment "`Role-Load`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-OutdoorAirIntake a s223:Class,
        s223:Role-OutdoorAirIntake,
        sh:NodeShape ;
    rdfs:label "Outdoor air intake role"^^xsd:string ;
    rdfs:comment "`Role-OutdoorAirIntake`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Primary a s223:Class,
        s223:Role-Primary,
        sh:NodeShape ;
    rdfs:label "Primary role"^^xsd:string ;
    rdfs:comment "`Role-Primary`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Recirculating a s223:Class,
        s223:Role-Recirculating,
        sh:NodeShape ;
    rdfs:label "Recirculating role"^^xsd:string ;
    rdfs:comment "`Role-Recirculating`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Relief a s223:Class,
        s223:Role-Relief,
        sh:NodeShape ;
    rdfs:label "Relief role"^^xsd:string ;
    rdfs:comment "`Role-Relief`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Return a s223:Class,
        s223:Role-Return,
        sh:NodeShape ;
    rdfs:label "Return role"^^xsd:string ;
    rdfs:comment "`Role-Return`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Secondary a s223:Class,
        s223:Role-Secondary,
        sh:NodeShape ;
    rdfs:label "Secondary role"^^xsd:string ;
    rdfs:comment "`Role-Secondary`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Supply a s223:Class,
        s223:Role-Supply,
        sh:NodeShape ;
    rdfs:label "Supply role"^^xsd:string ;
    rdfs:comment "`Role-Supply`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Role-Ventilating a s223:Class,
        s223:Role-Ventilating,
        sh:NodeShape ;
    rdfs:label "Ventilating role"^^xsd:string ;
    rdfs:comment "`Role-Ventilating`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Signal-EHF a s223:Class,
        s223:Signal-EHF,
        sh:NodeShape ;
    rdfs:label "EHF"^^xsd:string ;
    rdfs:comment "RF Signal Extremely High Frequency 30 GHz to 300 GHz"^^xsd:string ;
    rdfs:subClassOf s223:RF-Signal .

s223:Signal-EIA485 a s223:Class,
        s223:Signal-EIA485,
        sh:NodeShape ;
    rdfs:label "EIA485"^^xsd:string ;
    rdfs:comment "Signal EIA485"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-Signal .

s223:Signal-ELF a s223:Class,
        s223:Signal-ELF,
        sh:NodeShape ;
    rdfs:label "ELF"^^xsd:string ;
    rdfs:comment "RF Signal Extremely Low Frequency 3 Hz to 30 Hz"^^xsd:string ;
    rdfs:subClassOf s223:RF-Signal .

s223:Signal-HF a s223:Class,
        s223:Signal-HF,
        sh:NodeShape ;
    rdfs:label "HF"^^xsd:string ;
    rdfs:comment "RF Signal High Frequency 3 MHz to 30 MHz"^^xsd:string ;
    rdfs:subClassOf s223:RF-Signal .

s223:Signal-IEC14908 a s223:Class,
        s223:Signal-IEC14908,
        sh:NodeShape ;
    rdfs:label "IEC 14908"^^xsd:string ;
    rdfs:comment "Signal-IEC14908"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-Signal .

s223:Signal-LF a s223:Class,
        s223:Signal-LF,
        sh:NodeShape ;
    rdfs:label "LF"^^xsd:string ;
    rdfs:comment "RF Signal Low Frequency 30 kHz to 300 kHz"^^xsd:string ;
    rdfs:subClassOf s223:RF-Signal .

s223:Signal-MF a s223:Class,
        s223:Signal-MF,
        sh:NodeShape ;
    rdfs:label "MF"^^xsd:string ;
    rdfs:comment "RF Signal Medium Frequency 300 kHz to 3 MHz"^^xsd:string ;
    rdfs:subClassOf s223:RF-Signal .

s223:Signal-SHF a s223:Class,
        s223:Signal-SHF,
        sh:NodeShape ;
    rdfs:label "SHF"^^xsd:string ;
    rdfs:comment "RF Signal Super High Frequency 3 GHz to 30 GHz"^^xsd:string ;
    rdfs:subClassOf s223:RF-Signal .

s223:Signal-SLF a s223:Class,
        s223:Signal-SLF,
        sh:NodeShape ;
    rdfs:label "SLF"^^xsd:string ;
    rdfs:comment "RF Signal Super Low Frequency 30 Hz to 300 Hz"^^xsd:string ;
    rdfs:subClassOf s223:RF-Signal .

s223:Signal-THF a s223:Class,
        s223:Signal-THF,
        sh:NodeShape ;
    rdfs:label "THF"^^xsd:string ;
    rdfs:comment "RF Signal Tremendously High Frequency 300 GHz to 3 THz"^^xsd:string ;
    rdfs:subClassOf s223:RF-Signal .

s223:Signal-ULF a s223:Class,
        s223:Signal-ULF,
        sh:NodeShape ;
    rdfs:label "ULF"^^xsd:string ;
    rdfs:comment "RF Signal Ultra Low Frequency 300 Hz to 3 kHz"^^xsd:string ;
    rdfs:subClassOf s223:RF-Signal .

s223:Signal-VHF a s223:Class,
        s223:Signal-VHF,
        sh:NodeShape ;
    rdfs:label "VHF"^^xsd:string ;
    rdfs:comment "RF Signal Very High Frequency 30 MHz to 300 MHz"^^xsd:string ;
    rdfs:subClassOf s223:RF-Signal .

s223:Signal-VLF a s223:Class,
        s223:Signal-VLF,
        sh:NodeShape ;
    rdfs:label "VLF"^^xsd:string ;
    rdfs:comment "RF Signal Very Low Frequency 3 kHz to 30 kHz"^^xsd:string ;
    rdfs:subClassOf s223:RF-Signal .

s223:Substance-Soot a s223:Class,
        s223:Substance-Soot,
        sh:NodeShape ;
    rdfs:label "Soot"^^xsd:string ;
    rdfs:comment "Carbon particles resulting from the incomplete combustion of hydrocarbons. Soot is considered a hazardous substance with carcinogenic properties."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Substance .

s223:ThermodynamicPhase-Solid a s223:Class,
        s223:ThermodynamicPhase-Solid,
        sh:NodeShape ;
    rdfs:label "Solid phase"^^xsd:string ;
    rdfs:comment "`ThermodynamicPhase-Solid`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-ThermodynamicPhase .

s223:ThermodynamicPhase-Vapor a s223:Class,
        s223:ThermodynamicPhase-Vapor,
        sh:NodeShape ;
    rdfs:label "Vapor phase"^^xsd:string ;
    rdfs:comment "`ThermodynamicPhase-Vapor`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-ThermodynamicPhase .

s223:UHF-LicensedBand a s223:Class,
        s223:UHF-LicensedBand,
        sh:NodeShape ;
    rdfs:label "Licensed band"^^xsd:string ;
    rdfs:comment "This class represents communication protocols that use radio frequencies in licensed bands of the UHF spectrum."^^xsd:string ;
    rdfs:subClassOf s223:Signal-UHF .

s223:VoltageSensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Voltage sensor"^^xsd:string ;
    rdfs:comment "A `Sensor` that `observes` a `QuantifiableObservableProperty` that represents a measure of voltage."^^xsd:string ;
    rdfs:subClassOf s223:Sensor ;
    sh:property [ rdfs:comment "A `VoltageSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of Voltage."^^xsd:string ;
            sh:message "s223: A `VoltageSensor` shall always observe a `QuantifiableObservableProperty` that has a `QuantityKind` of Voltage."^^xsd:string ;
            sh:path ( s223:observes qudt:hasQuantityKind ) ;
            sh:value quantitykind:Voltage ] .

s223:Water-ChilledWater a s223:Class,
        s223:Water-ChilledWater,
        sh:NodeShape ;
    rdfs:label "Chilled water"^^xsd:string ;
    s223:composedOf [ a s223:QuantifiableProperty ;
            rdfs:label "Water concentration"^^xsd:string ;
            s223:ofConstituent s223:Constituent-H2O ;
            qudt:hasQuantityKind quantitykind:VolumeFraction ;
            qudt:hasUnit unit:PERCENT ] ;
    rdfs:comment "Water-Chilled water"^^xsd:string ;
    rdfs:subClassOf s223:Fluid-Water .

s223:Water-HotWater a s223:Class,
        s223:Water-HotWater,
        sh:NodeShape ;
    rdfs:label "Hot water"^^xsd:string ;
    s223:composedOf [ a s223:QuantifiableProperty ;
            rdfs:label "Water concentration"^^xsd:string ;
            s223:ofConstituent s223:Constituent-H2O ;
            qudt:hasQuantityKind quantitykind:VolumeFraction ;
            qudt:hasUnit unit:PERCENT ] ;
    rdfs:comment "Water-Hot water"^^xsd:string ;
    rdfs:subClassOf s223:Fluid-Water .

s223:Weekday-Friday a s223:Class,
        s223:Weekday-Friday,
        sh:NodeShape ;
    rdfs:label "Friday"^^xsd:string ;
    rdfs:comment "Weekday-Friday"^^xsd:string ;
    rdfs:subClassOf s223:DayOfWeek-Weekday .

s223:Weekday-Monday a s223:Class,
        s223:Weekday-Monday,
        sh:NodeShape ;
    rdfs:label "Monday"^^xsd:string ;
    rdfs:comment "Weekday-Monday"^^xsd:string ;
    rdfs:subClassOf s223:DayOfWeek-Weekday .

s223:Weekday-Thursday a s223:Class,
        s223:Weekday-Thursday,
        sh:NodeShape ;
    rdfs:label "Thursday"^^xsd:string ;
    rdfs:comment "Weekday-Thursday"^^xsd:string ;
    rdfs:subClassOf s223:DayOfWeek-Weekday .

s223:Weekday-Tuesday a s223:Class,
        s223:Weekday-Tuesday,
        sh:NodeShape ;
    rdfs:label "Tuesday"^^xsd:string ;
    rdfs:comment "Weekday-Tuesday"^^xsd:string ;
    rdfs:subClassOf s223:DayOfWeek-Weekday .

s223:Weekday-Wednesday a s223:Class,
        s223:Weekday-Wednesday,
        sh:NodeShape ;
    rdfs:label "Wednesday"^^xsd:string ;
    rdfs:comment "Weekday-Wednesday"^^xsd:string ;
    rdfs:subClassOf s223:DayOfWeek-Weekday .

s223:Weekend-Saturday a s223:Class,
        s223:Weekend-Saturday,
        sh:NodeShape ;
    rdfs:label "Saturday"^^xsd:string ;
    rdfs:comment "Weekend-Saturday"^^xsd:string ;
    rdfs:subClassOf s223:DayOfWeek-Weekend .

s223:Weekend-Sunday a s223:Class,
        s223:Weekend-Sunday,
        sh:NodeShape ;
    rdfs:label "Sunday"^^xsd:string ;
    rdfs:comment "Weekend-Sunday"^^xsd:string ;
    rdfs:subClassOf s223:DayOfWeek-Weekend .

s223:Window a s223:Class,
        sh:NodeShape ;
    rdfs:label "Window"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that provides a pathway for `EM-Light` or `Fluid-Air` (or both) to flow from a room to another room or the building exterior through a vertical or nearly vertical area of the room envelope."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Window` shall have at least one inlet using the medium `EM-Light` or `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `Window` shall have at least one inlet using the medium `EM-Light` or `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:or ( [ sh:property [ sh:class s223:EM-Light ;
                                                sh:path s223:hasMedium ] ] [ sh:property [ sh:class s223:Fluid-Air ;
                                                sh:path s223:hasMedium ] ] ) ;
                            sh:severity sh:Warning ] ] ],
        [ rdfs:comment "A `Window` shall have at least one outlet using the medium `EM-Light` or `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `Window` shall have at least one outlet using the medium `EM-Light` or `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:or ( [ sh:property [ sh:class s223:EM-Light ;
                                                sh:path s223:hasMedium ] ] [ sh:property [ sh:class s223:Fluid-Air ;
                                                sh:path s223:hasMedium ] ] ) ] ] ] .

s223:WiredEthernet-1000BASE-T a s223:Class,
        s223:WiredEthernet-1000BASE-T,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 1000BASE-T"^^xsd:string ;
    rdfs:comment "WiredEthernet-1000BASE-T"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:WiredEthernet-1000BASE-T1 a s223:Class,
        s223:WiredEthernet-1000BASE-T1,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 1000BASE-T1"^^xsd:string ;
    rdfs:comment "WiredEthernet-1000BASE-T1"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:WiredEthernet-100BASE-T1 a s223:Class,
        s223:WiredEthernet-100BASE-T1,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 100BASE-T1"^^xsd:string ;
    rdfs:comment "WiredEthernet-100BASE-T1"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:WiredEthernet-100BASE-TX a s223:Class,
        s223:WiredEthernet-100BASE-TX,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 100BASE-TX"^^xsd:string ;
    rdfs:comment "WiredEthernet-100BASE-TX"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:WiredEthernet-10BASE-T a s223:Class,
        s223:WiredEthernet-10BASE-T,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 10BASE-T"^^xsd:string ;
    rdfs:comment "WiredEthernet-10BASE-T"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:WiredEthernet-10BASE-T1L a s223:Class,
        s223:WiredEthernet-10BASE-T1L,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 10BASE-T1L"^^xsd:string ;
    rdfs:comment "WiredEthernet-10BASE-T1L"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:WiredEthernet-10BASE-T1S a s223:Class,
        s223:WiredEthernet-10BASE-T1S,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 10BASE-T1S"^^xsd:string ;
    rdfs:comment "WiredEthernet-10BASE-T1S"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:WiredEthernet-10GBASE-T a s223:Class,
        s223:WiredEthernet-10GBASE-T,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 10GBASE-T"^^xsd:string ;
    rdfs:comment "WiredEthernet-10GBASE-T"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:WiredEthernet-10GBASE-T1 a s223:Class,
        s223:WiredEthernet-10GBASE-T1,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 10GBASE-T1"^^xsd:string ;
    rdfs:comment "WiredEthernet-10GBASE-T1"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:WiredEthernet-2.5GBASE-T a s223:Class,
        s223:WiredEthernet-2.5GBASE-T,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 2.5GBASE-T"^^xsd:string ;
    rdfs:comment "WiredEthernet-2.5GBASE-T"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:WiredEthernet-2.5GBASE-T1 a s223:Class,
        s223:WiredEthernet-2.5GBASE-T1,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 2.5GBASE-T1"^^xsd:string ;
    rdfs:comment "WiredEthernet-2.5GBASE-T1"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:WiredEthernet-25GBASE-T a s223:Class,
        s223:WiredEthernet-25GBASE-T,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 25GBASE-T"^^xsd:string ;
    rdfs:comment "WiredEthernet-25GBASE-T"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:WiredEthernet-40GBASE-T a s223:Class,
        s223:WiredEthernet-40GBASE-T,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 40GBASE-T"^^xsd:string ;
    rdfs:comment "WiredEthernet-40GBASE-T"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:WiredEthernet-5GBASE-T a s223:Class,
        s223:WiredEthernet-5GBASE-T,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 5GBASE-T"^^xsd:string ;
    rdfs:comment "WiredEthernet-5GBASE-T"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:WiredEthernet-5GBASE-T1 a s223:Class,
        s223:WiredEthernet-5GBASE-T1,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet 5GBASE-T1"^^xsd:string ;
    rdfs:comment "WiredEthernet-5GBASE-T1"^^xsd:string ;
    rdfs:subClassOf s223:Signal-WiredEthernet .

s223:actuates a s223:Relation,
        rdf:Property ;
    rdfs:label "actuates"^^xsd:string ;
    rdfs:comment "A `Relation` that associates an `Actuator` with the `Equipment` that it actuates."^^xsd:string .

s223:connected a s223:SymmetricRelation,
        rdf:Property ;
    rdfs:label "connected"^^xsd:string ;
    rdfs:comment "The relation `connected` indicates that two connectable things are `connected` without regard to the direction of flow."^^xsd:string .

s223:connectedThrough a s223:Relation,
        rdf:Property ;
    rdfs:label "connected through"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Connectable` thing with a `Connection`, without regard to the direction of flow. It is used to discover what connection links two connectable things."^^xsd:string .

s223:connectsFrom a s223:Relation,
        rdf:Property ;
    rdfs:label "connects from"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Connectable` thing with a `Connection`, with an implied direction of flow. B `connectsFrom` A indicates a flow from A to B."^^xsd:string .

s223:connectsTo a s223:Relation,
        rdf:Property ;
    rdfs:label "connects to"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Connection` with a `Connectable` thing, with an implied direction of flow. A `connectsTo` B indicates a flow from A to B."^^xsd:string .

s223:hasACLineLineVoltage a s223:Relation,
        rdf:Property ;
    rdfs:label "has AC line-line voltage"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Constituent-Electricity` with an electrical voltage between two live lines."^^xsd:string .

s223:hasACLineNeutralVoltage a s223:Relation,
        rdf:Property ;
    rdfs:label "has AC line-neutral voltage"^^xsd:string ;
    rdfs:comment "A `Relation` that associates an `Electricity-AC` medium with an electrical voltage between a live line and a neutral line."^^xsd:string .

s223:hasAlarmStatus a s223:Relation,
        rdf:Property ;
    rdfs:label "has alarm status"^^xsd:string ;
    rdfs:comment "A `Relation` that associates an `EnumerableProperty` that describes an Alarm or Status with a `QuantifiableProperty`."^^xsd:string .

s223:hasBoundaryConnectionPoint a s223:Relation,
        rdf:Property ;
    rdfs:label "has boundary connection point"^^xsd:string ;
    rdfs:comment "The `hasBoundaryConnectionPoint` relation means the `ConnectionPoint` represents the boundary of a `System` (see {s223:System}) defined by the modeler, such as a model fragment provided by the vendor of a collection of equipment intended for integration with another model. The presence of this relation is used to indicate that such a \"dangling connection point\" should not generate a validation error in a non-integrated context but should generate an error in an integrated context."^^xsd:string .

s223:hasDCDifferentialVoltage a s223:Relation,
        rdf:Property ;
    rdfs:label "has DC differential voltage"^^xsd:string ;
    rdfs:comment "A `Relation` that associates an `Electricity-DC` medium with a differential voltage."^^xsd:string .

s223:hasDCNegativeVoltage a s223:Relation,
        rdf:Property ;
    rdfs:label "has DC negative voltage"^^xsd:string ;
    rdfs:comment "A `Relation` that associates an `Electricity-DC` medium with a negative polarity voltage."^^xsd:string .

s223:hasDCPositiveVoltage a s223:Relation,
        rdf:Property ;
    rdfs:label "has DC positive voltage"^^xsd:string ;
    rdfs:comment "A `Relation` that associates an `Electricity-DC` medium with a positive polarity voltage."^^xsd:string .

s223:hasDCZeroVoltage a s223:Relation,
        rdf:Property ;
    rdfs:label "has DC zero voltage"^^xsd:string ;
    rdfs:comment "A `Relation` that associates an `Electricity-DC` medium with a zero value voltage."^^xsd:string .

s223:hasDeadband a s223:Relation,
        rdf:Property ;
    rdfs:label "has deadband"^^xsd:string ;
    rdfs:comment "This relation binds a control setpoint to the `QuantifiableProperty` indicating the range of values within which a sensed variable can vary without indicating a condition has changed."^^xsd:string .

s223:hasDomainSpace a s223:Relation,
        rdf:Property ;
    rdfs:label "has domain space"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Zone` with its component `DomainSpace`s."^^xsd:string .

s223:hasExternalReference a s223:Relation,
        rdf:Property ;
    rdfs:label "has external reference"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Property` with an external telemetry source."^^xsd:string .

s223:hasFreezingPoint a s223:Relation,
        rdf:Property ;
    rdfs:label "has freezing point"^^xsd:string ;
    rdfs:comment "The relation `hasFreezingPoint` is used to associate a freezing point with a glycol solution, but could be used with other Mediums as appropriate."^^xsd:string .

s223:hasFrequency a s223:Relation,
        rdf:Property ;
    rdfs:label "has frequency"^^xsd:string ;
    rdfs:comment "A `Relation` that associates an AC electricity `Substance-Medium` with its electrical frequency."^^xsd:string .

s223:hasMeasurementResolution a s223:Relation,
        rdf:Property ;
    rdfs:label "has measurement resolution"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Sensor` with the `QuantifiableProperty` whose value indicates the smallest recognizable change in engineering units that the `Sensor` is able to measure."^^xsd:string .

s223:hasMember a s223:Relation,
        rdf:Property ;
    rdfs:label "has member"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `System` with its component `Equipment` and/or `System`s."^^xsd:string .

s223:hasNumberOfElectricalPhases a s223:Relation,
        rdf:Property ;
    rdfs:label "has number of electrical phases"^^xsd:string ;
    rdfs:comment "A `Relation` that associates an AC electricity `Substance-Medium` with its number of electrical phases."^^xsd:string .

s223:hasPhysicalLocation a s223:Relation,
        rdf:Property ;
    rdfs:label "has physical location"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a piece of `Equipment` with its physical location (i.e., in a `PhysicalSpace`). The physical location of a piece of `Equipment` is not necessarily the same as the location affected by the operation of the `Equipment`. For example, an air handler may physically be located on the roof, but its effect is to provide conditioned air to a `Zone` or `DomainSpace` within the building. By following the path of connections, it can be determined what other equipment or spaces are possibly impacted by the `Equipment`."^^xsd:string .

s223:hasSetpoint a s223:Relation,
        rdf:Property ;
    rdfs:label "has setpoint"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a control setpoint with the `QuantifiableProperty` indicating the desired value which the control process is trying to maintain."^^xsd:string .

s223:hasThermodynamicPhase a s223:Relation,
        rdf:Property ;
    rdfs:label "has thermodynamic phase"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a Medium with its thermodynamic phases."^^xsd:string .

s223:hasThreshold a s223:Relation,
        rdf:Property ;
    rdfs:label "has threshold"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a threshold with the `QuantifiableProperty` indicating a specific value at which an action may be taken, distinguished from an offset or a range."^^xsd:string .

s223:inverseOf a s223:Relation,
        rdf:Property ;
    rdfs:label "inverse of"^^xsd:string ;
    rdfs:comment "A `Relation` that associates `Relation`s that are inverses of one another, such as `connectedTo` and `connectedFrom`."^^xsd:string .

s223:ofMedium a s223:Relation,
        rdf:Property ;
    rdfs:label "of medium"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Property` with the specific Medium it describes. A `Property` corresponding to the temperature of a medium would be associated with this medium using the relation `ofMedium`."^^xsd:string .

g36:ChilledWaterValveOrShape1 a sh:NodeShape ;
    rdfs:label "Chilled Water Valve Or Shape 1"^^xsd:string ;
    rdfs:comment "A ChilledWaterValve shall have at least one analog valve command property or at least two binary valve command properties using the relation hasProperty."^^xsd:string ;
    sh:message "g36: A ChilledWaterValve shall have at least one analog valve command property or at least two binary valve command properties using the relation hasProperty."^^xsd:string ;
    sh:or ( [ sh:property [ rdfs:comment "A ChilledWaterValve shall have at least one analog valve command property or at least two binary valve command properties using the relation hasProperty."^^xsd:string ;
                        sh:minCount 1 ;
                        sh:path s223:hasProperty ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:QuantifiableActuatableProperty ;
                                sh:node [ sh:property [ sh:hasValue s223:Binary-Position ;
                                                sh:maxCount 1 ;
                                                sh:minCount 1 ;
                                                sh:path s223:hasAspect ],
                                            [ sh:hasValue quantitykind:DimensionlessRatio ;
                                                sh:maxCount 1 ;
                                                sh:minCount 1 ;
                                                sh:path qudt:hasQuantityKind ] ] ] ] ] [ sh:property [ rdfs:comment "A ChilledWaterValve shall have at least one analog valve command property or at least two binary valve command properties using the relation hasProperty."^^xsd:string ;
                        sh:minCount 2 ;
                        sh:path s223:hasProperty ;
                        sh:qualifiedMinCount 2 ;
                        sh:qualifiedValueShape [ sh:class s223:EnumeratedActuatableProperty ;
                                sh:node [ sh:property [ sh:hasValue s223:Binary-Position ;
                                                sh:maxCount 1 ;
                                                sh:minCount 1 ;
                                                sh:path s223:hasAspect ],
                                            [ sh:hasValue s223:EnumerationKind-Binary ;
                                                sh:maxCount 1 ;
                                                sh:minCount 1 ;
                                                sh:path s223:hasEnumerationKind ] ] ] ] ] ) ;
    sh:targetClass g36:ChilledWaterValve .

g36:DamperOrShape1 a sh:NodeShape ;
    rdfs:label "Damper Or Shape 1"^^xsd:string ;
    rdfs:comment "A damper shall have at least one analog damper command property or at least two binary damper command properties using the relation hasProperty."^^xsd:string ;
    sh:message "g36: A damper shall have at least one analog damper command property or at least two binary damper command properties using the relation hasProperty."^^xsd:string ;
    sh:or ( [ sh:property [ rdfs:comment "A damper shall have at least one analog damper command property or at least two binary damper command properties using the relation hasProperty."^^xsd:string ;
                        sh:minCount 1 ;
                        sh:path s223:hasProperty ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:QuantifiableActuatableProperty ;
                                sh:node [ sh:property [ sh:hasValue quantitykind:DimensionlessRatio ;
                                                sh:maxCount 1 ;
                                                sh:minCount 1 ;
                                                sh:path qudt:hasQuantityKind ],
                                            [ sh:hasValue s223:Binary-Position ;
                                                sh:maxCount 1 ;
                                                sh:minCount 1 ;
                                                sh:path s223:hasAspect ] ] ] ] ] [ sh:property [ rdfs:comment "A damper shall have at least one analog damper command property or at least two binary damper command properties using the relation hasProperty."^^xsd:string ;
                        sh:minCount 2 ;
                        sh:path s223:hasProperty ;
                        sh:qualifiedMinCount 2 ;
                        sh:qualifiedValueShape [ sh:class s223:EnumeratedActuatableProperty ;
                                sh:node [ sh:property [ sh:hasValue s223:Binary-Position ;
                                                sh:maxCount 1 ;
                                                sh:minCount 1 ;
                                                sh:path s223:hasAspect ],
                                            [ sh:hasValue s223:EnumerationKind-Binary ;
                                                sh:maxCount 1 ;
                                                sh:minCount 1 ;
                                                sh:path s223:hasEnumerationKind ] ] ] ] ] ) ;
    sh:targetClass g36:Damper .

g36:HotWaterValveOrShape1 a sh:NodeShape ;
    rdfs:label "Hot Water Valve Or Shape 1"^^xsd:string ;
    rdfs:comment "A HotWaterValve shall have at least one analog valve command property or at least two binary valve command properties using the relation hasProperty."^^xsd:string ;
    sh:message "g36: A HotWaterValve shall have at least one analog valve command property or at least two binary valve command properties using the relation hasProperty."^^xsd:string ;
    sh:or ( [ sh:property [ rdfs:comment "A HotWaterValve shall have at least one analog valve command property or at least two binary valve command properties using the relation hasProperty."^^xsd:string ;
                        sh:minCount 1 ;
                        sh:path s223:hasProperty ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:QuantifiableActuatableProperty ;
                                sh:node [ sh:property [ sh:hasValue s223:Binary-Position ;
                                                sh:maxCount 1 ;
                                                sh:minCount 1 ;
                                                sh:path s223:hasAspect ],
                                            [ sh:hasValue quantitykind:DimensionlessRatio ;
                                                sh:maxCount 1 ;
                                                sh:minCount 1 ;
                                                sh:path qudt:hasQuantityKind ] ] ] ] ] [ sh:property [ rdfs:comment "A HotWaterValve shall have at least one analog valve command property or at least two binary valve command properties using the relation hasProperty."^^xsd:string ;
                        sh:minCount 2 ;
                        sh:path s223:hasProperty ;
                        sh:qualifiedMinCount 2 ;
                        sh:qualifiedValueShape [ sh:class s223:EnumeratedActuatableProperty ;
                                sh:node [ sh:property [ sh:hasValue s223:EnumerationKind-Binary ;
                                                sh:maxCount 1 ;
                                                sh:minCount 1 ;
                                                sh:path s223:hasEnumerationKind ],
                                            [ sh:hasValue s223:Binary-Position ;
                                                sh:maxCount 1 ;
                                                sh:minCount 1 ;
                                                sh:path s223:hasAspect ] ] ] ] ] ) ;
    sh:targetClass g36:HotWaterValve .

s223:Aspect-Delta a s223:Aspect-Delta,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Delta"^^xsd:string ;
    rdfs:comment "The property value is a differential value (e.g., pressure difference) instead of an absolute value."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Aspect .

s223:ChilledBeam a s223:Class,
        sh:NodeShape ;
    rdfs:label "Chilled beam"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` with a colder surface temperature where air passes through, and air movement is induced in the room to achieve cooling. Cooling medium is generally water."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `ChilledBeam` shall at least have the role `Role-Cooling`."^^xsd:string ;
            sh:message "s223: A `ChilledBeam` shall at least have the role `Role-Cooling`."^^xsd:string ;
            sh:path s223:hasRole ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Role-Cooling ] ],
        [ rdfs:comment "A `ChilledBeam` shall have at least one bidirectional connection point using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `ChilledBeam` shall have at least one bidirectional connection point using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `ChilledBeam` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `ChilledBeam` shall have at least one outlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `ChilledBeam` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:message "s223: A `ChilledBeam` shall have at least one inlet using the medium `Fluid-Water`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Water ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:Computer a s223:Class,
        sh:NodeShape ;
    rdfs:label "Computer"^^xsd:string ;
    rdfs:comment """A piece of `Equipment` that can be programmed to automatically carry out sequences of arithmetic or logical operations (computation).
Modern digital electronic computers can perform generic sets of operations known as programs. These programs enable computers to perform a
wide range of tasks."""^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Computer` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: A `Computer` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:Constituent-CO2 a s223:Class,
        s223:Constituent-CO2,
        sh:NodeShape ;
    rdfs:label "CO2"^^xsd:string ;
    rdfs:comment "Carbon dioxide"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:ElectronicDisplay a s223:Class,
        sh:NodeShape ;
    rdfs:label "Electronic display"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that receives an input electrical signal and outputs information, typically text and/or graphics, in a visual form."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `ElectronicDisplay` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `ElectronicDisplay` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ;
            sh:qualifiedValueShapesDisjoint true ],
        [ rdfs:comment "An `ElectronicDisplay` shall have at least one inlet using the medium `Electricity-Signal`."^^xsd:string ;
            sh:message "s223: An `ElectronicDisplay` shall have at least one inlet using the medium `Electricity-Signal`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Electricity-Signal ;
                                    sh:path s223:hasMedium ] ] ] ;
            sh:qualifiedValueShapesDisjoint true ] .

s223:ExternalReference a s223:AbstractClass,
        sh:NodeShape ;
    rdfs:label "External reference"^^xsd:string ;
    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."^^xsd:string ;
    rdfs:subClassOf s223:Concept .

s223:Fluid-NaturalGas a s223:Class,
        s223:Fluid-NaturalGas,
        sh:NodeShape ;
    rdfs:label "Natural gas"^^xsd:string ;
    rdfs:comment "Fluid-NaturalGas"^^xsd:string ;
    rdfs:subClassOf s223:Mix-Fluid .

s223:Infrared-Signal a s223:Class,
        s223:Infrared-Signal,
        sh:NodeShape ;
    rdfs:label "Infrared signal"^^xsd:string ;
    rdfs:comment """ This class and its enumerated subclasses represent common infrared communication protocols.

: Infrared-Signal Enumerations

| Enumeration |
|:-----------|
| `Signal-FiberEthernet` (see {s223:Signal-FiberEthernet}) |"""^^xsd:string ;
    rdfs:subClassOf s223:Light-Infrared .

s223:Mix-PowerAndSignal a s223:Class,
        s223:Mix-PowerAndSignal,
        sh:NodeShape ;
    rdfs:label "Power and signal mixture"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent substances that are used to convey the combination of electrical power and electrical communication signals.

: Mix-PowerAndSignal Enumerations

| Enumeration |
|:-----------|
| `PowerAndSignal-PoE` |"""^^xsd:string ;
    rdfs:subClassOf s223:Medium-Mix .

s223:Radiator a s223:Class,
        sh:NodeShape ;
    rdfs:label "Radiator"^^xsd:string ;
    rdfs:comment """A piece of `Equipment` that provides primarily convective heating to a room using electricity, steam, or water
(e.g., electric baseboard heaters, heated floors, or traditional radiators)."""^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Radiator` shall have at least one bidirectional connection point using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `Radiator` shall have at least one bidirectional connection point using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `Radiator` shall at least have the role `Role-Heating`."^^xsd:string ;
            sh:message "s223: A `Radiator` shall at least have the role `Role-Heating`."^^xsd:string ;
            sh:path s223:hasRole ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Role-Heating ] ] .

s223:Role-HeatTransfer a s223:Class,
        s223:Role-HeatTransfer,
        sh:NodeShape ;
    rdfs:label "Heat transfer role"^^xsd:string ;
    rdfs:comment "Role-HeatTransfer"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:System a s223:Class,
        sh:NodeShape ;
    rdfs:label "System"^^xsd:string ;
    rdfs:comment "A logical grouping of one or more pieces of `Equipment`, `Junction`s, or other `System`s for some functional purpose."^^xsd:string ;
    rdfs:subClassOf s223:Concept ;
    sh:property [ rdfs:comment "A `System` shall be associated with zero or more `ConnectionPoint`s that are the \"boundary\" of the equipment using the relation `hasBoundaryConnectionPoint`. The `hasBoundaryConnectionPoint` relation is used to reference those connection points of its equipment that must be connected, but in the context of validating the model with the system by itself, the \"dangling connection point\" should not generate a validation error."^^xsd:string ;
            sh:class s223:ConnectionPoint ;
            sh:message "s223: A `System` shall be associated with zero or more `ConnectionPoint`s that are the \"boundary\" of the equipment using the relation `hasBoundaryConnectionPoint`. The `hasBoundaryConnectionPoint` relation is used to reference those connection points of its equipment that must be connected, but in the context of validating the model with the system by itself, the \"dangling connection point\" should not generate a validation error."^^xsd:string ;
            sh:path s223:hasOptionalConnectionPoint ],
        [ rdfs:comment "A `System` shall be associated with zero or more `EnumerationKind-Role`s using the relation `hasRole`."^^xsd:string ;
            sh:class s223:EnumerationKind-Role ;
            sh:message "s223: A `System` shall be associated with zero or more `EnumerationKind-Role`s using the relation `hasRole`."^^xsd:string ;
            sh:path s223:hasRole ],
        [ rdfs:comment "A `System` shall be associated with zero or more `ConnectionPoint`s that are the \"boundary\" of the equipment using the relation `hasBoundaryConnectionPoint`. The `hasBoundaryConnectionPoint` relation is used to reference those connection points of its equipment that must be connected, but in the context of validating the model with the system by itself, the \"dangling connection point\" should not generate a validation error."^^xsd:string ;
            sh:class s223:ConnectionPoint ;
            sh:message "s223: A `System` shall be associated with zero or more `ConnectionPoint`s that are the \"boundary\" of the equipment using the relation `hasBoundaryConnectionPoint`. The `hasBoundaryConnectionPoint` relation is used to reference those connection points of its equipment that must be connected, but in the context of validating the model with the system by itself, the \"dangling connection point\" should not generate a validation error."^^xsd:string ;
            sh:path s223:hasBoundaryConnectionPoint ],
        [ a sh:PropertyShape ;
            rdfs:comment "A `System` shall be associated with at least one piece of `Equipment`, `Junction`, or `System` using the relation `hasMember`."^^xsd:string ;
            sh:message "s223: A `System` shall be associated with at least one piece of `Equipment`, `Junction`, or `System` using the relation `hasMember`."^^xsd:string ;
            sh:minCount 1 ;
            sh:or ( [ sh:class s223:Equipment ] [ sh:class s223:Junction ] [ sh:class s223:System ] ) ;
            sh:path s223:hasMember ;
            sh:severity sh:Warning ] ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment "Ensure that the boundary `ConnectionPoint`s of a `System` belong to only members of that `System`"^^xsd:string ;
            sh:message "s223: `System` {$this} `hasBoundaryConnectionPoint` {?cp}, belonging to {?con} that is not a member of {?this}."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            sh:select """
SELECT $this ?cp ?con
WHERE {
$this s223:hasBoundaryConnectionPoint ?cp .
?cp s223:isConnectionPointOf ?con .
FILTER NOT EXISTS {$this s223:hasMember+ ?con}
}
"""^^xsd:string ] .

s223:ThermodynamicPhase-Gas a s223:Class,
        s223:ThermodynamicPhase-Gas,
        sh:NodeShape ;
    rdfs:label "Gas phase"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent gas in various thermodynamic states.

: ThermodynamicPhase-Gas Enumerations

| Enumeration |
|:-----------|
| `Gas-Superheated` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-ThermodynamicPhase .

s223:ThermodynamicPhase-Liquid a s223:Class,
        s223:ThermodynamicPhase-Liquid,
        sh:NodeShape ;
    rdfs:label "Liquid phase"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent liquid in various thermodynamic states.

: ThermodynamicPhase-Liquid Enumerations

| Enumeration |
|:-----------|
| `Liquid-Subcooled` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-ThermodynamicPhase .

s223:Water-Steam a s223:Class,
        s223:Water-Steam,
        sh:NodeShape ;
    rdfs:label "Steam"^^xsd:string ;
    s223:composedOf [ a s223:QuantifiableProperty ;
            rdfs:label "Water concentration"^^xsd:string ;
            s223:ofConstituent s223:Constituent-H2O ;
            qudt:hasQuantityKind quantitykind:VolumeFraction ;
            qudt:hasUnit unit:PERCENT ] ;
    rdfs:comment "Water-Steam"^^xsd:string ;
    rdfs:subClassOf s223:Fluid-Water .

s223:Waveguide a s223:Class,
        sh:NodeShape ;
    rdfs:label "Waveguide"^^xsd:string ;
    rdfs:comment "A type of `Connection` the represents structures, such as fiber optic or coaxial cables, used to convey electromagnetic energy i.e., `Constituent-EM` in a specific direction. Without the physical constraint of a waveguide, waves would expand into three-dimensional space and their intensities would decrease according to the inverse square law."^^xsd:string ;
    rdfs:subClassOf s223:Connection ;
    sh:property [ rdfs:comment "A `Waveguide` shall be associated with exactly one `Constituent-EM` using the relation `hasMedium`."^^xsd:string ;
            sh:class s223:Constituent-EM ;
            sh:maxCount 1 ;
            sh:message "s223: A `Waveguide` shall be associated with exactly one `Constituent-EM` using the relation `hasMedium`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasMedium ] .

s223:Wideband-DOCSIS a s223:Class,
        s223:Wideband-DOCSIS,
        sh:NodeShape ;
    rdfs:label "DOCSIS"^^xsd:string ;
    rdfs:comment "The global standard Data Over Cable Service Interface Specification communication protocol that is used to deliver high-speed internet service over `CoaxialCable` communication networks."^^xsd:string ;
    rdfs:subClassOf s223:Signal-Wideband .

s223:encloses a s223:Relation,
        rdf:Property ;
    rdfs:label "encloses"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `PhysicalSpace` with one or more `DomainSpace`s."^^xsd:string .

s223:executes a s223:Relation,
        rdf:Property ;
    rdfs:label "executes"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Controller` (see {s223:Controller}) with the `Function`s (see {s223:Function}) that it executes."^^xsd:string .

s223:hasInput a s223:Relation,
        rdf:Property ;
    rdfs:label "has input"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Function` (see {s223:Function}) with a `Property` (see {s223:Property}) that is used as input to the `Function`."^^xsd:string .

s223:hasOptionalConnectionPoint a s223:Relation,
        rdf:Property ;
    rdfs:label "has optional connection point"^^xsd:string ;
    rdfs:comment "The `hasOptionalConnectionPoint` relation means that the `ConnectionPoint` is optional and is not required to be connected. The presence of this relation is used to indicate that such a \"dangling connection point\" should not generate a validation error in an integrated or non-integrated context."^^xsd:string .

s223:isConnectionPointOf a s223:RelationWithInverse,
        rdf:Property ;
    rdfs:label "is connection point of"^^xsd:string ;
    s223:inverseOf s223:hasConnectionPoint ;
    rdfs:comment "One of two `Relation`s that associates a `ConnectionPoint` with a `Connectable` thing. It is the inverse of the relation `hasConnectionPoint` (see {s223:hasConnectionPoint})."^^xsd:string .

s223:isInternalReferenceOf a s223:RelationWithInverse,
        rdf:Property ;
    rdfs:label "is internal reference of"^^xsd:string ;
    s223:inverseOf s223:hasInternalReference ;
    rdfs:comment "The inverse of the relation `hasInternalReference` (see {s223:hasInternalReference})."^^xsd:string .

s223:Binary-Logical a s223:Binary-Logical,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Logical"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent the possible values of a logical `Property` i.e., True or False.

: Binary-Logical Enumerations

| Enumeration |
|:-----------|
| `Logical-False` |
| `Logical-True` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Binary .

s223:Conductor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Conductor"^^xsd:string ;
    rdfs:comment "A `Connection` that represents one or more wires used to convey `Constituent-Electricity`. Each instance of `Conductor` applies to no more than one electrical circuit."^^xsd:string ;
    rdfs:subClassOf s223:Connection ;
    sh:property [ rdfs:comment "A `Conductor` shall be associated with at most one `EnumerationKind-ElectricalPhaseIdentifier` using the relation `hasElectricalPhase`."^^xsd:string ;
            sh:class s223:EnumerationKind-ElectricalPhaseIdentifier ;
            sh:maxCount 1 ;
            sh:message "s223: A `Conductor` shall be associated with at most one `EnumerationKind-ElectricalPhaseIdentifier` using the relation `hasElectricalPhase`."^^xsd:string ;
            sh:path s223:hasElectricalPhase ],
        [ rdfs:comment "Ensure the electrical phase is the same as all connected `ConnectionPoint`s"^^xsd:string ;
            sh:path s223:hasElectricalPhase ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Ensure the electrical phase is the same as all connected `ConnectionPoint`s"^^xsd:string ;
                    sh:message "s223: {$this} has an electrical phase of {?myphase} which is different from {?cpPhase} for `ConnectionPoint` {?cp}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
    SELECT $this ?myphase ?cp ?cpPhase
    WHERE {
        $this s223:hasElectricalPhase ?myphase .
        $this s223:connectsAt ?cp .
        ?cp s223:hasElectricalPhase ?cpPhase .
        FILTER (?myphase != ?cpPhase) .
        }
        """^^xsd:string ] ],
        [ rdfs:comment "A `Conductor` shall be associated with exactly one `Constituent-Electricity` using the relation `hasMedium`."^^xsd:string ;
            sh:class s223:Constituent-Electricity ;
            sh:maxCount 1 ;
            sh:message "s223: A `Conductor` shall be associated with exactly one `Constituent-Electricity` using the relation `hasMedium`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasMedium ] .

s223:Constituent-NOX a s223:Class,
        s223:Constituent-NOX,
        sh:NodeShape ;
    rdfs:label "NOX"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent common Nitrogen Oxides (NOx).

: Constituent-NOX Enumerations

| Enumeration |
|:-----------|
| `NOX-NO` |
| `NOX-NO2` |"""^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:CoolingCoil a s223:Class,
        sh:NodeShape ;
    rdfs:label "Cooling coil"^^xsd:string ;
    rdfs:comment "A `Coil` that is specifically used to cool air."^^xsd:string ;
    rdfs:subClassOf s223:Coil ;
    sh:property [ rdfs:comment "A `CoolingCoil` shall at least have the role `Role-Cooling`."^^xsd:string ;
            sh:message "s223: A `CoolingCoil` shall at least have the role `Role-Cooling`."^^xsd:string ;
            sh:path s223:hasRole ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Role-Cooling ] ] .

s223:DayOfWeek-Weekend a s223:Class,
        s223:DayOfWeek-Weekend,
        sh:NodeShape ;
    rdfs:label "Weekend"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent weekend days according to the Gregorian calendar, i.e., Saturday and Sunday.

: DayOfWeek-Weekend Enumerations

| Enumeration |
|:-----------|
| `Weekend-Saturday` |
| `Weekend-Sunday` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-DayOfWeek .

s223:Domain-HVAC a s223:Class,
        s223:Domain-HVAC,
        sh:NodeShape ;
    rdfs:label "HVAC domain"^^xsd:string ;
    rdfs:comment "The domain that represents equipment that condition and ventilate spaces within a building. Example `Domain-HVAC` equipment include `Fan`, `Pump`, and `AirHandlingUnit`."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Domain .

s223:DomainSpace a s223:Class,
        sh:NodeShape ;
    rdfs:label "Domain space"^^xsd:string ;
    rdfs:comment "A portion of a `PhysicalSpace` that is affected by a building service associated with a domain. `DomainSpace`s may represent an entire `PhysicalSpace` or any portion of a `PhysicalSpace` (see {s223:PhysicalSpace}). Multiple `DomainSpace`s of the same domain may overlap, and `DomainSpace`s of different domains may also overlap, but `DomainSpace`s can not overlap multiple `PhysicalSpace`s. `DomainSpace`s may be grouped into `Zone`s using the relation `hasDomainSpace` (see {s223:hasDomainSpace})."^^xsd:string ;
    rdfs:subClassOf s223:Connectable ;
    sh:property [ rdfs:comment "A `DomainSpace` shall be associated with exactly one `EnumerationKind-Domain` using the relation `hasDomain`."^^xsd:string ;
            sh:class s223:EnumerationKind-Domain ;
            sh:maxCount 1 ;
            sh:message "s223: A `DomainSpace` shall be associated with exactly one `EnumerationKind-Domain` using the relation `hasDomain`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasDomain ],
        [ rdfs:comment "A `DomainSpace` must be enclosed by a `PhysicalSpace`."^^xsd:string ;
            sh:message "s223: A `DomainSpace` must be enclosed by a `PhysicalSpace`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path [ sh:inversePath s223:encloses ] ;
            sh:severity sh:Info ] .

s223:EM-RF a s223:Class,
        s223:EM-RF,
        sh:NodeShape ;
    rdfs:label "RF"^^xsd:string ;
    rdfs:comment """
This class and its enumerated subclasses represent the use electromagnetic energy in the radio frequency range for multiple purposes, including communication signals.

: EM-RF Enumerations

| Enumeration |
|:-----------|
| `RF-Signal` (see {s223:RF-Signal}) |"""^^xsd:string ;
    rdfs:subClassOf s223:Constituent-EM .

s223:ElectricEnergyConverter a s223:Class,
        sh:NodeShape ;
    rdfs:label "Electric energy converter"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that converts one form of electric power to another form of electric power."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "An `ElectricEnergyConverter` shall have at least two connection points using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `ElectricEnergyConverter` shall have at least two connection points using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 2 ;
            sh:qualifiedValueShape [ sh:class s223:ConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:ElectricResistanceElement a s223:Class,
        sh:NodeShape ;
    rdfs:label "Electric resistance element"^^xsd:string ;
    rdfs:comment """A piece of `Equipment` that provides electrical resistance heating, for example an electric heating coil within a Fan Coil Unit.
It shall have one electricity `InletConnectionPoint`, and fit one of the following two patterns:

- Pattern 1: An `ElectricResistanceElement` shall have exactly one Bidirectional `ConnectionPoint` using the medium `Mix-Fluid`.
- Pattern 2: An `ElectricResistanceElement` shall have one inlet and one outlet using the medium `Mix-Fluid`."""^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:message "s223: An `ElectricResistanceElement` shall have one electricity `InletConnectionPoint`, plus fit one of the following two patterns: Pattern 1: An `ElectricResistanceElement` shall have exactly one Bidirectional `ConnectionPoint` using the medium `Mix-Fluid`. Pattern 2: An `ElectricResistanceElement` shall have one inlet and one outlet using the medium `Mix-Fluid`."^^xsd:string ;
    sh:property [ rdfs:comment "An `ElectricResistanceElement` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:message "s223: An `ElectricResistanceElement` shall have at least one inlet using the medium `Constituent-Electricity`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Constituent-Electricity ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "An `ElectricResistanceElement` shall at least have the role `Role-Heating`."^^xsd:string ;
            sh:message "s223: An `ElectricResistanceElement` shall at least have the role `Role-Heating`."^^xsd:string ;
            sh:path s223:hasRole ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Role-Heating ] ] ;
    sh:xone ( [ sh:property [ rdfs:comment "Pattern 1: An `ElectricResistanceElement` shall have exactly one Bidirectional `ConnectionPoint` using the medium `Mix-Fluid`."^^xsd:string ;
                        sh:message "s223: Pattern 1: An `ElectricResistanceElement` requires exactly one `BidirectionalConnectionPoint` using the medium `Mix-Fluid`."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMaxCount 1 ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Mix-Fluid ;
                                                sh:path s223:hasMedium ] ] ] ;
                        sh:qualifiedValueShapesDisjoint true ] ] [ sh:property [ rdfs:comment "Pattern 2: An `ElectricResistanceElement` shall have one inlet using the medium `Mix-Fluid`."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMaxCount 1 ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Mix-Fluid ;
                                                sh:path s223:hasMedium ] ] ] ;
                        sh:qualifiedValueShapesDisjoint true ],
                    [ rdfs:comment "Pattern 2: An `ElectricResistanceElement` shall have one outlet using the medium `Mix-Fluid`."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMaxCount 1 ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Mix-Fluid ;
                                                sh:path s223:hasMedium ] ] ] ;
                        sh:qualifiedValueShapesDisjoint true ] ] ) .

s223:EnumerableProperty a s223:Class,
        sh:NodeShape ;
    rdfs:label "Enumerable property"^^xsd:string ;
    rdfs:comment "An `EnumerableProperty` is a `Property` with an enumerated (fixed) set of possible values."^^xsd:string ;
    rdfs:subClassOf s223:Property ;
    sh:property [ rdfs:comment "An `EnumerableProperty` shall be associated with exactly one `EnumerationKind` using the relation `hasEnumerationKind`."^^xsd:string ;
            sh:class s223:EnumerationKind ;
            sh:maxCount 1 ;
            sh:message "s223: An `EnumerableProperty` shall be associated with exactly one `EnumerationKind` using the relation `hasEnumerationKind`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasEnumerationKind ],
        [ rdfs:comment "Checks for valid enumeration value consistent with the stated `EnumerationKind`."^^xsd:string ;
            sh:path s223:hasValue ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Checks for valid enumeration value consistent with the stated `EnumerationKind`."^^xsd:string ;
                    sh:message "s223: {$this} has an enumeration value of {?value} which is not a valid {?kind}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?value ?kind
WHERE {
$this s223:hasValue ?value .
$this s223:hasEnumerationKind ?kind .
FILTER (NOT EXISTS {?value a/rdfs:subClassOf* ?kind}) .
}
"""^^xsd:string ] ] .

s223:EnumerationKind-DayOfWeek a s223:Class,
        s223:EnumerationKind-DayOfWeek,
        sh:NodeShape ;
    rdfs:label "Day of week"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent the days of the week, according to the Gregorian calendar i.e., 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.

: EnumerationKind-DayOfWeek Enumerations

| Enumeration |
|:-----------|
| `DayOfWeek-Weekday` |
| `DayOfWeek-Weekend` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind .

s223:Fluid-Oil a s223:Class,
        s223:Fluid-Oil,
        sh:NodeShape ;
    rdfs:label "Oil"^^xsd:string ;
    rdfs:comment "Fluid-Oil"^^xsd:string ;
    rdfs:subClassOf s223:Mix-Fluid .

s223:HeatingCoil a s223:Class,
        sh:NodeShape ;
    rdfs:label "Heating coil"^^xsd:string ;
    rdfs:comment "A `Coil` that is specifically used to heat air."^^xsd:string ;
    rdfs:subClassOf s223:Coil ;
    sh:property [ rdfs:comment "A `HeatingCoil` shall at least have the role `Role-Heating`."^^xsd:string ;
            sh:message "s223: A `HeatingCoil` shall at least have the role `Role-Heating`."^^xsd:string ;
            sh:path s223:hasRole ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Role-Heating ] ] .

s223:Light-Infrared a s223:Class,
        s223:Light-Infrared,
        sh:NodeShape ;
    rdfs:label "Infrared light"^^xsd:string ;
    rdfs:comment """ This class and its enumerated subclasses represent the use of electromagnetic energy in the infrared frequency range for multiple purposes, including communication signals.

  : Light-Infrared Enumerations

  | Enumeration |
  |:-----------|
  | `Infrared-Signal` (see {s223:Infrared-Signal}) |"""^^xsd:string ;
    rdfs:subClassOf s223:EM-Light .

s223:LightSensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Light sensor"^^xsd:string ;
    rdfs:comment "A `Sensor` that `observes` a `QuantifiableObservableProperty` that represents an attribute of light, as specified by the `QuantityKind` of the `Property` being observed, as described below."^^xsd:string ;
    rdfs:subClassOf s223:Sensor .

s223:Medium-Mix a s223:Class,
        s223:Medium-Mix,
        sh:NodeShape ;
    rdfs:label "Mixed medium"^^xsd:string ;
    rdfs:comment """
This class and its subclasses represent substances that are composed of constituents. The components of a `Medium-Mix` can be modeled using the relations `composedOf` and `ofConstituent`. See Figure 10-8a and Figure 10-8b.

Figure 10-8a shows `GlycolSolution-30Percent`, itself a subclass of
`Water-GlycolSolution`, `Fluid-Water`, and `Mix-Fluid`, with a _Water Concentration_
property referencing 70% `Constituent-H2O` by the relation `ofConstituent` and
a _Glycol Concentration_ property referencing 30% `Constituent-Glycol` also
by the relation `ofConstituent`.

Figure 10-8b shows `PowerAndSignal-PoE`, itself a subclass of `Mix-PowerAndSignal`,
composed of a _Power_ `Property` referencing `Electricity-DC` and a _Communications_
`Property` referencing `Signal-WiredEthernet`.

![ ](figures/Figure_10-8_Substance.svg)

: Medium-Mix Enumerations

| Enumeration |
|:-----------|
| `Mix-Fluid` (see {s223:Mix-Fluid}) |
| `Mix-PowerAndSignal` (see {s223:Mix-PowerAndSignal}) |"""^^xsd:string ;
    rdfs:subClassOf s223:Substance-Medium ;
    sh:property [ rdfs:comment "A `Medium-Mix` shall be associated with zero or more `Property`s that identify and characterize its constituents using the relation `composedOf`. The `Property` identifies the constituent using the relation `ofConstituent`. If appropriate, a `QuantifiableProperty` may be used to also specify the amount of the constituent using the relations `qudt:hasQuantityKind`, `qudt:hasUnit`, and `hasValue`. For example, see {s223:Water-GlycolSolution}."^^xsd:string ;
            sh:class s223:Property ;
            sh:message "s223: A `Medium-Mix` shall be associated with zero or more `Property`s that identify and characterize its constituents using the relation `composedOf`. The `Property` identifies the constituent using the relation `ofConstituent`. If appropriate, a `QuantifiableProperty` may be used to also specify the amount of the constituent using the relations `qudt:hasQuantityKind`, `qudt:hasUnit`, and `hasValue`. For example, see {s223:Water-GlycolSolution}."^^xsd:string ;
            sh:path s223:composedOf ] .

s223:ObservableProperty a s223:Class,
        sh:NodeShape ;
    rdfs:label "Observable property"^^xsd:string ;
    rdfs:comment """The term "observable" implies that reading the `ObservableProperty` value will return the result of a physical observation, usually by a `Sensor`.
In contrast, the term "actuatable" (see {s223:ActuatableProperty}) implies that writing to the `ActuatableProperty` value will directly trigger a physical actuation."""^^xsd:string ;
    rdfs:subClassOf s223:Property ;
    sh:property [ rdfs:comment "An `ObservableProperty` is usually referred to by a `Sensor` using the relation `observes`."^^xsd:string ;
            sh:class s223:Sensor ;
            sh:message "s223: An `ObservableProperty` is usually referred to by a `Sensor` using the relation `observes`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path [ sh:inversePath s223:observes ] ;
            sh:severity sh:Warning ] .

s223:Occupancy-Occupied a s223:Class,
        s223:Occupancy-Occupied,
        sh:NodeShape ;
    rdfs:label "Generic occupancy"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent the generic detection of human occupancy in a space.

  : Occupancy-Occupied Enumerations

| Enumeration |
|:-----------|
| `Occupied-False` |
| `Occupied-True` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Occupancy .

s223:OccupancySensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Occupancy sensor"^^xsd:string ;
    rdfs:comment "A `Sensor` that `observes` an `ObservableProperty` that represents an attribute of occupancy in a space."^^xsd:string ;
    rdfs:subClassOf s223:Sensor .

s223:PhysicalSpace a s223:Class,
        sh:NodeShape ;
    rdfs:label "Physical space"^^xsd:string ;
    rdfs:comment "An architectural concept representing a room, a part of a room, a collection of rooms, or any other physical region in a building. PhysicalSpaces may be grouped to define larger `PhysicalSpace`s using the relation `contains` (see {s223:contains})."^^xsd:string ;
    rdfs:subClassOf s223:Concept ;
    sh:property [ rdfs:comment "A `PhysicalSpace` shall be associated with zero or more enclosed `DomainSpace`s using the relation `encloses`."^^xsd:string ;
            sh:class s223:DomainSpace ;
            sh:message "s223: A `PhysicalSpace` shall be associated with zero or more enclosed `DomainSpace`s using the relation `encloses`."^^xsd:string ;
            sh:path s223:encloses ],
        [ rdfs:comment "A `PhysicalSpace` shall be associated with zero or more contained `PhysicalSpace`s using the relation `contains`."^^xsd:string ;
            sh:class s223:PhysicalSpace ;
            sh:message "s223: A `PhysicalSpace` shall be associated with zero or more contained `PhysicalSpace`s using the relation `contains`."^^xsd:string ;
            sh:path s223:contains ] .

s223:PowerAndSignal-PoE a s223:Class,
        s223:PowerAndSignal-PoE,
        sh:NodeShape ;
    rdfs:label "Power over Ethernet (PoE)"^^xsd:string ;
    s223:composedOf [ a s223:Property ;
            rdfs:label "Unspecified"^^xsd:string ;
            s223:ofConstituent s223:Signal-WiredEthernet ],
        [ a s223:Property ;
            rdfs:label "Unspecified"^^xsd:string ;
            s223:ofConstituent s223:DC-PoE ] ;
    rdfs:comment "PowerAndSignal-PoE"^^xsd:string ;
    rdfs:subClassOf s223:Mix-PowerAndSignal ;
    sh:property [ rdfs:comment "A `PowerAndSignal-PoE` shall be associated with at least two `Property`s using the relation `composedOf`. These characterize the constituents of Power over Ethernet (PoE)."^^xsd:string ;
            sh:class s223:Property ;
            sh:message "s223: A `PowerAndSignal-PoE` shall be associated with at least two `Property`s using the relation `composedOf`. These characterize the constituents of Power over Ethernet (PoE)."^^xsd:string ;
            sh:minCount 2 ;
            sh:path s223:composedOf ],
        [ rdfs:comment "One of the constituents of a `PowerAndSignal-PoE` shall be a `Signal-WiredEthernet`."^^xsd:string ;
            sh:message "s223: One of the constituents of a `PowerAndSignal-PoE` shall be a `Signal-WiredEthernet`."^^xsd:string ;
            sh:path s223:composedOf ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Property ;
                    sh:node [ sh:property [ sh:class s223:Signal-WiredEthernet ;
                                    sh:path s223:ofConstituent ] ] ] ;
            sh:qualifiedValueShapesDisjoint true ],
        [ rdfs:comment "One of the constituents of a `PowerAndSignal-PoE` shall be a `DC-PoE`."^^xsd:string ;
            sh:message "s223: One of the constituents of a `PowerAndSignal-PoE` shall be a `DC-PoE`."^^xsd:string ;
            sh:path s223:composedOf ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Property ;
                    sh:node [ sh:property [ sh:class s223:DC-PoE ;
                                    sh:path s223:ofConstituent ] ] ] ;
            sh:qualifiedValueShapesDisjoint true ] .

s223:Signal-UHF a s223:Class,
        s223:Signal-UHF,
        sh:NodeShape ;
    rdfs:label "UHF"^^xsd:string ;
    rdfs:comment "RF Signal Ultra High Frequency 300 MHz to 3 GHz"^^xsd:string ;
    rdfs:subClassOf s223:RF-Signal .

s223:Signal-Wideband a s223:Class,
        s223:Signal-Wideband,
        sh:NodeShape ;
    rdfs:label "Wideband"^^xsd:string ;
    rdfs:comment "Signal-Wideband"^^xsd:string ;
    rdfs:subClassOf s223:RF-Signal .

s223:TerminalUnit a s223:Class,
        sh:NodeShape ;
    rdfs:label "Terminal unit"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that modulates the volume of air delivered to a space."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `TerminalUnit` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `TerminalUnit` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `TerminalUnit` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `TerminalUnit` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:Voltage-2.5V a s223:Class,
        s223:Voltage-2.5V,
        sh:NodeShape ;
    rdfs:label "2.5 V"^^xsd:string ;
    s223:hasValue 2.5 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-2.5V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-3V a s223:Class,
        s223:Voltage-3V,
        sh:NodeShape ;
    rdfs:label "3 V"^^xsd:string ;
    s223:hasValue 3.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-3V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Water-GlycolSolution a s223:Class,
        s223:Water-GlycolSolution,
        sh:NodeShape ;
    rdfs:label "Water-Glycol solution"^^xsd:string ;
    s223:composedOf [ a s223:QuantifiableProperty ;
            rdfs:label "Unspecified"^^xsd:string ;
            s223:ofConstituent s223:Constituent-Glycol ;
            qudt:hasQuantityKind quantitykind:VolumeFraction ;
            qudt:hasUnit unit:PERCENT ],
        [ a s223:QuantifiableProperty ;
            rdfs:label "Unspecified"^^xsd:string ;
            s223:ofConstituent s223:Constituent-H2O ;
            qudt:hasQuantityKind quantitykind:VolumeFraction ;
            qudt:hasUnit unit:PERCENT ] ;
    s223:hasFreezingPoint [ a s223:QuantifiableProperty ;
            rdfs:label "Freezing point"^^xsd:string ;
            qudt:hasQuantityKind quantitykind:Temperature ] ;
    rdfs:comment """This class and its enumerated subclasses represent common concentrations of water-glycol solution.

: Water-GlycolSolution Enumerations

| Enumeration |
|:-----------|
| `GlycolSolution-15Percent` |
| `GlycolSolution-30Percent` |"""^^xsd:string ;
    rdfs:subClassOf s223:Fluid-Water ;
    sh:property [ rdfs:comment "A `Water-GlycolSolution` shall be associated with at least two `QuantifiableProperty`s using the relation `composedOf`. These characterize the constituents of a `Water-GlycolSolution`."^^xsd:string ;
            sh:class s223:QuantifiableProperty ;
            sh:message "s223: A `Water-GlycolSolution` shall be associated with at least two `QuantifiableProperty`s using the relation `composedOf`. These characterize the constituents of a `Water-GlycolSolution`."^^xsd:string ;
            sh:minCount 2 ;
            sh:path s223:composedOf ],
        [ rdfs:comment "One of the constituents of a `Water-GlycolSolution` shall be a `Constituent-H2O`."^^xsd:string ;
            sh:message "s223: One of the constituents of a `Water-GlycolSolution` shall be a `Constituent-H2O`."^^xsd:string ;
            sh:path s223:composedOf ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:QuantifiableProperty ;
                    sh:node [ sh:property [ rdfs:comment "The `QuantityKind` of the constituent shall be `VolumeFraction`."^^xsd:string ;
                                    sh:in ( quantitykind:VolumeFraction ) ;
                                    sh:path qudt:hasQuantityKind ],
                                [ rdfs:comment "One of the constituents of a `Water-GlycolSolution` shall be a `Constituent-H2O`."^^xsd:string ;
                                    sh:class s223:Constituent-H2O ;
                                    sh:path s223:ofConstituent ] ] ] ;
            sh:qualifiedValueShapesDisjoint true ],
        [ rdfs:comment "One of the constituents of a `Water-GlycolSolution` shall be a `Constituent-Glycol`."^^xsd:string ;
            sh:message "s223: One of the constituents of a `Water-GlycolSolution` shall be a `Constituent-Glycol`."^^xsd:string ;
            sh:path s223:composedOf ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:QuantifiableProperty ;
                    sh:node [ sh:property [ rdfs:comment "One of the constituents of a `Water-GlycolSolution` shall be a `Constituent-Glycol`."^^xsd:string ;
                                    sh:class s223:Constituent-Glycol ;
                                    sh:path s223:ofConstituent ],
                                [ rdfs:comment "The `QuantityKind` of the constituent shall be `VolumeFraction`."^^xsd:string ;
                                    sh:in ( quantitykind:VolumeFraction ) ;
                                    sh:path qudt:hasQuantityKind ] ] ] ;
            sh:qualifiedValueShapesDisjoint true ],
        [ rdfs:comment "A `Water-GlycolSolution` shall be associated with zero or more `QuantifiableProperty`s with a `QuantityKind` of `Temperature` using the relation `hasFreezingPoint`."^^xsd:string ;
            sh:class s223:QuantifiableProperty ;
            sh:message "s223: A `Water-GlycolSolution` shall be associated with zero or more `QuantifiableProperty`s with a `QuantityKind` of `Temperature` using the relation `hasFreezingPoint`."^^xsd:string ;
            sh:node [ sh:property [ sh:in ( quantitykind:Temperature ) ;
                            sh:path qudt:hasQuantityKind ] ] ;
            sh:path s223:hasFreezingPoint ] .

s223:Wideband-CATV a s223:Class,
        s223:Wideband-CATV,
        sh:NodeShape ;
    rdfs:label "CATV"^^xsd:string ;
    rdfs:comment "The Community Antenna Television communication protocol that is used to deliver cable TV service over `CoaxialCable` or `FiberOpticCable` communication networks."^^xsd:string ;
    rdfs:subClassOf s223:Signal-Wideband .

s223:actuatedByProperty a s223:Relation,
        rdf:Property ;
    rdfs:label "actuated by property"^^xsd:string ;
    rdfs:comment """A `Relation` that associates a piece of `Equipment` with the `ActuatableProperty` that it responds to. If the `Equipment`
is an `Actuator` (a subclass of `Equipment`), `actuatedByProperty` is a required relation. An `Actuator` may also identify another piece of
`Equipment` being actuated. (see {s223:actuates})."""^^xsd:string .

s223:connectedFrom a s223:RelationWithInverse,
        rdf:Property ;
    rdfs:label "connected from"^^xsd:string ;
    s223:inverseOf s223:connectedTo ;
    rdfs:comment "The relation `connectedFrom` indicates that connectable things are `connected` with a specific direction of flow. B is `connectedFrom` A, means that the direction of flow is from A to B.  The inverse direction is indicated by `connectedTo` (see {s223:connectedTo})."^^xsd:string .

s223:connectsThrough a s223:RelationWithInverse,
        rdf:Property ;
    rdfs:label "connects through"^^xsd:string ;
    s223:inverseOf s223:connectsAt ;
    rdfs:comment "A `Relation` that associates a `ConnectionPoint` with a `Connection`, without regard to the direction of flow."^^xsd:string .

s223:hasElectricalPhase a s223:Relation,
        rdf:Property ;
    rdfs:label "has electrical phase"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Conductor` or `ConnectionPoint` with at most one `EnumerationKind-ElectricalPhaseIdentifier`."^^xsd:string .

s223:hasOutput a s223:Relation,
        rdf:Property ;
    rdfs:label "has output"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Function` (see {s223:Function}) with a `Property` (see {s223:Property}) that is calculated by the `Function`."^^xsd:string .

s223:hasZone a s223:Relation,
        rdf:Property ;
    rdfs:label "has zone"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Zone` with component `Zone`s."^^xsd:string .

s223:ofSubstance a s223:Relation,
        rdf:Property ;
    rdfs:label "of substance"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Property` being observed by a `Sensor` with the `EnumerationKind-Substance` it characterizes within a specific `Substance-Medium`. For example, to denote the concentration of a `EnumerationKind-Substance` in a `Substance-Medium`, `ofSubstance` is used. Typically, there is also an `ofMedium` relation between the observed `Property` and the `Substance-Medium`, (see Figures 10-9 and 10-10). For example, to represent the concentration of CO2 in air, we use `ofSubstance` to relate to CO2 and `ofMedium` to relate to air. The term `ofSubstance` is broad enough to include situations where a sensor is used to detect constituents that should not be present in a medium, such as ammonia in air. Therefore, `ofSubstance` is used to indicate the substance of interest, while `ofConstituent` would indicate a constituent that is normally present in the composition of the mix."^^xsd:string .

s223:Coil a s223:Class,
        sh:NodeShape ;
    rdfs:label "Coil"^^xsd:string ;
    rdfs:comment """A piece of `Equipment` consisting of a pipe or tube that is formed into a helical or serpentine shape, may or may not be finned, and is used in cooling or heating equipment.

A `Coil` shall conform to exactly one of the following patterns:

- **Pattern 1:**
  - The `Coil` has exactly two inlet connection points using the medium `Mix-Fluid`, with exactly one being `Fluid-Air`.
  - The `Coil` has exactly two outlet connection points using the medium `Mix-Fluid`, with exactly one being `Fluid-Air`.

- **Pattern 2:**
  - The Coil has exactly one inlet connection point using the medium `Mix-Fluid`.
  - The Coil has exactly one outlet connection point using the medium `Mix-Fluid`.
  - The Coil has one or two bidirectional connection points using the medium `Mix-Fluid` or `Medium-ThermalContact`.

- **Pattern 3:**
  - The Coil has exactly three bidirectional connection points using the medium `Mix-Fluid` or `Medium-ThermalContact`."""^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:message "s223: A `Coil` shall fit one of the following patterns of `ConnectionPoint`s: 1: Two inlets and two outlets using the medium `Mix-Fluid`. 2: One inlet and one outlet using the medium `Mix-Fluid`, and one or two bidirectionals using the medium `Mix-Fluid` or `Medium-ThermalContact`. 3: Three bidirectionals using the medium `Mix-Fluid` or `Medium-ThermalContact`."^^xsd:string ;
    sh:xone ( [ sh:property [ rdfs:comment "Pattern 1: For one of the two outlets the Fluid is Air."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMaxCount 1 ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                                sh:path s223:hasMedium ] ] ] ],
                    [ rdfs:comment "Pattern 1: For one of the two inlets the Fluid is Air."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMaxCount 1 ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                                sh:path s223:hasMedium ] ] ] ],
                    [ rdfs:comment "Pattern 1: A `Coil` shall have two inlets using the medium `Mix-Fluid`."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMaxCount 2 ;
                        sh:qualifiedMinCount 2 ;
                        sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Mix-Fluid ;
                                                sh:path s223:hasMedium ] ] ] ],
                    [ rdfs:comment "Pattern 1: A `Coil` shall have two outlets using the medium `Mix-Fluid`."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMaxCount 2 ;
                        sh:qualifiedMinCount 2 ;
                        sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Mix-Fluid ;
                                                sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "Pattern 2: A `Coil` shall have one or two bidirectionals using the medium `Mix-Fluid` or `Medium-ThermalContact`."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMaxCount 2 ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ;
                                sh:node [ sh:property [ sh:or ( [ sh:class s223:Mix-Fluid ] [ sh:class s223:Medium-ThermalContact ] ) ;
                                                sh:path s223:hasMedium ] ] ] ;
                        sh:qualifiedValueShapesDisjoint true ],
                    [ rdfs:comment "Pattern 2: A `Coil` shall have one inlet using the medium `Mix-Fluid`."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMaxCount 1 ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Mix-Fluid ;
                                                sh:path s223:hasMedium ] ] ] ],
                    [ rdfs:comment "Pattern 2: A `Coil` shall have one outlet using the medium `Mix-Fluid`."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMaxCount 1 ;
                        sh:qualifiedMinCount 1 ;
                        sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                                sh:node [ sh:property [ sh:class s223:Mix-Fluid ;
                                                sh:path s223:hasMedium ] ] ] ] ] [ sh:property [ rdfs:comment "Pattern 3: A `Coil` shall have three bidirectionals using the medium `Mix-Fluid` or `Medium-ThermalContact`."^^xsd:string ;
                        sh:path s223:hasConnectionPoint ;
                        sh:qualifiedMaxCount 3 ;
                        sh:qualifiedMinCount 3 ;
                        sh:qualifiedValueShape [ sh:class s223:BidirectionalConnectionPoint ;
                                sh:node [ sh:property [ sh:or ( [ sh:class s223:Mix-Fluid ] [ sh:class s223:Medium-ThermalContact ] ) ;
                                                sh:path s223:hasMedium ] ] ] ;
                        sh:qualifiedValueShapesDisjoint true ] ] ) .

s223:DC-12V a s223:Class,
        s223:DC-12V,
        sh:NodeShape ;
    rdfs:label "12 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-12V ;
    rdfs:comment """This class and its enumerated subclasses represent all polarities of 12 volt DC electricity.

: DC-12V Enumerations

| Enumeration |
|:-----------|
| `12V-6V-Neg-6V-Pos` |
| `12V-12V-Neg` |
| `12V-12V-Pos` |"""^^xsd:string ;
    rdfs:subClassOf s223:Electricity-DC .

s223:DC-24V a s223:Class,
        s223:DC-24V,
        sh:NodeShape ;
    rdfs:label "24 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-24V ;
    rdfs:comment """This class and its enumerated subclasses represent all polarities of 24 volt DC electricity.

: DC-24V Enumerations

| Enumeration |
|:-----------|
| `24V-12V-Neg-12V-Pos` |
| `24V-24V-Neg` |
| `24V-24V-Pos` |"""^^xsd:string ;
    rdfs:subClassOf s223:Electricity-DC .

s223:DC-380V a s223:Class,
        s223:DC-380V,
        sh:NodeShape ;
    rdfs:label "380 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-380V ;
    rdfs:comment """This class and its enumerated subclasses represent all polarities of 380 volt DC electricity.

: DC-380V Enumerations

| Enumeration |
|:-----------|
| `380V-190V-Neg-190V-Pos` |
| `380V-380V-Neg` |
| `380V-380V-Pos` |"""^^xsd:string ;
    rdfs:subClassOf s223:Electricity-DC .

s223:DC-48V a s223:Class,
        s223:DC-48V,
        sh:NodeShape ;
    rdfs:label "48 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-48V ;
    rdfs:comment """This class and its enumerated subclasses represent all polarities of 48 volt DC electricity.

: DC-48V Enumerations

| Enumeration |
|:-----------|
| `48V-24V-Neg-24V-Pos` |
| `48V-48V-Neg` |
| `48V-48V-Pos` |"""^^xsd:string ;
    rdfs:subClassOf s223:Electricity-DC .

s223:DC-5V a s223:Class,
        s223:DC-5V,
        sh:NodeShape ;
    rdfs:label "5 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-5V ;
    rdfs:comment """This class and its enumerated subclasses represent all polarities of 5 volt DC electricity.

: DC-5V Enumerations

| Enumeration |
|:-----------|
| `5V-2.5V-Neg-2.5V-Pos` |
| `5V-5V-Neg` |
| `5V-5V-Pos` |"""^^xsd:string ;
    rdfs:subClassOf s223:Electricity-DC .

s223:DC-6V a s223:Class,
        s223:DC-6V,
        sh:NodeShape ;
    rdfs:label "6 VDC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-6V ;
    rdfs:comment """This class and its enumerated subclasses represent all polarities of 6 volt DC electricity.

: DC-6V Enumerations

| Enumeration |
|:-----------|
| `6V-3V-Neg-3V-Pos` |
| `6V-6V-Neg` |
| `6V-6V-Pos` |"""^^xsd:string ;
    rdfs:subClassOf s223:Electricity-DC .

s223:EnumerationKind-Numerical a s223:Class,
        s223:EnumerationKind-Numerical,
        sh:NodeShape ;
    rdfs:label "Numerical"^^xsd:string ;
    qudt:hasQuantityKind quantitykind:Unknown ;
    qudt:hasUnit unit:UNKNOWN ;
    rdfs:comment """
Numerical enumeration kinds are used to support the definitions of the
`Constituent-Electricity`. The enumerations instances in these classes have names that
are recognizable by humans but are just a string for a computer application. To
avoid the need to parse strings, each of these `EnumerationKind`s have
relations with the `EnumerationKind`s that represent electrical
phase, voltage, and frequency. The purpose of these properties is to enable a
machine to query them and obtain the same information that a person would
associate with the string.
"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind ;
    sh:property [ rdfs:comment "An `EnumerationKind-Numerical` shall be associated with exactly one `Unit` using the relation `qudt:hasUnit`."^^xsd:string ;
            sh:class qudt:Unit ;
            sh:maxCount 1 ;
            sh:message "s223: An `EnumerationKind-Numerical` shall be associated with exactly one `Unit` using the relation `qudt:hasUnit`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path qudt:hasUnit ],
        [ rdfs:comment "An `EnumerationKind-Numerical` shall be associated with at most one decimal value using the relation `hasValue`."^^xsd:string ;
            sh:datatype xsd:decimal ;
            sh:maxCount 1 ;
            sh:message "s223: An `EnumerationKind-Numerical` shall be associated with at most one decimal value using the relation `hasValue`."^^xsd:string ;
            sh:path s223:hasValue ],
        [ rdfs:comment "An `EnumerationKind-Numerical` shall be associated with exactly one `QuantityKind` using the relation `qudt:hasQuantityKind`."^^xsd:string ;
            sh:class qudt:QuantityKind ;
            sh:maxCount 1 ;
            sh:message "s223: An `EnumerationKind-Numerical` shall be associated with exactly one `QuantityKind` using the relation `qudt:hasQuantityKind`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path qudt:hasQuantityKind ] .

s223:Function a s223:Class,
        sh:NodeShape ;
    rdfs:label "Function"^^xsd:string ;
    rdfs:comment "A `Function` is used to model transfer and/or transformation of information (i.e., `Property`). It has relations to input Properties and output Properties. The actual algorithms that perform the transformations are described in CDL and are out of scope of the 223 standard."^^xsd:string ;
    rdfs:subClassOf s223:Concept ;
    sh:property [ rdfs:comment "A `Function` shall be associated with zero or more input `Property`s using the relation `hasInput`."^^xsd:string ;
            sh:class s223:Property ;
            sh:message "s223: A `Function` shall be associated with zero or more input `Property`s using the relation `hasInput`."^^xsd:string ;
            sh:path s223:hasInput ],
        [ rdfs:comment "A `Function` shall be associated with zero or more output `Property`s using the relation `hasOutput`."^^xsd:string ;
            sh:class s223:Property ;
            sh:message "s223: A `Function` shall be associated with zero or more output `Property`s using the relation `hasOutput`."^^xsd:string ;
            sh:path s223:hasOutput ] .

s223:HeatPump a s223:Class,
        sh:NodeShape ;
    rdfs:label "Heat pump"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that heats or cools spaces by transferring thermal energy from one thermal environment to another using a reversible refrigeration cycle."^^xsd:string ;
    rdfs:subClassOf s223:Equipment .

s223:Junction a s223:Class,
        sh:NodeShape ;
    rdfs:label "Junction"^^xsd:string ;
    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`, or when a modeler wants to expose a branch point within a containing piece of `Equipment`.
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 connection points.

`Junction` is a subclass of `Connectable`, which gives it the ability to have connection points, but unlike `Equipment` (and like `Connection`)
it is not allowed to change the `Substance-Medium` that passes through it. This is why `Junction` is a sibling class to `Equipment` and not a subclass.
This constraint to maintain compatible mediums among a `Junction` and all of its associated `ConnectionPoint`s gives rise to multiple
validation test cases, where the specified medium might be a pure medium, or a mixture with constituents (see {s223:Substance-Medium})."""^^xsd:string ;
    rdfs:subClassOf s223:Connectable ;
    sh:property [ rdfs:comment "Incompatible Medium. Case 2: A `Junction` with constituents and an associated `ConnectionPoint` with a pure medium."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 2: A `Junction` with constituents and an associated `ConnectionPoint` with a pure medium."^^xsd:string ;
                    sh:message "s223: `Junction` {$this} with Medium {?m2} is incompatible with {?cp} with Medium {?m1}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?m2 ?cp ?m1
WHERE {
$this s223:cnx ?cp .
?cp a/rdfs:subClassOf* s223:ConnectionPoint .
?cp s223:hasMedium ?m1 .
$this s223:hasMedium ?m2 .
?m2 s223:composedOf/s223:ofConstituent ?s2 .
FILTER NOT EXISTS {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {
  ?m2 s223:composedOf/s223:ofConstituent ?s12 .
  {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} .
}
}
"""^^xsd:string ] ],
        [ rdfs:comment "Incompatible Medium. Case 6: Two `ConnectionPoint`s, one with a medium with constituents and one a pure medium."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 6: Two `ConnectionPoint`s with a medium with constituents and a pure medium."^^xsd:string ;
                    sh:message "s223: {?cp1} with Medium {?m1} is incompatible with {?cp2} with Medium {?m2}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?cp1 ?m1 ?cp2 ?m2
WHERE {
$this s223:cnx ?cp1 .
?cp1 a/rdfs:subClassOf* s223:ConnectionPoint .
?cp1 s223:hasMedium ?m1 .
$this s223:cnx ?cp2 .
?cp2 a/rdfs:subClassOf* s223:ConnectionPoint .
?cp2 s223:hasMedium ?m2 .
?m2 s223:composedOf/s223:ofConstituent ?s2 .
FILTER NOT EXISTS {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {
  ?m2 s223:composedOf/s223:ofConstituent ?s12 .
  {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} .
}
}
"""^^xsd:string ] ],
        [ rdfs:comment "Incompatible Medium. Case 7: Two `ConnectionPoint`s with mediums with constituents."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 7: Two `ConnectionPoint`s with mediums with constituents."^^xsd:string ;
                    sh:message "s223: {?cp1} with Medium {?m1} is incompatible with {?cp2} with Medium {?m2}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?cp1 ?m1 ?cp2 ?m2
WHERE {
$this s223:cnx ?cp1 .
?cp1 a/rdfs:subClassOf* s223:ConnectionPoint .
?cp1 s223:hasMedium ?m1 .
$this s223:cnx ?cp2 .
?cp2 a/rdfs:subClassOf* s223:ConnectionPoint .
?cp2 s223:hasMedium ?m2 .
    ?m1 s223:composedOf/s223:ofConstituent ?s1 .
    ?m2 s223:composedOf/s223:ofConstituent ?s2 .
  FILTER NOT EXISTS {
    ?m1 s223:composedOf/s223:ofConstituent ?s11 .
    ?m2 s223:composedOf/s223:ofConstituent ?s12 .
    FILTER (?s11 = ?s12) .
  }
  FILTER NOT EXISTS {
    ?m1 s223:composedOf/s223:ofConstituent ?s21 .
    ?m2 s223:composedOf/s223:ofConstituent ?s22 .
    {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} .
  }
}
"""^^xsd:string ] ],
        [ rdfs:comment "Incompatible Medium. Case5: Two `ConnectionPoint`s with pure mediums."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 5: Two `ConnectionPoint`s with pure mediums."^^xsd:string ;
                    sh:message "s223: {?cp1} with Medium {?m1} is incompatible with {?cp2} with Medium {?m2}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?cp1 ?m1 ?cp2 ?m2
WHERE {
$this s223:cnx ?cp1 .
?cp1 a/rdfs:subClassOf* s223:ConnectionPoint .
?cp1 s223:hasMedium ?m1 .
$this s223:cnx ?cp2 .
?cp2 a/rdfs:subClassOf* s223:ConnectionPoint .
FILTER (?cp1 != ?cp2 ) .
?cp2 s223:hasMedium ?m2 .
FILTER (?m1 != ?m2 ) .
FILTER NOT EXISTS {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {?m2 s223:composedOf ?c2}
FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) .
FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Junction` shall be associated with at least two connection points using the relation `hasConnectionPoint`."^^xsd:string ;
            sh:message "s223: A `Junction` shall be associated with at least two connection points using the relation `hasConnectionPoint`."^^xsd:string ;
            sh:minCount 2 ;
            sh:path s223:hasConnectionPoint ],
        [ rdfs:comment "Incompatible Medium. Case 3: `Junction` with a pure medium and an associated `ConnectionPoint` with constituents"^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 3: `Junction` with a pure medium and an associated `ConnectionPoint` with constituents."^^xsd:string ;
                    sh:message "s223: `Junction` {$this} with Medium {?m1} is incompatible with {?cp} with Medium {?m2}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?m2 ?cp ?m1
WHERE {
$this s223:cnx ?cp .
?cp a/rdfs:subClassOf* s223:ConnectionPoint .
?cp s223:hasMedium ?m2 .
$this s223:hasMedium ?m1 .
?m2 s223:composedOf/s223:ofConstituent ?s2 .
FILTER NOT EXISTS {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {
  ?m2 s223:composedOf/s223:ofConstituent ?s12 .
  {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} .
}
}
"""^^xsd:string ] ],
        [ rdfs:comment "Incompatible Medium. Case1: A `Junction` with a pure medium and an associated `ConnectionPoint` with a pure medium."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 1: Two pure mediums."^^xsd:string ;
                    sh:message "s223: `Junction` {$this} with Medium {?m2} is incompatible with {?cp} with Medium {?m1}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?m2 ?cp ?m1
WHERE {
$this s223:cnx ?cp .
?cp a/rdfs:subClassOf* s223:ConnectionPoint .
?cp s223:hasMedium ?m1 .
$this s223:hasMedium ?m2 .
FILTER (?m1 != ?m2 ) .
FILTER NOT EXISTS {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {?m2 s223:composedOf ?c2}
FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) .
FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Junction` shall be associated with exactly one `Substance-Medium` using the relation `hasMedium`."^^xsd:string ;
            sh:class s223:Substance-Medium ;
            sh:maxCount 1 ;
            sh:message "s223: A `Junction` shall be associated with exactly one `Substance-Medium` using the relation `hasMedium`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasMedium ],
        [ rdfs:comment "Incompatible Medium. Case4: `Junction` with constituents and an associated `ConnectionPoint` with constituents."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 4: `Junction` with constituents and an associated `ConnectionPoint` with constituents."^^xsd:string ;
                    sh:message "s223: `Junction` {$this} with Medium {?m2} is incompatible with {?cp} with Medium {?m1}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?m2 ?cp ?m1
WHERE {
$this s223:cnx ?cp .
?cp a/rdfs:subClassOf* s223:ConnectionPoint .
?cp s223:hasMedium ?m1 .
$this s223:hasMedium ?m2 .
    ?m1 s223:composedOf/s223:ofConstituent ?s1 .
    ?m2 s223:composedOf/s223:ofConstituent ?s2 .
  FILTER NOT EXISTS {
    ?m1 s223:composedOf/s223:ofConstituent ?s11 .
    ?m2 s223:composedOf/s223:ofConstituent ?s12 .
    FILTER (?s11 = ?s12) .
  }
  FILTER NOT EXISTS {
    ?m1 s223:composedOf/s223:ofConstituent ?s21 .
    ?m2 s223:composedOf/s223:ofConstituent ?s22 .
    {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} .
  }
}
"""^^xsd:string ] ] .

s223:Medium-ThermalContact a s223:Class,
        s223:Medium-ThermalContact,
        sh:NodeShape ;
    rdfs:label "Thermal contact"^^xsd:string ;
    rdfs:comment """This class supports the transfer of thermodynamic energy at `ConnectionPoint`s or through `Connection`s
that does not involve electricity or moving a fluid such as air or water."""^^xsd:string ;
    rdfs:subClassOf s223:Substance-Medium .

s223:Occupancy-Motion a s223:Class,
        s223:Occupancy-Motion,
        sh:NodeShape ;
    rdfs:label "Motion-based occupancy"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent the detection of human motion in a space.

: Occupancy-Motion Enumerations

| Enumeration |
|:-----------|
| `Motion-False` |
| `Motion-True` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Occupancy .

s223:Occupancy-Presence a s223:Class,
        s223:Occupancy-Presence,
        sh:NodeShape ;
    rdfs:label "Presence-based occupancy"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent the detection of human presence in a space.

: Occupancy-Presence Enumerations

| Enumeration |
|:-----------|
| `Presence-False` |
| `Presence-True` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Occupancy .

s223:Signal-Modulated a s223:Class,
        s223:Signal-Modulated,
        sh:NodeShape ;
    rdfs:label "Modulated signal"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent common analog communication protocols.

: Signal-Modulated Enumerations

| Enumeration |
|:-----------|
| `Modulated-0-10V` |
| `Modulated-4-20mA` |
| `Modulated-Resistive` |"""^^xsd:string ;
    rdfs:subClassOf s223:Electricity-Signal .

s223:Signal-USB a s223:Class,
        s223:Signal-USB,
        sh:NodeShape ;
    rdfs:label "USB"^^xsd:string ;
    rdfs:comment "Signal-USB"^^xsd:string ;
    rdfs:subClassOf s223:Electricity-Signal .

s223:Voltage-110V a s223:Class,
        s223:Voltage-110V,
        sh:NodeShape ;
    rdfs:label "110 V"^^xsd:string ;
    s223:hasValue 110.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-110V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-127V a s223:Class,
        s223:Voltage-127V,
        sh:NodeShape ;
    rdfs:label "127 V"^^xsd:string ;
    s223:hasValue 127.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-127V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-139V a s223:Class,
        s223:Voltage-139V,
        sh:NodeShape ;
    rdfs:label "139 V"^^xsd:string ;
    s223:hasValue 139.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-139V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-1730V a s223:Class,
        s223:Voltage-1730V,
        sh:NodeShape ;
    rdfs:label "1730 V"^^xsd:string ;
    s223:hasValue 1730.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-1730V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-1900V a s223:Class,
        s223:Voltage-1900V,
        sh:NodeShape ;
    rdfs:label "1900 V"^^xsd:string ;
    s223:hasValue 1900.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-1900V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-219V a s223:Class,
        s223:Voltage-219V,
        sh:NodeShape ;
    rdfs:label "219 V"^^xsd:string ;
    s223:hasValue 219.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-219V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-230V a s223:Class,
        s223:Voltage-230V,
        sh:NodeShape ;
    rdfs:label "230 V"^^xsd:string ;
    s223:hasValue 230.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-230V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-2400V a s223:Class,
        s223:Voltage-2400V,
        sh:NodeShape ;
    rdfs:label "2400 V"^^xsd:string ;
    s223:hasValue 2400.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-2400V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-277V a s223:Class,
        s223:Voltage-277V,
        sh:NodeShape ;
    rdfs:label "277 V"^^xsd:string ;
    s223:hasValue 277.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-277V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-3460V a s223:Class,
        s223:Voltage-3460V,
        sh:NodeShape ;
    rdfs:label "3460 V"^^xsd:string ;
    s223:hasValue 3460.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-3460V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-347V a s223:Class,
        s223:Voltage-347V,
        sh:NodeShape ;
    rdfs:label "347 V"^^xsd:string ;
    s223:hasValue 347.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-347V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-3810V a s223:Class,
        s223:Voltage-3810V,
        sh:NodeShape ;
    rdfs:label "3810 V"^^xsd:string ;
    s223:hasValue 3810.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-3810V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-5770V a s223:Class,
        s223:Voltage-5770V,
        sh:NodeShape ;
    rdfs:label "5770 V"^^xsd:string ;
    s223:hasValue 5770.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-5770V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:hasInternalReference a s223:RelationWithInverse,
        rdf:Property ;
    rdfs:label "has internal reference"^^xsd:string ;
    s223:inverseOf s223:isInternalReferenceOf ;
    rdfs:comment """A `Relation` that associates a `Property` with another equivalent `Property`. For example, a `Property` that represents a `Zone`
temperature could have at most one `hasInternalReference` relation to another `Property` that is a temperature measurement from one room in the zone (see Figure 11-2).

![Zone Internal Reference.](figures/Figure_11-2_Zone_Internal_Reference.svg)

Another use of `hasInternalReference` is to make a `Property` of a piece of equipment
visible as a `Property` of a piece of containing equipment.
This is illustrated in Figure 11-3.

![Equipment Containment.](figures/Figure_11-3_Equipment_Contains_3.svg)

Note that the hasInternalReference relation is transitive."""^^xsd:string .

s223:ActuatableProperty a s223:Class,
        sh:NodeShape ;
    rdfs:label "Actuatable property"^^xsd:string ;
    rdfs:comment """The term "actuatable" implies that writing to the `ActuatableProperty` value will directly trigger a physical actuation by either an `Actuator` or `Equipment`.
In contrast, the term "observable" (see {s223:ObservableProperty}) implies that reading the `ObservableProperty` value will return the result of a physical observation."""^^xsd:string ;
    rdfs:subClassOf s223:Property .

s223:Binary-OnOff a s223:Binary-OnOff,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "On/off"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent basic operational states i.e., On and Off.

: Binary-OnOff Enumerations

| Enumeration |
|:-----------|
| `OnOff-Off` |
| `OnOff-On` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Binary .

s223:Constituent-Glycol a s223:Class,
        s223:Constituent-Glycol,
        sh:NodeShape ;
    rdfs:label "Glycol"^^xsd:string ;
    rdfs:comment "`Constituent-Glycol`"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:Damper a s223:Class,
        sh:NodeShape ;
    rdfs:label "Damper"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` inserted into an air distribution system permitting modification of the air resistance of the system and consequently changing the airflow rate or shutting off the airflow."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Damper` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `Damper` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `Damper` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `Damper` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:EnumeratedActuatableProperty a s223:Class,
        sh:NodeShape ;
    rdfs:label "Enumerated actuatable property"^^xsd:string ;
    rdfs:comment "An `EnumeratedActuatableProperty` is a `Property` with an enumerated (fixed) set of possible values that can be changed (actuated)."^^xsd:string ;
    rdfs:subClassOf s223:ActuatableProperty,
        s223:EnumerableProperty .

s223:EnumeratedObservableProperty a s223:Class,
        sh:NodeShape ;
    rdfs:label "Enumerated observable property"^^xsd:string ;
    rdfs:comment "An `EnumeratedObservableProperty` is a `Property` with an enumerated (fixed) set of possible values that cannot be changed (can only be observed)."^^xsd:string ;
    rdfs:subClassOf s223:EnumerableProperty,
        s223:ObservableProperty .

s223:EnumerationKind-Occupancy a s223:Class,
        s223:EnumerationKind-Occupancy,
        sh:NodeShape ;
    rdfs:label "Occupancy"^^xsd:string ;
    rdfs:comment "This class and its enumerated subclasses represent the occupancy status of a space within a building, i.e., the state of being occupied by a human being. The `Occupancy-Motion` and `Occupancy-Presence` subclasses are associated with specific characteristics of occupancy and associated means of detection, while the `Occupancy-Occupied` subclass is generic, in that it is not associated with a specific characteristic or occupancy or associated means of detection."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind .

s223:EnumerationKind-Substance a s223:Class,
        s223:EnumerationKind-Substance,
        sh:NodeShape ;
    rdfs:label "Substance"^^xsd:string ;
    rdfs:comment """
This class and its enumerated subclasses represent things that are produced, conveyed, sensed, controlled, or consumed.  Its enumerated subclasses differentate between mediums, particulates, and soot.

: EnumerationKind-Substance Enumerations

| Enumeration |
|:-----------|
| `Substance-Medium` (see {s223:Substance-Medium}) |
| `Substance-Particulate` (see {s223:Substance-Particulate}) |
| `Substance-Soot` (see {s223:Substance-Soot}) |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind ;
    sh:property [ rdfs:comment "If a substance has a constituent, that constituent may not itself have constituents."^^xsd:string ;
            sh:path s223:composedOf ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "If a substance has a constituent, that constituent may not itself have constituents."^^xsd:string ;
                    sh:message "s223: This substance {$this} has a constituent {?constituent} that itself is composed of {?nextConstituent}. Create new substance with only atomic constituents."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?constituent ?nextConstituent
WHERE {
$this s223:composedOf/s223:ofConstituent ?constituent .
?constituent s223:composedOf/s223:ofConstituent ?nextConstituent .
}
"""^^xsd:string ] ] .

s223:Fan a s223:Class,
        sh:NodeShape ;
    rdfs:label "Fan"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that causes a gas (e.g., air) to flow."^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "A `Fan` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `Fan` shall have at least one outlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:OutletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ],
        [ rdfs:comment "A `Fan` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:message "s223: A `Fan` shall have at least one inlet using the medium `Fluid-Air`."^^xsd:string ;
            sh:path s223:hasConnectionPoint ;
            sh:qualifiedMinCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:InletConnectionPoint ;
                    sh:node [ sh:property [ sh:class s223:Fluid-Air ;
                                    sh:path s223:hasMedium ] ] ] ] .

s223:Numerical-Frequency a s223:Class,
        s223:Numerical-Frequency,
        sh:NodeShape ;
    rdfs:label "Frequency"^^xsd:string ;
    qudt:hasQuantityKind quantitykind:Frequency ;
    qudt:hasUnit unit:HZ ;
    rdfs:comment """This class and its enumerated subclasses represent common frequencies for AC electricity service.

: Numerical-Frequency Enumerations

| Enumeration |
|:-----------|
| `Frequency-50Hz` |
| `Frequency-60Hz` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Numerical ;
    sh:property [ rdfs:comment "A `Numerical-Frequency` shall have a `QuantityKind` of `Frequency`."^^xsd:string ;
            sh:in ( quantitykind:Frequency ) ;
            sh:message "s223: A `Numerical-Frequency` shall have a `QuantityKind` of `Frequency`."^^xsd:string ;
            sh:path qudt:hasQuantityKind ],
        [ rdfs:comment "A `Numerical-Frequency` shall have a `Unit` of `HZ` (hertz)."^^xsd:string ;
            sh:in ( unit:HZ ) ;
            sh:message "s223: A `Numerical-Frequency` shall have a `Unit` of `HZ` (hertz)."^^xsd:string ;
            sh:path qudt:hasUnit ] .

s223:Numerical-NumberOfElectricalPhases a s223:Class,
        s223:Numerical-NumberOfElectricalPhases,
        sh:NodeShape ;
    rdfs:label "Number of electrical phases"^^xsd:string ;
    qudt:hasQuantityKind quantitykind:NumberOfElectricalPhases ;
    qudt:hasUnit unit:NUM ;
    rdfs:comment """This class and its enumerated subclasses represent all possible service phases for AC electricity service, i.e., single-phase or three-phase. The `hasNumberOfElectricalPhases` relation points to one of the values of this enumeration.

: Numerical-NumberOfElectricalPhases Enumerations

| Enumeration |
|:-----------|
| `NumberOfElectricalPhases-SinglePhase` |
| `NumberOfElectricalPhases-ThreePhase` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Numerical .

s223:QuantifiableActuatableProperty a s223:Class,
        sh:NodeShape ;
    rdfs:label "Quantifiable actuatable property"^^xsd:string ;
    rdfs:comment "This class is for instances of `QuantifiableProperty` for which numerical values are specified to be modifiable by a user or a machine outside of the model, like a setpoint."^^xsd:string ;
    rdfs:subClassOf s223:ActuatableProperty,
        s223:QuantifiableProperty .

s223:QuantifiableObservableProperty a s223:Class,
        sh:NodeShape ;
    rdfs:label "Quantifiable observable property"^^xsd:string ;
    rdfs:comment "This class is for instances of `QuantifiableProperty` for which numerical values are observed, like a temperature reading or a voltage measure."^^xsd:string ;
    rdfs:subClassOf s223:ObservableProperty,
        s223:QuantifiableProperty .

s223:Voltage-10000V a s223:Class,
        s223:Voltage-10000V,
        sh:NodeShape ;
    rdfs:label "10000 V"^^xsd:string ;
    s223:hasValue 10000.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-10000V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-220V a s223:Class,
        s223:Voltage-220V,
        sh:NodeShape ;
    rdfs:label "220 V"^^xsd:string ;
    s223:hasValue 220.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-220V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-3000V a s223:Class,
        s223:Voltage-3000V,
        sh:NodeShape ;
    rdfs:label "3000 V"^^xsd:string ;
    s223:hasValue 3000.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-3000V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-3300V a s223:Class,
        s223:Voltage-3300V,
        sh:NodeShape ;
    rdfs:label "3300 V"^^xsd:string ;
    s223:hasValue 3300.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-3300V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-400V a s223:Class,
        s223:Voltage-400V,
        sh:NodeShape ;
    rdfs:label "400 V"^^xsd:string ;
    s223:hasValue 400.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-400V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-415V a s223:Class,
        s223:Voltage-415V,
        sh:NodeShape ;
    rdfs:label "415 V"^^xsd:string ;
    s223:hasValue 415.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-415V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-4160V a s223:Class,
        s223:Voltage-4160V,
        sh:NodeShape ;
    rdfs:label "4160 V"^^xsd:string ;
    s223:hasValue 4160.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-4160V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-480V a s223:Class,
        s223:Voltage-480V,
        sh:NodeShape ;
    rdfs:label "480 V"^^xsd:string ;
    s223:hasValue 480.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-480V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-6000V a s223:Class,
        s223:Voltage-6000V,
        sh:NodeShape ;
    rdfs:label "6000 V"^^xsd:string ;
    s223:hasValue 6000.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-6000V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-600V a s223:Class,
        s223:Voltage-600V,
        sh:NodeShape ;
    rdfs:label "600 V"^^xsd:string ;
    s223:hasValue 600.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-600V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-6600V a s223:Class,
        s223:Voltage-6600V,
        sh:NodeShape ;
    rdfs:label "6600 V"^^xsd:string ;
    s223:hasValue 6600.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-6600V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:connectsAt a s223:RelationWithInverse,
        rdf:Property ;
    rdfs:label "connects at"^^xsd:string ;
    s223:inverseOf s223:connectsThrough ;
    rdfs:comment "A `Relation` that associates a `Connection` with a specific `ConnectionPoint`."^^xsd:string .

s223:hasDomain a s223:Relation,
        rdf:Property ;
    rdfs:label "has domain"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Zone` or `DomainSpace` with an `EnumerationKind-Domain` (e.g., `Domain-HVAC`, `Domain-Lighting`)."^^xsd:string .

s223:hasReferenceLocation a s223:Relation,
        rdf:Property ;
    rdfs:label "has reference location"^^xsd:string ;
    rdfs:comment "A `Relation` that associates  a differential sensor with the topological location of the baseline (reference) `Property` (see {s223:observes})."^^xsd:string .

s223:hasValue a s223:Relation,
        rdf:Property ;
    rdfs:label "has value"^^xsd:string ;
    rdfs:comment "A `Relation` that associates something with a fixed value, as opposed to a computed, measured, or externally derived value."^^xsd:string .

s223:Constituent-EM a s223:Class,
        s223:Constituent-EM,
        sh:NodeShape ;
    rdfs:label "EM"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent electromagnetic energy at commonly defined frequency ranges.

: Constituent-EM Enumerations

| Enumeration |
|:-----------|
| `EM-Light` (see {s223:EM-Light}) |
| `EM-Microwave` |
| `EM-RF` (see {s223:EM-RF}) |"""^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:DayOfWeek-Weekday a s223:Class,
        s223:DayOfWeek-Weekday,
        sh:NodeShape ;
    rdfs:label "Weekday"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent weekdays according to the Gregorian calendar, i.e., Monday, Tuesday, Wednesday, Thursday, and Friday.

: DayOfWeek-Weekday Enumerations

| Enumeration |
|:-----------|
| `Weekday-Friday` |
| `Weekday-Monday` |
| `Weekday-Thursday` |
| `Weekday-Tuesday` |
| `Weekday-Wednesday` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-DayOfWeek .

s223:EnumerationKind-ThermodynamicPhase a s223:Class,
        s223:EnumerationKind-ThermodynamicPhase,
        sh:NodeShape ;
    rdfs:label "Thermodynamic phase"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent thermodynamic phases, also referred to as states of matter.

: EnumerationKind-ThermodynamicPhase Enumerations

| Enumeration |
|:-----------|
| `ThermodynamicPhase-Gas` (see {s223:ThermodynamicPhase-Gas}) |
| `ThermodynamicPhase-Liquid` (see {s223:ThermodynamicPhase-Liquid}) |
| `ThermodynamicPhase-Solid` |
| `ThermodynamicPhase-Vapor` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind .

s223:Role-Cooling a s223:Class,
        s223:Role-Cooling,
        sh:NodeShape ;
    rdfs:label "Cooling role"^^xsd:string ;
    rdfs:comment "`Role-Cooling`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:Substance-Particulate a s223:Class,
        s223:Substance-Particulate,
        sh:NodeShape ;
    rdfs:label "Particulate"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent common size thresholds of interest for particulate matter that is suspended in a
medium in a way that maintains the physical and chemical properties of the medium.

![Particulate Concentration](figures/Figure_x-y_Particulate_Concentration.svg)

Figure 10-9 shows an instance of a `Connection` with `hasMedium` referencing
`Fluid-Air` that has a `Property` _Particulate Concentration_ of particles with a
diameter of 2.5 micrometres (0.0025 mm) or smaller in units of micrograms per
cubic meter.

![Carbon Monoxide Concentration](figures/Figure_x-y_Medium_Concentration.svg)

Figure 10-10 shows an instance of a `Property` _CO Concentration_ with `ofSubstance`
referencing carbon monoxide `Constituent-CO` and `ofMedium` referencing `Fluid-Air`
measured in parts-per-million.  This figure also shows that the value of this
`Property` can be obtained by using the BACnet protocol via the external reference
to get the `present-value` of `analog-value,67` in the device with an instance
number `12345`.

: Substance-Particulate Enumerations

| Enumeration |
|:-----------|
| `Particulate-PM1.0` |
| `Particulate-PM2.5` |
| `Particulate-PM10.0` |
| `Particulate-Smoke` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Substance .

s223:Voltage-PoE a s223:Class,
        s223:Voltage-PoE,
        sh:NodeShape ;
    rdfs:label "PoE voltage"^^xsd:string ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "This class represents the standardized 44-57VDC range that is produced by PoE Power Sourcing Equipment"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:cnx a s223:SymmetricRelation,
        rdf:Property ;
    rdfs:label "cnx"^^xsd:string ;
    rdfs:comment "A `Relation` that associates adjacent entities in a connection path, comprised of Equipment-ConnectionPoint-Connection-ConnectionPoint-Equipment sequences."^^xsd:string .

s223:connectedTo a s223:RelationWithInverse,
        rdf:Property ;
    rdfs:label "connected to"^^xsd:string ;
    s223:inverseOf s223:connectedFrom ;
    rdfs:comment "The relation `connectedTo` indicates that connectable things are `connected` with a specific direction of flow. A is `connectedTo` B, means a direction of flow from A to B.  The inverse direction is indicated by `connectedFrom` (see {s223:connectedFrom})."^^xsd:string .

s223:ofConstituent a s223:Relation,
        rdf:Property ;
    rdfs:label "of constituent"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Property` that characterizes a `Medium-Mix` with one of the constituents of that mix. (e.g., `Fluid-Water` `composedOf` `Property` `ofConstituent` `Constituent-H2O`."^^xsd:string .

s223:DC-PoE a s223:Class,
        s223:DC-PoE,
        sh:NodeShape ;
    rdfs:label "PoE electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Voltage-PoE ;
    rdfs:comment """This class and its enumerated subclasses represent standardized types of PoE DC electricity.

: DC-PoE Enumerations

| Enumeration |
|:-----------|
| `PoE-802.3af-1` |
| `PoE-802.3at-2` |
| `PoE-802.3bt-3` |
| `PoE-802.3bt-4` |"""^^xsd:string ;
    rdfs:subClassOf s223:Electricity-DC .

s223:FiberOpticCable a s223:Class,
        sh:NodeShape ;
    rdfs:label "Fiber optic cable"^^xsd:string ;
    rdfs:comment """A type of `Waveguide` that consists of thin, flexible strands of glass or plastic fibers that transmit data as pulses of light and is used for `Signal-FiberEthernet` or `Wideband-CATV` communication. Subclasses of `FiberOpticCable` represent common types used in buildings.

: FiberOpticCable Subclasses

| Subclass |
|:-----------|
| `FiberOpticCable-OM1` |
| `FiberOpticCable-OM2` |
| `FiberOpticCable-OM3` |
| `FiberOpticCable-OM4` |
| `FiberOpticCable-OM5` |
| `FiberOpticCable-OS1` |
| `FiberOpticCable-OS2` |"""^^xsd:string ;
    rdfs:subClassOf s223:Waveguide ;
    sh:property [ rdfs:comment "A `FiberOpticCable` shall be associated with exactly one `Signal-FiberEthernet` or `Wideband-CATV` using the relation `hasMedium`."^^xsd:string ;
            sh:maxCount 1 ;
            sh:message "s223: A `FiberOpticCable` shall be associated with exactly one `Signal-FiberEthernet` or `Wideband-CATV` using the relation `hasMedium`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasMedium ;
            sh:xor ( [ sh:class s223:Signal-FiberEthernet ] [ sh:class s223:Wideband-CATV ] ) ] .

s223:Role-Heating a s223:Class,
        s223:Role-Heating,
        sh:NodeShape ;
    rdfs:label "Heating role"^^xsd:string ;
    rdfs:comment "`Role-Heating`"^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Role .

s223:UHF-ISMBand a s223:Class,
        s223:UHF-ISMBand,
        sh:NodeShape ;
    rdfs:label "ISM band"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent communication protocols that use radio frequencies that are reserved internationally for license-free support of Industrial, Scientific, and Medical applications.

: UHF-ISMBand Enumerations

| Enumeration |
|:-----------|
| `ISMBand-BluetoothLE` |
| `ISMBand-IEEE802.11` |
| `ISMBand-IEEE802.15.4` |
| `ISMBand-LoRaWAN` |
| `ISMBand-NFC` |
| `ISMBand-RFID` |"""^^xsd:string ;
    rdfs:subClassOf s223:Signal-UHF .

s223:Voltage-120V a s223:Class,
        s223:Voltage-120V,
        sh:NodeShape ;
    rdfs:label "120 V"^^xsd:string ;
    s223:hasValue 120.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-120V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-190V a s223:Class,
        s223:Voltage-190V,
        sh:NodeShape ;
    rdfs:label "190 V"^^xsd:string ;
    s223:hasValue 190.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-190V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-48V a s223:Class,
        s223:Voltage-48V,
        sh:NodeShape ;
    rdfs:label "48 V"^^xsd:string ;
    s223:hasValue 48.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-48V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-5V a s223:Class,
        s223:Voltage-5V,
        sh:NodeShape ;
    rdfs:label "5 V"^^xsd:string ;
    s223:hasValue 5.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-5V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Zone a s223:Class,
        sh:NodeShape ;
    rdfs:label "Zone"^^xsd:string ;
    rdfs:comment "A logical grouping of one or more `DomainSpace`s or other `Zone`s for some building service or control-related purpose. `Zone`s can have properties that are inputs or outputs to a `Function` (see {s223:Function}), which can be executed by `Controller`s (see {s223:Controller}) or other `Equipment`."^^xsd:string ;
    rdfs:subClassOf s223:Concept ;
    sh:message "s223: A `Zone` shall be associated with at least one `DomainSpace` using the relation `hasDomainSpace` or be associated with at least one `Zone` using the relation `hasZone`."^^xsd:string ;
    sh:or ( [ sh:property [ rdfs:comment "A `Zone` shall be associated with at least one `DomainSpace` using the relation `hasDomainSpace` or be associated with at least one `Zone` using the relation `hasZone`."^^xsd:string ;
                        sh:class s223:DomainSpace ;
                        sh:message "s223: A `Zone` shall be associated with at least one `DomainSpace` using the relation `hasDomainSpace` or be associated with at least one `Zone` using the relation `hasZone`."^^xsd:string ;
                        sh:minCount 1 ;
                        sh:path s223:hasDomainSpace ] ] [ sh:property [ rdfs:comment "A `Zone` shall be associated with at least one `DomainSpace` using the relation `hasDomainSpace` or be associated with at least one `Zone` using the relation `hasZone`."^^xsd:string ;
                        sh:class s223:Zone ;
                        sh:message "s223: A `Zone` shall be associated with at least one `DomainSpace` using the relation `hasDomainSpace` or be associated with at least one `Zone` using the relation `hasZone`."^^xsd:string ;
                        sh:minCount 1 ;
                        sh:path s223:hasZone ] ] ) ;
    sh:property [ rdfs:comment "The associated domain of a `Zone` and the Domain of the `DomainSpace`s it `contains` must be the same."^^xsd:string ;
            sh:message "s223: The associated domain of a `Zone` and the Domain of the `DomainSpace`s it `contains` must be the same."^^xsd:string ;
            sh:path s223:hasDomain ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "The associated `EnumerationKind-Domain` of a `Zone` and the `EnumerationKind-Domain` of the `DomainSpace`s it contains must be the same."^^xsd:string ;
                    sh:message "s223: `Zone` {$this} has a Domain of {?domain}, but it contains a `DomainSpace` {?ds} which has a Domain of {?dsdomain}. These should be the same."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    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)
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Zone` shall be associated with exactly one `EnumerationKind-Domain` using the relation `hasDomain`."^^xsd:string ;
            sh:class s223:EnumerationKind-Domain ;
            sh:maxCount 1 ;
            sh:message "s223: A `Zone` shall be associated with exactly one `EnumerationKind-Domain` using the relation `hasDomain`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasDomain ] .

s223:hasObservationLocation a s223:Relation,
        rdf:Property ;
    rdfs:label "has observation location"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Sensor` with the topological location where it is observing a `Property` (see {s223:observes}). The observation location shall be a `Connectable` (see {s223:Connectable}), `Connection` (see {s223:Connection}), or `ConnectionPoint` (see {s223:ConnectionPoint})."^^xsd:string .

s223:Electricity-Signal a s223:Class,
        s223:Electricity-Signal,
        sh:NodeShape ;
    rdfs:label "Electrical signal"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent the use of electricity for creating communication signals, and common communication protocols.

: Electricity-Signal Enumerations

| Enumeration |
|:-----------|
| `Signal-EIA485` |
| `Signal-IEC14908` |
| `Signal-Modulated` (see {s223:Signal-Modulated}) |
| `Signal-USB` |
| `Signal-WiredEthernet` (see {s223:Signal-WiredEthernet}) |"""^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Electricity .

s223:EnumerationKind-Binary a s223:Class,
        s223:EnumerationKind-Binary,
        sh:NodeShape ;
    rdfs:label "Binary"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent common binary values.

: EnumerationKind-Binary Enumerations

| Enumeration |
|:-----------|
| `Binary-Logical` |
| `Binary-OnOff` |
| `Binary-Position` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind .

s223:Voltage-208V a s223:Class,
        s223:Voltage-208V,
        sh:NodeShape ;
    rdfs:label "208 V"^^xsd:string ;
    s223:hasValue 208.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-208V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Constituent-H2O a s223:Class,
        s223:Constituent-H2O,
        sh:NodeShape ;
    rdfs:label "H2O"^^xsd:string ;
    rdfs:comment "Pure water"^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:EM-Light a s223:Class,
        s223:EM-Light,
        sh:NodeShape ;
    rdfs:label "Light"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent light at commonly defined frequency or wavelength ranges.

: EM-Light Enumerations

| Enumeration |
|:-----------|
| `Light-Infrared` (see {s223:Light-Infrared}) |
| `Light-Ultraviolet` |
| `Light-Visible` |"""^^xsd:string ;
    rdfs:subClassOf s223:Constituent-EM .

s223:Substance-Medium a s223:Class,
        s223:Substance-Medium,
        sh:NodeShape ;
    rdfs:label "Medium"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent substances that facilitate the conveyance of matter, energy, or information.  It is used to qualify `Connection`s and `ConnectionPoint`s with the relation `hasMedium` (see {s223:hasMedium}).

`Substance-Medium` is also the root of the medium hierarchy that is used to ensure compatibility of different medium designations. For example,
`Fluid-Water` and `Water-ChilledWater` are alternative but compatible ways of identifying what is flowing in a pipe, using different degrees of
specificity. `Water-ChilledWater` and `Water-HotWater` are not compatible. Compatibility is determined by testing if one medium is a subclass of the
other. This gets a bit more complicated in the case of mixtures, where at least one of the constituents of a mixture must be compatible with at least one of
the constituents of the other medium.

Testing for medium compatibility is done in the context of entities that have a `hasMedium` relation, such as

* `Connection` and its associated `ConnectionPoint`s. See {s223:Connection}.

* `Junction` and its associated `ConnectionPoint`s See {s223:Junction}.

* `Filter` and its associated `ConnectionPoint`s. See {s223:Filter}.

* Any `Concept` that has a `hasMedium` relation, compared with an associated `Property` with an `ofMedium` relation. See {s223:Concept}.

These tests are listed in the constraint tables for the respective classes listed above, identified as Case 1, Case 2, etc.

: Substance-Medium Enumerations

| Enumeration |
|:-----------|
| `Medium-Constituent` (see {s223:Medium-Constituent}) |
| `Medium-MechanicalLinkage` |
| `Medium-Mix` (see {s223:Medium-Mix}) |
| `Medium-ThermalContact` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Substance .

s223:Valve a s223:Class,
        sh:NodeShape ;
    rdfs:label "Valve"^^xsd:string ;
    rdfs:comment "A piece of `Equipment` that can be adjusted to allow, regulate, or stop the flow of fluid in a pipe or a duct."^^xsd:string ;
    rdfs:subClassOf s223:Equipment .

s223:Voltage-12V a s223:Class,
        s223:Voltage-12V,
        sh:NodeShape ;
    rdfs:label "12 V"^^xsd:string ;
    s223:hasValue 12.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-12V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-6V a s223:Class,
        s223:Voltage-6V,
        sh:NodeShape ;
    rdfs:label "6 V"^^xsd:string ;
    s223:hasValue 6.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-6V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:composedOf a s223:Relation,
        rdf:Property ;
    rdfs:label "composed of"^^xsd:string ;
    rdfs:comment "The relation `composedOf` is used to indicate what substances constitute a material. Allowable values are instances of `Property` that in turn identify constituents defined in `Medium-Constituent` (see {s223:Medium-Constituent}) via the relation `ofConstituent`."^^xsd:string .

s223:hasAspect a s223:Relation,
        rdf:Property ;
    rdfs:label "has aspect"^^xsd:string ;
    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."^^xsd:string .

s223:pairedConnectionPoint a s223:SymmetricRelation ;
    rdfs:label "paired connection point"^^xsd:string ;
    rdfs:comment "A `Relation` that associates two `ConnectionPoint`s where an `InletConnectionPoint` shares the same `Substance-Medium` with an `OutletConnectionPoint`."^^xsd:string .

s223:Binary-Position a s223:Binary-Position,
        s223:Class,
        sh:NodeShape ;
    rdfs:label "Position"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent basic positional states i.e., Closed and Open.

: Binary-Position Enumerations

| Enumeration |
|:-----------|
| `Position-Closed` |
| `Position-Open` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Binary .

s223:EnumerationKind-ElectricalPhaseIdentifier a s223:Class,
        s223:EnumerationKind-ElectricalPhaseIdentifier,
        sh:NodeShape ;
    rdfs:label "Electrical phase identifier"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent all possible electrical phases for AC electricity service.

: EnumerationKind-ElectricalPhaseIdentifier Enumerations

| Enumeration |
|:-----------|
| `ElectricalPhaseIdentifier-A` |
| `ElectricalPhaseIdentifier-AB` |
| `ElectricalPhaseIdentifier-ABC` |
| `ElectricalPhaseIdentifier-B` |
| `ElectricalPhaseIdentifier-BC` |
| `ElectricalPhaseIdentifier-C` |
| `ElectricalPhaseIdentifier-CA` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind .

s223:hasEnumerationKind a s223:Relation,
        rdf:Property ;
    rdfs:label "has enumeration kind"^^xsd:string ;
    rdfs:comment "A `Relation` that 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."^^xsd:string .

s223:mapsTo a s223:Relation,
        rdf:Property ;
    rdfs:label "maps to"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `ConnectionPoint` of a `Connectable` with a corresponding `ConnectionPoint` of the one containing it. The associated `ConnectionPoint`s shall have a compatible medium (see {s223:Substance-Medium})."^^xsd:string .

s223:EthernetCable a s223:Class,
        sh:NodeShape ;
    rdfs:label "Ethernet cable"^^xsd:string ;
    rdfs:comment """A type of `Conductor` that consists of 1, 2 or 4 pairs of twisted wire and is used for `Signal-WiredEthernet` communication. Subclasses of `EthernetCable` represent common types used in buildings.

: EthernetCable Subclasses

| Subclass |
|:-----------|
| `EthernetCable-Cat1` |
| `EthernetCable-Cat2` |
| `EthernetCable-Cat3` |
| `EthernetCable-Cat4` |
| `EthernetCable-Cat5` |
| `EthernetCable-Cat5e` |
| `EthernetCable-Cat6` |
| `EthernetCable-Cat6a` |
| `EthernetCable-Cat7` |
| `EthernetCable-Cat7a` |
| `EthernetCable-Cat8` |"""^^xsd:string ;
    rdfs:subClassOf s223:Conductor ;
    sh:property [ rdfs:comment "An `EthernetCable` shall be associated with exactly one `Signal-WiredEthernet` using the relation `hasMedium`."^^xsd:string ;
            sh:class s223:Signal-WiredEthernet ;
            sh:maxCount 1 ;
            sh:message "s223: An `EthernetCable` shall be associated with exactly one `Signal-WiredEthernet` using the relation `hasMedium`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasMedium ] .

s223:Voltage-24V a s223:Class,
        s223:Voltage-24V,
        sh:NodeShape ;
    rdfs:label "24 V"^^xsd:string ;
    s223:hasValue 24.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-24V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-380V a s223:Class,
        s223:Voltage-380V,
        sh:NodeShape ;
    rdfs:label "380 V"^^xsd:string ;
    s223:hasValue 380.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-380V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

qudt:hasUnit rdfs:comment "A reference to the unit of measure of a `QuantifiableProperty` of interest, such as `DEG_C`."^^xsd:string .

s223:Electricity-DC a s223:Class,
        s223:Electricity-DC,
        sh:NodeShape ;
    rdfs:label "DC electricity"^^xsd:string ;
    s223:hasDCDifferentialVoltage s223:Numerical-Voltage ;
    rdfs:comment """This class and its enumerated subclasses represent common DC electricity services.

: Electricity-DC Enumerations

| Enumeration |
|:-----------|
| `DC-5V` |
| `DC-6V` |
| `DC-12V` |
| `DC-24V` |
| `DC-48V` |
| `DC-380V` |
| `DC-PoE` |"""^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Electricity ;
    sh:property [ rdfs:comment "An `Electricity-DC` shall be associated with at least one `Numerical-Voltage` using the relation `hasDCDifferentialVoltage`."^^xsd:string ;
            sh:class s223:Numerical-Voltage ;
            sh:message "s223: An `Electricity-DC` shall be associated with at least one `Numerical-Voltage` using the relation `hasDCDifferentialVoltage`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasDCDifferentialVoltage ],
        [ rdfs:comment "An `Electricity-DC` shall be associated with zero or more `Numerical-Voltage`s using the relation `hasDCNegativeVoltage`."^^xsd:string ;
            sh:class s223:Numerical-Voltage ;
            sh:message "s223: An `Electricity-DC` shall be associated with zero or more `Numerical-Voltage`s using the relation `hasDCNegativeVoltage`."^^xsd:string ;
            sh:path s223:hasDCNegativeVoltage ],
        [ rdfs:comment "An `Electricity-DC` shall be associated with zero or more `Numerical-Voltage`s using the relation `hasDCPositiveVoltage`."^^xsd:string ;
            sh:class s223:Numerical-Voltage ;
            sh:message "s223: An `Electricity-DC` shall be associated with zero or more `Numerical-Voltage`s using the relation `hasDCPositiveVoltage`."^^xsd:string ;
            sh:path s223:hasDCPositiveVoltage ],
        [ rdfs:comment "An `Electricity-DC` shall be associated with zero or more `Voltage-0V`s using the relation `hasDCZeroVoltage`."^^xsd:string ;
            sh:class s223:Voltage-0V ;
            sh:message "s223: An `Electricity-DC` shall be associated with zero or more `Voltage-0V`s using the relation `hasDCZeroVoltage`."^^xsd:string ;
            sh:path s223:hasDCZeroVoltage ] .

s223:Connectable a s223:AbstractClass,
        sh:NodeShape ;
    rdfs:label "Connectable"^^xsd:string ;
    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` to other `Connectable`s via `ConnectionPoint`s and `Connection`s."^^xsd:string ;
    rdfs:subClassOf s223:Concept ;
    sh:property [ rdfs:comment "A `Connectable` shall be associated with zero or more `ConnectionPoint`s using the relation `cnx`."^^xsd:string ;
            sh:class s223:ConnectionPoint ;
            sh:message "s223: A `Connectable` shall be associated with zero or more `ConnectionPoint`s using the relation `cnx`."^^xsd:string ;
            sh:path s223:cnx ],
        [ rdfs:comment "A `Connectable` shall be associated with zero or more `Connection`s using the relation `connectedThrough`."^^xsd:string ;
            sh:class s223:Connection ;
            sh:message "s223: A `Connectable` shall be associated with zero or more `Connection`s using the relation `connectedThrough`."^^xsd:string ;
            sh:name "EquipmentToConnectionShape"^^xsd:string ;
            sh:path s223:connectedThrough ],
        [ rdfs:comment "A `Connectable` shall be associated with zero or more other `Connectable`s using the relation `connectedFrom`."^^xsd:string ;
            sh:class s223:Connectable ;
            sh:message "s223: A `Connectable` shall be associated with zero or more other `Connectable`s using the relation `connectedFrom`."^^xsd:string ;
            sh:path s223:connectedFrom ],
        [ rdfs:comment "A `Connectable` shall be associated with zero or more other `Connectable`s using the relation `connected`."^^xsd:string ;
            sh:class s223:Connectable ;
            sh:message "s223: A `Connectable` shall be associated with zero or more other `Connectable`s using the relation `connected`."^^xsd:string ;
            sh:name "SymmetricConnectableToConnectableShape"^^xsd:string ;
            sh:path s223:connected ],
        [ rdfs:comment "If a `Connectable` has `connected` or `connectedTo` (i.e., high-level connection specification), it must also have the supporting `cnx` relations (low-level connection specification)."^^xsd:string ;
            sh:path s223:cnx ;
            sh:severity sh:Warning ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "If a `Connectable` has the relation`connected` or `connectedTo` (i.e., high-level connection specification), it must also have the supporting `cnx` relations (low-level connection specification)."^^xsd:string ;
                    sh:message "s223: {$this} is s223:connected (high-level) to {?otherC} but not connected at the cnx-level."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?otherC
WHERE {
$this s223:connected ?otherC .
FILTER NOT EXISTS {$this s223:cnx+ ?otherC}
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Connectable` shall be associated with zero or more other `Connectable`s using the relation `connectedTo`."^^xsd:string ;
            sh:class s223:Connectable ;
            sh:message "s223: A `Connectable` shall be associated with zero or more other `Connectable`s using the relation `connectedTo`."^^xsd:string ;
            sh:name "ConnectableToConnectableShape"^^xsd:string ;
            sh:path s223:connectedTo ],
        [ rdfs:comment "A `Connectable` shall be associated with zero or more `ConnectionPoint`s that may not be connected using the relation `hasOptionalConnectionPoint`. The \"dangling connection point\" should not generate a validation error."^^xsd:string ;
            sh:class s223:ConnectionPoint ;
            sh:message "s223: A `Connectable` shall be associated with zero or more `ConnectionPoint`s that may not be connected using the relation `hasOptionalConnectionPoint`. The \"dangling connection point\" should not generate a validation error."^^xsd:string ;
            sh:path s223:hasOptionalConnectionPoint ],
        [ rdfs:comment "A `Connectable` shall be associated with zero or more `ConnectionPoint`s using the relation `hasConnectionPoint`."^^xsd:string ;
            sh:class s223:ConnectionPoint ;
            sh:message "s223: A `Connectable` shall be associated with zero or more `ConnectionPoint`s using the relation `hasConnectionPoint`."^^xsd:string ;
            sh:name "EquipmentToConnectionPointShape"^^xsd:string ;
            sh:path s223:hasConnectionPoint ] .

s223:Connection a s223:Class,
        sh:NodeShape ;
    rdfs:label "Connection"^^xsd:string ;
    rdfs:comment """A `Connection` is the modeling construct used to represent the thing (e.g., pipe, duct, conductor, or free space) that is used to convey
some Medium (e.g., water, air, electricity, light, Wi-Fi) between two connectable things. All connections have two or more connection points 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 `InletConnectionPoint`s (see {s223:InletConnectionPoint}) to represent the
inflow points and `OutletConnectionPoint`s (see {s223:OutletConnectionPoint}) to represent the outflow points.

A `Connection` may contain branches or intersections. These may be modeled using `Junction`s if it is necessary to identify a specific intersection.
(see {s223:Junction}).

The constraint to maintain compatible mediums among a `Connection` and all of its associated `ConnectionPoint`s gives rise to multiple
validation test cases, where the specified medium might be a pure medium, or a mixture with constituents. See {s223:Substance-Medium} for
more details.

![Graphical Depiction of Connection.](figures/Figure_5-3_Connection.svg)"""^^xsd:string ;
    rdfs:subClassOf s223:Concept ;
    sh:property [ rdfs:comment "Incompatible Medium. Case 3: `Connection` with a pure medium and an associated `ConnectionPoint` with constituents."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 3: `Connection` with a pure medium and an associated `ConnectionPoint` with constituents."^^xsd:string ;
                    sh:message "s223: `Connection` {$this} with medium {?m2} is incompatible with {?cp} with medium {?m1}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?m2 ?cp ?m1
WHERE {
$this s223:cnx ?cp .
?cp a/rdfs:subClassOf* s223:ConnectionPoint .
?cp s223:hasMedium ?m2 .
$this s223:hasMedium ?m1 .
?m2 s223:composedOf/s223:ofConstituent ?s2 .
FILTER NOT EXISTS {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {
  ?m2 s223:composedOf/s223:ofConstituent ?s12 .
  {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} .
}
}
"""^^xsd:string ] ],
        [ rdfs:comment "Incompatible Medium. Case 2: A `Connection` with constituents and an associated `ConnectionPoint` with a pure medium."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 2: A `Connection` with constituents and an associated `ConnectionPoint` with a pure medium."^^xsd:string ;
                    sh:message "s223: `Connection` {$this} with medium {?m2} is incompatible with {?cp} with medium {?m1}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?m2 ?cp ?m1
WHERE {
$this s223:cnx ?cp .
?cp a/rdfs:subClassOf* s223:ConnectionPoint .
?cp s223:hasMedium ?m1 .
$this s223:hasMedium ?m2 .
?m2 s223:composedOf/s223:ofConstituent ?s2 .
FILTER NOT EXISTS {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {
  ?m2 s223:composedOf/s223:ofConstituent ?s12 .
  {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} .
}
}
"""^^xsd:string ] ],
        [ rdfs:comment "Incompatible Medium. Case 1: A `Connection` with a pure medium and an associated `ConnectionPoint` with a pure medium."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 1: Two pure mediums."^^xsd:string ;
                    sh:message "s223: `Connection` {$this} with medium {?m2} is incompatible with {?cp} with medium {?m1}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?m2 ?cp ?m1
WHERE {
$this s223:cnx ?cp .
?cp a/rdfs:subClassOf* s223:ConnectionPoint .
?cp s223:hasMedium ?m1 .
$this s223:hasMedium ?m2 .
FILTER (?m1 != ?m2 ) .
FILTER NOT EXISTS {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {?m2 s223:composedOf ?c2}
FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) .
FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Connection` shall be associated with zero or more `Connectable`s using the relation `connectsFrom`."^^xsd:string ;
            sh:class s223:Connectable ;
            sh:message "s223: A `Connection` shall be associated with zero or more `Connectable`s using the relation `connectsFrom`."^^xsd:string ;
            sh:name "ConnectionToUpstreamConnectableShape"^^xsd:string ;
            sh:path s223:connectsFrom ],
        [ rdfs:comment "A `Connection` shall be associated with zero or more `ConnectionPoint`s using the relation `cnx`."^^xsd:string ;
            sh:class s223:ConnectionPoint ;
            sh:message "s223: A `Connection` shall be associated with zero or more `ConnectionPoint`s using the relation `cnx`."^^xsd:string ;
            sh:path s223:cnx ],
        [ rdfs:comment "A `Connection` shall be associated with at least two `ConnectionPoint`s using the relation `connectsAt`."^^xsd:string ;
            sh:class s223:ConnectionPoint ;
            sh:message "s223: A `Connection` shall be associated with at least two `ConnectionPoint`s using the relation `connectsAt`."^^xsd:string ;
            sh:minCount 2 ;
            sh:path s223:connectsAt ;
            sh:severity sh:Warning ],
        [ rdfs:comment "Incompatible Medium. Case 7: Two `ConnectionPoint`s with mediums with constituents."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 7: Two `ConnectionPoint`s with mediums with constituents."^^xsd:string ;
                    sh:message "s223: {?cp1} with medium {?m2} is incompatible with {?cp2} with medium {?m1}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?cp1 ?m1 ?cp2 ?m2
WHERE {
$this s223:cnx ?cp1 .
?cp1 a/rdfs:subClassOf* s223:ConnectionPoint .
?cp1 s223:hasMedium ?m2 .
$this s223:cnx ?cp2 .
?cp2 a/rdfs:subClassOf* s223:ConnectionPoint .
FILTER (?cp1 != ?cp2 ) .
?cp2 s223:hasMedium ?m1 .
    ?m1 s223:composedOf/s223:ofConstituent ?s1 .
    ?m2 s223:composedOf/s223:ofConstituent ?s2 .
  FILTER NOT EXISTS {
    ?m1 s223:composedOf/s223:ofConstituent ?s11 .
    ?m2 s223:composedOf/s223:ofConstituent ?s12 .
    FILTER (?s11 = ?s12) .
  }
  FILTER NOT EXISTS {
    ?m1 s223:composedOf/s223:ofConstituent ?s21 .
    ?m2 s223:composedOf/s223:ofConstituent ?s22 .
    {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} .
  }
}
"""^^xsd:string ] ],
        [ rdfs:comment "Incompatible Medium. Case 4: A `Connection` with constituents and an associated `ConnectionPoint` with constituents."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 4: A `Connection` with constituents and an associated `ConnectionPoint` with constituents."^^xsd:string ;
                    sh:message "s223: `Connection` {$this} with medium {?m2} is incompatible with {?cp} with medium {?m1}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?m2 ?cp ?m1
WHERE {
$this s223:cnx ?cp .
?cp a/rdfs:subClassOf* s223:ConnectionPoint .
?cp s223:hasMedium ?m2 .
$this s223:hasMedium ?m1 .
    ?m1 s223:composedOf/s223:ofConstituent ?s1 .
    ?m2 s223:composedOf/s223:ofConstituent ?s2 .
  FILTER NOT EXISTS {
    ?m1 s223:composedOf/s223:ofConstituent ?s11 .
    ?m2 s223:composedOf/s223:ofConstituent ?s12 .
    FILTER (?s11 = ?s12) .
  }
  FILTER NOT EXISTS {
    ?m1 s223:composedOf/s223:ofConstituent ?s21 .
    ?m2 s223:composedOf/s223:ofConstituent ?s22 .
    {?s22 rdfs:subClassOf* ?s21} UNION {?s21 rdfs:subClassOf* ?s22} .
  }
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Connection` shall be associated with zero or more `Connectable`s using the relation `connectsTo`."^^xsd:string ;
            sh:class s223:Connectable ;
            sh:message "s223: A `Connection` shall be associated with zero or more `Connectable`s using the relation `connectsTo`."^^xsd:string ;
            sh:name "ConnectionToDownstreamConnectableShape"^^xsd:string ;
            sh:path s223:connectsTo ],
        [ rdfs:comment "A `Connection` shall be associated with zero or more `EnumerationKind-Role`s using the relation `hasRole`."^^xsd:string ;
            sh:class s223:EnumerationKind-Role ;
            sh:message "s223: A `Connection` shall be associated with zero or more `EnumerationKind-Role`s using the relation `hasRole`."^^xsd:string ;
            sh:path s223:hasRole ],
        [ rdfs:comment "Incompatible Medium. Case 5: Two `ConnectionPoint`s with pure mediums."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 5: Two `ConnectionPoint`s with pure mediums."^^xsd:string ;
                    sh:message "s223: {?cp1} with medium {?m1} is incompatible with {?cp2} with medium {?m2}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?cp1 ?m1 ?cp2 ?m2
WHERE {
$this s223:cnx ?cp1 .
?cp1 a/rdfs:subClassOf* s223:ConnectionPoint .
?cp1 s223:hasMedium ?m1 .
$this s223:cnx ?cp2 .
?cp2 a/rdfs:subClassOf* s223:ConnectionPoint .
?cp2 s223:hasMedium ?m2 .
FILTER (?m1 != ?m2 ) .
FILTER NOT EXISTS {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {?m2 s223:composedOf ?c2}
FILTER (NOT EXISTS {?m2 rdfs:subClassOf* ?m1}) .
FILTER (NOT EXISTS {?m1 rdfs:subClassOf* ?m2}) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "Incompatible Medium. Case 6: Two `ConnectionPoint`s, one with a medium with constituents and one with a pure medium."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Incompatible Medium. Case 6: A medium with constituents and a pure medium."^^xsd:string ;
                    sh:message "s223: {?cp1} with medium {?m1} is incompatible with {?cp2} with medium {?m2}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?cp1 ?m1 ?cp2 ?m2
WHERE {
$this s223:cnx ?cp1 .
?cp1 a/rdfs:subClassOf* s223:ConnectionPoint .
?cp1 s223:hasMedium ?m1 .
$this s223:cnx ?cp2 .
?cp2 a/rdfs:subClassOf* s223:ConnectionPoint .
FILTER (?cp1 != ?cp2 ) .
?cp2 s223:hasMedium ?m2 .
?m2 s223:composedOf/s223:ofConstituent ?s2 .
FILTER NOT EXISTS {?m1 s223:composedOf ?c1} .
FILTER NOT EXISTS {
  ?m2 s223:composedOf/s223:ofConstituent ?s12 .
  {?s12 rdfs:subClassOf* ?m1} UNION {?m1 rdfs:subClassOf* ?s12} .
}
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Connection` must only have a `cnx` relation with a `ConnectionPoint`"^^xsd:string ;
            sh:path s223:cnx ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "A `Connection` must only have a `cnx` relation with a `ConnectionPoint`"^^xsd:string ;
                    sh:message "s223: {$this} cannot have a s223:cnx relation to {?something}, because {?something} is not a `ConnectionPoint`."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """SELECT $this ?something
WHERE {
$this s223:cnx ?something .
FILTER NOT EXISTS {?something a/rdfs:subClassOf* s223:ConnectionPoint} .
}"""^^xsd:string ] ],
        [ rdfs:comment "A `Connection` shall be associated with at most one `EnumerationKind-ThermodynamicPhase` using the relation `hasThermodynamicPhase`."^^xsd:string ;
            sh:class s223:EnumerationKind-ThermodynamicPhase ;
            sh:maxCount 1 ;
            sh:message "s223: A `Connection` shall be associated with at most one `EnumerationKind-ThermodynamicPhase` using the relation `hasThermodynamicPhase`."^^xsd:string ;
            sh:path s223:hasThermodynamicPhase ],
        [ rdfs:comment "A `Connection` shall be associated with exactly one `Substance-Medium` using the relation `hasMedium`."^^xsd:string ;
            sh:class s223:Substance-Medium ;
            sh:maxCount 1 ;
            sh:message "s223: A `Connection` shall be associated with exactly one `Substance-Medium` using the relation `hasMedium`."^^xsd:string ;
            sh:minCount 1 ;
            sh:name "Connection medium"^^xsd:string ;
            sh:path s223:hasMedium ] .

s223:EnumerationKind a s223:Class,
        s223:EnumerationKind,
        sh:NodeShape ;
    rdfs:label "Enumeration kind"^^xsd:string ;
    rdfs:comment """This is the encapsulating class for all `EnumerationKind`s.
`EnumerationKind`s define the (closed) set of permissible values for a given purpose.
For example, `EnumerationKind-DayOfWeek` enumerates the days of the week and allows no other values.

`EnumerationKind`s are arranged in a class hierarchy tree, with the root class named `EnumerationKind`. Each subclass is named
starting with its immediate superclass, followed by a hyphen and a name that is unique among the sibling classes.
Each class is also an instance of itself. This unusual modeling pattern was used to achieve:

- The ability to set an `EnumerationKind` value that is more general, or not yet fully specified
  at the time of modeling, such as `Electricity-AC` without having to state exactly what voltage or frequency it is.

- The ability to use the `sh:class` SHACL predicate at any level in the `EnumerationKind` hierarchy
  to constrain a value in the s223 specification, even if it is a more general one such as `Electricity-AC` in the above example.

Certain validation constraints exist in the standard that evaluate compatibility of `EnumerationKind`s.
Two values are deemed compatible if they are the same, if one is a direct ancestor (or descendant) of the other,
or if they are mixtures sharing at least one constituent."""^^xsd:string ;
    rdfs:subClassOf s223:Concept .

s223:EnumerationKind-Domain a s223:Class,
        s223:EnumerationKind-Domain,
        sh:NodeShape ;
    rdfs:label "Domain"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent building systems and services e.g., HVAC, Lighting, and Plumbing.

: EnumerationKind-Domain Enumerations

| Enumeration |
|:-----------|
| `Domain-ConveyanceSystems` |
| `Domain-Electrical` |
| `Domain-FireProtection` |
| `Domain-HVAC` |
| `Domain-Lighting` |
| `Domain-Networking` |
| `Domain-Occupancy` |
| `Domain-PhysicalSecurity` |
| `Domain-Plumbing` |
| `Domain-Refrigeration` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind .

s223:Voltage-240V a s223:Class,
        s223:Voltage-240V,
        sh:NodeShape ;
    rdfs:label "240 V"^^xsd:string ;
    s223:hasValue 240.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-240V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Voltage-0V a s223:Class,
        s223:Voltage-0V,
        sh:NodeShape ;
    rdfs:label "0 V"^^xsd:string ;
    s223:hasValue 0.0 ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment "Voltage-0V"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Voltage .

s223:Sensor a s223:Class,
        sh:NodeShape ;
    rdfs:label "Sensor"^^xsd:string ;
    rdfs:comment """
A `Sensor` `observes` an `ObservableProperty` (see {s223:ObservableProperty})
which may be quantifiable (see {s223:QuantifiableObservableProperty}), such as a
temperature, flow, or concentration, or enumerable (see {s223:EnumeratedObservableProperty}),
such as an occupancy state.

If a `Sensor` observes a `QuantifiableObservableProperty` relative to an assumed
or common reference point, it can be modeled with only an observation location.
For example:

```turtle
@prefix : <http://example.com/> .

:example1 a s223:TemperatureSensor ;
    s223:hasObservationLocation :location1 ;
    qudt:hasQuantityKind quantitykind:Temperature .
```

If a `Sensor` observes a `QuantifiableObservableProperty` relative to a unique
or specified reference point, it can be modeled with an observation location and
a reference location, and indicating the difference between two values by setting `qudt:isDeltaQuantity` to `true`. For example:

```turtle
@prefix : <http://example.com/> .

:example2 a s223:TemperatureSensor ;
    s223:hasObservationLocation :location1 ;
    s223:hasReferenceLocation :location2 ;
    qudt:hasQuantityKind quantitykind:Temperature ;
    qudt:isDeltaQuantity true .
```
"""^^xsd:string ;
    rdfs:subClassOf s223:Equipment ;
    sh:property [ rdfs:comment "If the `hasReferenceLocation` relation exists, the observed `Property` shall have `qudt:isDeltaQuantity` true."^^xsd:string ;
            sh:path s223:observes ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "If the `hasReferenceLocation` relation exists, the observed `Property` shall have `qudt:isDeltaQuantity` true."^^xsd:string ;
                    sh:message "s223: `Sensor` {$this} has a reference location, but its `Property` lacks `qudt:isDeltaQuantity` true."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
          SELECT $this
          WHERE {
$this s223:hasReferenceLocation ?y .
$this s223:observes ?x .
?x a/rdfs:subClassOf* s223:QuantifiableProperty .
FILTER NOT EXISTS {$this s223:observes/qudt:isDeltaQuantity true}
}
"""^^xsd:string ] ],
        [ rdfs:comment "If the observed `Property` has `qudt:isDeltaQuantity` true, the `Sensor` shall have a `hasReferenceLocation` relation."^^xsd:string ;
            sh:path s223:observes ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "If the observed `Property` has `qudt:isDeltaQuantity` true, the `Sensor` shall have a `hasReferenceLocation` relation."^^xsd:string ;
                    sh:message "s223: `Sensor` {$this} has `Property` {?x} with `qudt:isDeltaQuantity` true, but the `Sensor` lacks a reference location."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
          SELECT $this ?x
          WHERE {
$this s223:observes/qudt:isDeltaQuantity true .
$this s223:observes ?x .
?x a/rdfs:subClassOf* s223:QuantifiableProperty .
FILTER NOT EXISTS {$this s223:hasReferenceLocation ?y}
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Sensor` shall be associated with zero or more `QuantifiableProperty`s using the relation `hasMeasurementResolution`."^^xsd:string ;
            sh:class s223:QuantifiableProperty ;
            sh:message "s223: A `Sensor` shall be associated with zero or more `QuantifiableProperty`s using the relation `hasMeasurementResolution`."^^xsd:string ;
            sh:path s223:hasMeasurementResolution ],
        [ rdfs:comment "If a `Sensor` measures a differential property, it shall be associated with a reference location using the relation `hasReferenceLocation`."^^xsd:string ;
            sh:maxCount 1 ;
            sh:message "s223: If a `Sensor` measures a differential property, it shall be associated with a reference location using the relation `hasReferenceLocation`."^^xsd:string ;
            sh:path s223:hasReferenceLocation ],
        [ rdfs:comment "A `Sensor` shall be associated with exactly one location using the relation `hasObservationLocation`."^^xsd:string ;
            sh:maxCount 1 ;
            sh:message "s223: A `Sensor` shall be associated with exactly one location using the relation `hasObservationLocation`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasObservationLocation ],
        [ rdfs:comment "A `Sensor` shall be associated with exactly one `ObservableProperty` using the relation `observes`."^^xsd:string ;
            sh:class s223:ObservableProperty ;
            sh:maxCount 1 ;
            sh:message "s223: A `Sensor` shall be associated with exactly one `ObservableProperty` using the relation `observes`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:observes ] .

s223:contains a s223:Relation,
        rdf:Property ;
    rdfs:label "contains"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a piece of `Equipment` with its component pieces of `Equipment`, or a `PhysicalSpace` (see {s223:PhysicalSpace}) with its component `PhysicalSpace`s."^^xsd:string .

s223:hasRole a s223:Relation,
        rdf:Property ;
    rdfs:label "has role"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a role with of a piece of `Equipment`, a `Connection`, `ConnectionPoint`, or `System` within a building (e.g., a heating coil might be associated with `Role-Heating`). Possible values are defined in `EnumerationKind-Role` (see {s223:EnumerationKind-Role})."^^xsd:string .

s223:Mix-Fluid a s223:Class,
        s223:Mix-Fluid,
        sh:NodeShape ;
    rdfs:label "Fluid mixture"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent substances that are commonly used to convey liquids or gases.

: Mix-Fluid Enumerations

| Enumeration |
|:-----------|
| `Fluid-Air` |
| `Fluid-NaturalGas` |
| `Fluid-Oil` |
| `Fluid-Water` (see {s223:Fluid-Water}) |"""^^xsd:string ;
    rdfs:subClassOf s223:Medium-Mix .

s223:RF-Signal a s223:Class,
        s223:RF-Signal,
        sh:NodeShape ;
    rdfs:label "Radio frequency signal"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent the use of radio frequency for creating communication signals, and common communication protocols. The radio spectrum of frequencies (`RF-Signal`) is divided into bands (i.e., subclasses) with conventional names designated by the International Telecommunication Union (e.g., UHF for Ultra High Frequency).

: RF-Signal Enumerations

| Enumeration |
|:-----------|
| `Signal-EHF` |
| `Signal-ELF` |
| `Signal-HF` |
| `Signal-LF` |
| `Signal-MF` |
| `Signal-SHF` |
| `Signal-SLF` |
| `Signal-THF` |
| `Signal-UHF` (see {s223:Signal-UHF}) |
| `Signal-ULF` |
| `Signal-VHF` |
| `Signal-VLF` |
| `Signal-Wideband` (see {s223:Signal-Wideband}) |"""^^xsd:string ;
    rdfs:subClassOf s223:EM-RF .

s223:hasProperty a s223:Relation,
        rdf:Property ;
    rdfs:label "has property"^^xsd:string ;
    rdfs:comment "A `Relation` that associates a `Concept` with a `Property`."^^xsd:string .

s223:EnumerationKind-Aspect a s223:Class,
        s223:EnumerationKind-Aspect,
        sh:NodeShape ;
    rdfs:label "Aspect"^^xsd:string ;
    rdfs:comment "Aspect enumerations provide context to the meaning of a `Property` that would otherwise not be apparent."^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind .

s223:BidirectionalConnectionPoint a s223:Class,
        sh:NodeShape ;
    rdfs:label "Bidirectional connection point"^^xsd:string ;
    rdfs:comment "A `BidirectionalConnectionPoint` is a `ConnectionPoint` for which a `Substance-Medium` is expected to flow either into or out of the associated `Connectable`."^^xsd:string ;
    rdfs:subClassOf s223:ConnectionPoint ;
    sh:property [ rdfs:comment "A `BidirectionalConnectionPoint` shall be associated with at most one other `BidirectionalConnectionPoint` using the relation `mapsTo`."^^xsd:string ;
            sh:class s223:BidirectionalConnectionPoint ;
            sh:maxCount 1 ;
            sh:message "s223: A `BidirectionalConnectionPoint` shall be associated with at most one other `BidirectionalConnectionPoint` using the relation `mapsTo`."^^xsd:string ;
            sh:path s223:mapsTo ],
        [ rdfs:comment "A `BidirectionalConnectionPoint` shall be associated with at most one `ConnectionPoint` using the relation `pairedConnectionPoint`."^^xsd:string ;
            sh:class s223:ConnectionPoint ;
            sh:maxCount 1 ;
            sh:message "s223: A `BidirectionalConnectionPoint` shall be associated with at most one `ConnectionPoint` using the relation `pairedConnectionPoint`."^^xsd:string ;
            sh:path s223:pairedConnectionPoint ] .

s223:Medium-Constituent a s223:Class,
        s223:Medium-Constituent,
        sh:NodeShape ;
    rdfs:label "Constituent"^^xsd:string ;
    rdfs:comment """
This class and its enumerated subclasses represent substances that may be combined to form a `Medium-Mix`. Constituents are distinguished from `Medium-Mix` and its subclasses in that constituents cannot use the `composedOf` relation to reference a concentration of other constituents.

: Medium-Constituent Enumerations

| Enumeration |
|:-----------|
| `Constituent-Ar` |
| `Constituent-CH4` |
| `Constituent-CO` |
| `Constituent-CO2` |
| `Constituent-Electricity` (see {s223:Constituent-Electricity}) |
| `Constituent-EM` (see {s223:Constituent-EM}) |
| `Constituent-Glycol` |
| `Constituent-H2O` |
| `Constituent-H2S` |
| `Constituent-N2` |
| `Constituent-NH3` |
| `Constituent-NOX` (see {s223:Constituent-NOX}) |
| `Constituent-O2` |
| `Constituent-O3` |
| `Constituent-Oil` |
| `Constituent-Radon` |
| `Constituent-Refrigerant` (see {s223:Constituent-Refrigerant}) |
| `Constituent-SO2` |
| `Constituent-VolatileOrganicCompounds` |
"""^^xsd:string ;
    rdfs:subClassOf s223:Substance-Medium ;
    sh:property [ rdfs:comment "A `Medium-Constituent` shall not be associated with any substances using the relation `composedOf`."^^xsd:string ;
            sh:maxCount 0 ;
            sh:message "s223: A `Medium-Constituent` shall not be associated with any substances using the relation `composedOf`."^^xsd:string ;
            sh:path s223:composedOf ] .

s223:Property a s223:Class,
        sh:NodeShape ;
    rdfs:label "Property"^^xsd:string ;
    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`, a subclass of `Property` that can be modified by user or machine outside of the model (typically command);
- `ObservableProperty`, a subclass of `Property` that are observed (typically measures);
- `EnumerableProperty`, a subclass of `Property` defined by `EnumerationKind`; and
- `QuantifiableProperty`, a subclass of `Property` defined by numerical values.

And their subclass combinations:

- `QuantifiableActuatableProperty`,
- `QuantifiableObservableProperty`,
- `EnumeratedObservableProperty`, and
- `EnumeratedActuatableProperty`.

A `QuantifiableProperty` (or subclass thereof) shall 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 a `QuantityKind` if it is
unambiguous.

Enumerable properties shall be associated with an `EnumerationKind`. Different flavors of properties are shown in Figure 11-1.

![Different flavors of Properties](figures/Figure_11-1_Flavors_of_Properties.svg)

A `Property` instance that is not an instance of one of the subclasses is unconstrained with respect to its value."""^^xsd:string ;
    rdfs:subClassOf s223:Concept ;
    sh:property [ rdfs:comment "A `Property` shall be associated with at most one `EnumerationKind-Substance` using the relation `ofSubstance`."^^xsd:string ;
            sh:class s223:EnumerationKind-Substance ;
            sh:maxCount 1 ;
            sh:message "s223: A `Property` shall be associated with at most one `EnumerationKind-Substance` using the relation `ofSubstance`."^^xsd:string ;
            sh:path s223:ofSubstance ],
        [ rdfs:comment ""^^xsd:string ;
            sh:path s223:ofConstituent ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "If an incoming relation `composedOf` exists, then the `Property` must have a declared substance using the relation `ofConstituent`."^^xsd:string ;
                    sh:message "s223: `Property` {$this} is referred to by {?something} with s223:composedOf, but the `Property` has no value for s223:ofConstituent."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?something
WHERE {
?something s223:composedOf $this .
FILTER NOT EXISTS {$this s223:ofConstituent ?someSubstance} .
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Property` shall be associated with at most one `Function` using the inverse of the relation `hasOutput`."^^xsd:string ;
            sh:class s223:Function ;
            sh:maxCount 1 ;
            sh:message "s223: A `Property` shall be associated with at most one `Function` using the inverse of the relation `hasOutput`."^^xsd:string ;
            sh:path [ sh:inversePath s223:hasOutput ] ],
        [ rdfs:comment "A `Property` shall be associated with zero or more `EnumerationKind`s using the relation `hasAspect`."^^xsd:string ;
            sh:class s223:EnumerationKind ;
            sh:message "s223: A `Property` shall be associated with zero or more `EnumerationKind`s using the relation `hasAspect`."^^xsd:string ;
            sh:path s223:hasAspect ],
        [ rdfs:comment "A `Property` shall be associated with at most one other `Property` using the relation `isInternalReferenceOf`."^^xsd:string ;
            sh:class s223:Property ;
            sh:maxCount 1 ;
            sh:message "s223: A `Property` shall be associated with at most one other `Property` using the relation `isInternalReferenceOf`."^^xsd:string ;
            sh:path s223:isInternalReferenceOf ],
        [ rdfs:comment "A `Property` must not have both a `hasInternalReference` and a `hasValue` relation."^^xsd:string ;
            sh:path s223:hasInternalReference ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "A `Property` must not have both a `hasInternalReference` and a `hasValue` relation."^^xsd:string ;
                    sh:message "s223: {$this} cannot have both a `hasInternalReference` and a `hasValue` relation."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this
WHERE {
$this s223:hasInternalReference ?int .
$this s223:hasValue ?val .
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Property` must not have both a `hasInternalReference` and a `hasExternalReference` relation."^^xsd:string ;
            sh:path s223:hasInternalReference ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "A `Property` must not have both a `hasInternalReference` and a `hasExternalReference` relation."^^xsd:string ;
                    sh:message "s223: {$this} cannot have both a `hasInternalReference` and a `hasExternalReference` relation."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this
WHERE {
$this s223:hasInternalReference ?int .
$this s223:hasExternalReference ?ext .
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Property` must not be observed (set) by more than one entity."^^xsd:string ;
            sh:maxCount 1 ;
            sh:message "s223: A `Property` must not be observed (set) by more than one entity."^^xsd:string ;
            sh:path [ sh:inversePath s223:observes ] ],
        [ rdfs:comment "If a `Property` has an `ofSubstance` relation, it should also have an `ofMedium` relation."^^xsd:string ;
            sh:path s223:ofSubstance ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "If a `Property` has an `ofSubstance` relation, it should also have an `ofMedium` relation."^^xsd:string ;
                    sh:message "s223: Since Property {$this} has an `ofSubstance` relation, it should also have an `ofMedium` relation."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this
WHERE {
$this s223:ofSubstance ?substance .
FILTER NOT EXISTS {$this s223:ofMedium ?medium} .
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Property` shall be associated with at most one `Substance-Medium` using the relation `ofMedium`."^^xsd:string ;
            sh:class s223:Substance-Medium ;
            sh:maxCount 1 ;
            sh:message "s223: A `Property` shall be associated with at most one `Substance-Medium` using the relation `ofMedium`."^^xsd:string ;
            sh:path s223:ofMedium ],
        [ rdfs:comment "A `Property` shall be associated with at most one value using the relation `hasValue` to provide a static value in the model. It is not meant for real-time value (see {s223:hasExternalReference})."^^xsd:string ;
            sh:maxCount 1 ;
            sh:message "s223: A `Property` shall be associated with at most one value using the relation `hasValue` to provide a static value in the model. It is not meant for real-time value (see {s223:hasExternalReference})."^^xsd:string ;
            sh:path s223:hasValue ],
        [ rdfs:comment "A `Property` must not have both a `hasExternalReference` and a `hasValue` relation."^^xsd:string ;
            sh:path s223:hasValue ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "A `Property` must not have both a `hasExternalReference` and a `hasValue` relation."^^xsd:string ;
                    sh:message "s223: {$this} cannot have both a `hasExternalReference` and a `hasValue` relation."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this
WHERE {
$this s223:hasExternalReference ?ext .
$this s223:hasValue ?val .
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `Property` shall be associated with at most one other `Property` using the relation `hasInternalReference`."^^xsd:string ;
            sh:class s223:Property ;
            sh:maxCount 1 ;
            sh:message "s223: A `Property` shall be associated with at most one other `Property` using the relation `hasInternalReference`."^^xsd:string ;
            sh:path s223:hasInternalReference ],
        [ rdfs:comment "A `Property` shall be associated with zero or more `ExternalReference`s using the relation `hasExternalReference`."^^xsd:string ;
            sh:class s223:ExternalReference ;
            sh:message "s223: A `Property` shall be associated with zero or more `ExternalReference`s using the relation `hasExternalReference`."^^xsd:string ;
            sh:path s223:hasExternalReference ] ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment "A `Property` cannot be declared an instance of both an `ActuatableProperty` and an `ObservableProperty`."^^xsd:string ;
            sh:message "s223: {$this} cannot be declared an instance of both an `ActuatableProperty` and an `ObservableProperty`."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            sh:select """
SELECT $this
WHERE {
$this a/rdfs:subClassOf* s223:ActuatableProperty .
$this a/rdfs:subClassOf* s223:ObservableProperty .
}
"""^^xsd:string ] .

s223:observes a s223:Relation,
        rdf:Property ;
    rdfs:label "observes"^^xsd:string ;
    rdfs:comment """A `Relation` that associates a `Sensor` with one `ObservableProperty` (see {s223:ObservableProperty})
which is used by the sensor to generate a measurement value (e.g., a temperature) or a simple observation of a stimulus
causing a reaction (e.g., a current binary switch that closes a dry contact when a fan is powered on)."""^^xsd:string .

s223:Signal-FiberEthernet a s223:Class,
        s223:Signal-FiberEthernet,
        sh:NodeShape ;
    rdfs:label "Fiber Ethernet"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent common fiber Ethernet communication protocols.

: Signal-FiberEthernet Enumerations

| Enumeration |
|:-----------|
| `FiberEthernet-1X9` |
| `FiberEthernet-300PIN` |
| `FiberEthernet-CFP` |
| `FiberEthernet-CFP2` |
| `FiberEthernet-CFP4` |
| `FiberEthernet-CPAK` |
| `FiberEthernet-CXP` |
| `FiberEthernet-GBIC` |
| `FiberEthernet-QSFP` |
| `FiberEthernet-QSFP+` |
| `FiberEthernet-QSFP28` |
| `FiberEthernet-SFF` |
| `FiberEthernet-SFP` |
| `FiberEthernet-SFP+` |
| `FiberEthernet-X2` |
| `FiberEthernet-XENPAK` |
| `FiberEthernet-XFP` |"""^^xsd:string ;
    rdfs:subClassOf s223:Infrared-Signal .

s223:Signal-WiredEthernet a s223:Class,
        s223:Signal-WiredEthernet,
        sh:NodeShape ;
    rdfs:label "Wired Ethernet"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent common wired Ethernet communication protocols.

: Signal-WiredEthernet Enumerations

| Enumeration |
|:-----------|
| `WiredEthernet-2.5GBASE-T` |
| `WiredEthernet-2.5GBASE-T1` |
| `WiredEthernet-5GBASE-T` |
| `WiredEthernet-5GBASE-T1` |
| `WiredEthernet-10BASE-T` |
| `WiredEthernet-10BASE-T1L` |
| `WiredEthernet-10BASE-T1S` |
| `WiredEthernet-10GBASE-T` |
| `WiredEthernet-10GBASE-T1` |
| `WiredEthernet-25GBASE-T` |
| `WiredEthernet-40GBASE-T` |
| `WiredEthernet-100BASE-T1` |
| `WiredEthernet-100BASE-TX` |
| `WiredEthernet-1000BASE-T` |
| `WiredEthernet-1000BASE-T1` |"""^^xsd:string ;
    rdfs:subClassOf s223:Electricity-Signal .

s223:ConnectionPoint a s223:AbstractClass,
        sh:NodeShape ;
    rdfs:label "Connection point"^^xsd:string ;
    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`, `DomainSpace`s and `Junction`s can have one or more `ConnectionPoint`s (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 {s223:Connectable}).

`ConnectionPoint`s 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)"""^^xsd:string ;
    rdfs:subClassOf s223:Concept ;
    sh:property [ rdfs:comment "A `ConnectionPoint` should be associated with at most one `Connection` using the relation `connectsThrough`."^^xsd:string ;
            sh:class s223:Connection ;
            sh:maxCount 1 ;
            sh:message "s223: A `ConnectionPoint` should be associated with at most one `Connection` using the relation `connectsThrough`."^^xsd:string ;
            sh:name "ConnectionPointToConnectionShape"^^xsd:string ;
            sh:path s223:connectsThrough ;
            sh:severity sh:Info ],
        [ rdfs:comment "A `ConnectionPoint` must not have both a `mapsTo` and a `connectsThrough` relation."^^xsd:string ;
            sh:path s223:mapsTo ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "A `ConnectionPoint` must not have both a `mapsTo` and a `connectsThrough` relation."^^xsd:string ;
                    sh:message "s223: {$this} cannot have both a `mapsTo` {?uppercp} and a `connectsThrough` {?connection}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?uppercp ?connection
WHERE {
$this s223:mapsTo ?uppercp .
$this s223:connectsThrough ?connection .
?connection a/rdfs:subClassOf* s223:Connection .
}
"""^^xsd:string ] ],
        [ rdfs:comment "Ensure that the Medium identified by a `ConnectionPoint` via the `hasMedium` relation is compatible with the Medium identified by the entity identified by the `mapsTo` relation."^^xsd:string ;
            sh:name "Test for compatible declared Medium"^^xsd:string ;
            sh:path s223:hasMedium ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Ensure that the Medium identified by a `ConnectionPoint` via the `hasMedium` relation is compatible with the Medium identified by the entity identified by the `mapsTo` relation."^^xsd:string ;
                    sh:message "s223: {$this} declares a medium of {?a}, but the medium of {?b} is declared by {?target} pointed to by the `mapsTo` relation."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    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:Substance-Medium .
?b a/rdfs:subClassOf* s223:Substance-Medium .
FILTER (?a != ?b ) .
FILTER (NOT EXISTS {?b a/rdfs:subClassOf* ?a}) .
FILTER (NOT EXISTS {?a a/rdfs:subClassOf* ?b}) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "If a `ConnectionPoint` lacks a `connectsThrough` and `mapsTo` relation, but is associated with a `Junction` or `Equipment` that is contained by an `Equipment`, then suggest that the `ConnectionPoint` might need a `mapsTo` relation to a `ConnectionPoint` of the containing `Equipment`."^^xsd:string ;
            sh:path s223:mapsTo ;
            sh:severity sh:Info ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "If a `ConnectionPoint` lacks a `connectsThrough` and `mapsTo` relation, but is associated with a `Junction` or `Equipment` that is contained by an `Equipment`, then suggest that the `ConnectionPoint` might need a `mapsTo` relation to a `ConnectionPoint` of the containing `Equipment`."^^xsd:string ;
                    sh:message "s223: `ConnectionPoint` {$this} could be missing a `mapsTo` relation to a `ConnectionPoint` of {?containerEquipment} because it is associated with a `Junction` or `Equipment` that is contained by {?containerEquipment}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
    SELECT $this ?containerEquipment
    WHERE {
        FILTER NOT EXISTS {$this s223:connectsThrough ?anything1} .
        FILTER NOT EXISTS {$this s223:mapsTo ?anything2} .
        FILTER NOT EXISTS {?anything3 s223:hasBoundaryConnectionPoint $this} .
        $this s223:isConnectionPointOf ?equipment .
        ?containerEquipment s223:contains ?equipment .
        }
        """^^xsd:string ] ],
        [ rdfs:comment "If a `ConnectionPoint` `mapsTo` another `ConnectionPoint`, the respective `Equipment` should have a `contains` relation."^^xsd:string ;
            sh:path s223:mapsTo ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "If a `ConnectionPoint` `mapsTo` another `ConnectionPoint`, the respective `Equipment` should have a `contains` relation."^^xsd:string ;
                    sh:message "s223: {?otherEquipment} should contain {?equipment} because `ConnectionPoint` {$this} has a `mapsTo` relation."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    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}
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `ConnectionPoint` shall be associated with at most one other `ConnectionPoint` using the relation `pairedConnectionPoint`."^^xsd:string ;
            sh:class s223:ConnectionPoint ;
            sh:maxCount 1 ;
            sh:message "s223: A `ConnectionPoint` shall be associated with at most one other `ConnectionPoint` using the relation `pairedConnectionPoint`."^^xsd:string ;
            sh:path s223:pairedConnectionPoint ],
        [ rdfs:comment "A `ConnectionPoint` shall be associated with at most one `Connection` using the relation `cnx`."^^xsd:string ;
            sh:message "s223: A `ConnectionPoint` shall be associated with at most one `Connection` using the relation `cnx`."^^xsd:string ;
            sh:path s223:cnx ;
            sh:qualifiedMaxCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Connection ] ;
            sh:qualifiedValueShapesDisjoint true ],
        [ rdfs:comment "If a `ConnectionPoint` lacks a `connectsThrough` and `mapsTo` relation, and is not associated with a `Junction` or `Equipment` that is contained by an `Equipment`, then suggest that the `ConnectionPoint` probably needs an association with a `Connection`."^^xsd:string ;
            sh:path s223:connectsThrough ;
            sh:severity sh:Info ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "If a `ConnectionPoint` lacks a `connectsThrough` and `mapsTo` relation, and is not associated with a `Junction` or `Equipment` that is contained by an `Equipment`, then suggest that the `ConnectionPoint` probably needs an association with a `Connection`."^^xsd:string ;
                    sh:message "s223: `ConnectionPoint` {$this} probably needs an association with a `Connection`, or use of `hasOptionalConnectionPoint` or `hasBoundaryConnectionPoint` qualifiers."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
    SELECT $this
    WHERE {
        FILTER NOT EXISTS {?sys1 s223:hasBoundaryConnectionPoint $this} .
        FILTER NOT EXISTS {?sys2 s223:hasOptionalConnectionPoint $this} .
        FILTER NOT EXISTS {$this s223:connectsThrough ?anything1} .
        FILTER NOT EXISTS {$this s223:mapsTo ?anything2} .
        $this s223:isConnectionPointOf ?equipment .
        FILTER NOT EXISTS {?containerEquipment s223:contains ?equipment} .
        }
        """^^xsd:string ] ],
        [ rdfs:comment "A `ConnectionPoint` shall be associated with at most one other `ConnectionPoint` using the inverse of the relation `pairedConnectionPoint`."^^xsd:string ;
            sh:class s223:ConnectionPoint ;
            sh:maxCount 1 ;
            sh:message "s223: A `ConnectionPoint` shall be associated with at most one other `ConnectionPoint` using the inverse of the relation `pairedConnectionPoint`."^^xsd:string ;
            sh:path [ sh:inversePath s223:pairedConnectionPoint ] ],
        [ rdfs:comment "A `ConnectionPoint` shall be associated with at most one `EnumerationKind-ElectricalPhaseIdentifier` using the relation `hasElectricalPhase`."^^xsd:string ;
            sh:class s223:EnumerationKind-ElectricalPhaseIdentifier ;
            sh:maxCount 1 ;
            sh:message "s223: A `ConnectionPoint` shall be associated with at most one `EnumerationKind-ElectricalPhaseIdentifier` using the relation `hasElectricalPhase`."^^xsd:string ;
            sh:path s223:hasElectricalPhase ],
        [ rdfs:comment "A `ConnectionPoint` shall be associated with at most one `Connectable` using the relation `cnx`."^^xsd:string ;
            sh:message "s223: A `ConnectionPoint` shall be associated with at most one `Connectable` using the relation `cnx`."^^xsd:string ;
            sh:path s223:cnx ;
            sh:qualifiedMaxCount 1 ;
            sh:qualifiedValueShape [ sh:class s223:Connectable ] ;
            sh:qualifiedValueShapesDisjoint true ],
        [ rdfs:comment "A `ConnectionPoint` shall be associated with exactly one `Connectable` using the relation `isConnectionPointOf`."^^xsd:string ;
            sh:class s223:Connectable ;
            sh:maxCount 1 ;
            sh:message "s223: A `ConnectionPoint` shall be associated with exactly one `Connectable` using the relation `isConnectionPointOf`."^^xsd:string ;
            sh:minCount 1 ;
            sh:name "ConnectionPointToEquipmentShape"^^xsd:string ;
            sh:path s223:isConnectionPointOf ],
        [ rdfs:comment "A `ConnectionPoint` shall be associated with zero or more `EnumerationKind-Role`s using the relation `hasRole`."^^xsd:string ;
            sh:class s223:EnumerationKind-Role ;
            sh:message "s223: A `ConnectionPoint` shall be associated with zero or more `EnumerationKind-Role`s using the relation `hasRole`."^^xsd:string ;
            sh:path s223:hasRole ],
        [ rdfs:comment "A `ConnectionPoint` shall be associated with at most one other `ConnectionPoint` using the inverse of the relation `mapsTo`."^^xsd:string ;
            sh:class s223:ConnectionPoint ;
            sh:maxCount 1 ;
            sh:message "s223: A `ConnectionPoint` shall be associated with at most one other `ConnectionPoint` using the inverse of the relation `mapsTo`."^^xsd:string ;
            sh:path [ sh:inversePath s223:mapsTo ] ],
        [ rdfs:comment "A `ConnectionPoint` shall be associated with exactly one `Substance-Medium` using the relation `hasMedium`."^^xsd:string ;
            sh:class s223:Substance-Medium ;
            sh:maxCount 1 ;
            sh:message "s223: A `ConnectionPoint` shall be associated with exactly one `Substance-Medium` using the relation `hasMedium`."^^xsd:string ;
            sh:minCount 1 ;
            sh:name "ConnectionPoint medium"^^xsd:string ;
            sh:path s223:hasMedium ],
        [ rdfs:comment "A `ConnectionPoint` shall be associated with at most one other `ConnectionPoint` using the relation `mapsTo`."^^xsd:string ;
            sh:class s223:ConnectionPoint ;
            sh:maxCount 1 ;
            sh:message "s223: A `ConnectionPoint` shall be associated with at most one other `ConnectionPoint` using the relation `mapsTo`."^^xsd:string ;
            sh:path s223:mapsTo ] ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment "Subclasses of ConnectionPoint are Disjoint. An instance of a subclass of ConnectionPoint cannot be an instance of multiple such subclasses."^^xsd:string ;
            sh:message "s223: `ConnectionPoint` {$this} cannot be an instance of both {?subclass1} and {?subclass2}."^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            sh:select """
        SELECT $this ?subclass1 ?subclass2 WHERE {
            $this a ?subclass1, ?subclass2 .
            ?subclass1 a s223:Class .
            ?subclass2 a s223:Class .
            ?subclass1 rdfs:subClassOf s223:ConnectionPoint .
            ?subclass2 rdfs:subClassOf s223:ConnectionPoint .
            FILTER(?subclass1 != ?subclass2)
        }
    """^^xsd:string ] .

s223:QuantifiableProperty a s223:Class,
        sh:NodeShape ;
    rdfs:label "Quantifiable property"^^xsd:string ;
    rdfs:comment "This class is for quantifiable values that describe an object (`System`, `Equipment`, etc.) that are typically static (`hasValue`). That is, they are neither measured nor specified in the course of operations."^^xsd:string ;
    rdfs:subClassOf s223:Property ;
    sh:property [ rdfs:comment "A `QuantifiableProperty` shall be associated with at most one Boolean value using the relation `qudt:isDeltaQuantity`. If the relation `qudt:isDeltaQuantity` has a value of true, the associated value should be interpreted as a difference reading, such as a temperature difference. This is needed to distinguish between a temperature reading and a temperature difference reading, which affects unit conversion calculations."^^xsd:string ;
            sh:datatype xsd:boolean ;
            sh:maxCount 1 ;
            sh:message "s223: A `QuantifiableProperty` shall be associated with at most one Boolean value using the relation `qudt:isDeltaQuantity`. If the relation `qudt:isDeltaQuantity` has a value of true, the associated value should be interpreted as a difference reading, such as a temperature difference. This is needed to distinguish between a temperature reading and a temperature difference reading, which affects unit conversion calculations."^^xsd:string ;
            sh:path qudt:isDeltaQuantity ],
        [ rdfs:comment "A `QuantifiableProperty` shall be associated with zero or more `EnumerableProperty`s using the relation `hasAlarmStatus`."^^xsd:string ;
            sh:class s223:EnumerableProperty ;
            sh:message "s223: A `QuantifiableProperty` shall be associated with zero or more `EnumerableProperty`s using the relation `hasAlarmStatus`."^^xsd:string ;
            sh:path s223:hasAlarmStatus ],
        [ rdfs:comment "This `QuantifiableProperty` and the associated deadband use non-commensurate `Unit`s."^^xsd:string ;
            sh:path qudt:hasUnit ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "This `QuantifiableProperty` and the associated deadband use non-commensurate `Unit`s."^^xsd:string ;
                    sh:message "s223: {$this} uses `Unit` {?punit}, while deadband {?deadband} uses `Unit` {?dunit}. These are non-commensurate."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?deadband ?punit ?dunit
WHERE {
$this qudt:hasUnit ?punit .
$this s223:hasDeadband ?deadband .
?deadband qudt:hasUnit ?dunit .
?punit qudt:hasDimensionVector ?pdv .
?dunit qudt:hasDimensionVector ?ddv .
FILTER (?punit != ?dunit) .
FILTER (?pdv != ?ddv) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `QuantifiableProperty` shall be associated with zero or more `qudt:QuantityValue`s using the relation `qudt:quantityValue`. This allows to express multiple equivalent combinations of a `Unit` and value. However, typically a `QuantifiableProperty` is associated with a static decimal value using `hasValue`, along with a single `Unit` and `QuantityKind`."^^xsd:string ;
            sh:class qudt:QuantityValue ;
            sh:message "s223: A `QuantifiableProperty` shall be associated with zero or more `qudt:QuantityValue`s using the relation `qudt:quantityValue`. This allows to express multiple equivalent combinations of a `Unit` and value. However, typically a `QuantifiableProperty` is associated with a static decimal value using `hasValue`, along with a single `Unit` and `QuantityKind`."^^xsd:string ;
            sh:path qudt:quantityValue ],
        [ rdfs:comment "This `QuantifiableProperty` and the setpoint associated with it have non-commensurate `QuantityKind`s."^^xsd:string ;
            sh:path qudt:hasQuantityKind ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "This `QuantifiableProperty` and the setpoint associated with it have non-commensurate `QuantityKind`s."^^xsd:string ;
                    sh:message "s223: {$this} uses `QuantityKind` {?pqk} with DimensionVector {?pdv}, while Setpoint {?setpoint} uses `QuantityKind` {?sqk} with DimensionVector {?sdv}. These are non-commensurate"^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?setpoint ?pqk ?sqk ?pdv ?sdv
WHERE {
$this qudt:hasQuantityKind ?pqk .
$this s223:hasSetpoint ?setpoint .
?setpoint qudt:hasQuantityKind ?sqk .
?pqk qudt:hasDimensionVector ?pdv .
?sqk qudt:hasDimensionVector ?sdv .
FILTER (?pqk != ?sqk) .
FILTER (?pdv != ?sdv) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "This `QuantifiableProperty` uses a different `Unit` than the deadband associated with it."^^xsd:string ;
            sh:path qudt:hasUnit ;
            sh:severity sh:Info ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "This `QuantifiableProperty` uses a different `Unit` than the deadband associated with it."^^xsd:string ;
                    sh:message "s223: {$this} uses `Unit` {?punit}, while deadband {?deadband} uses `Unit` {?dunit}. Be careful."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?deadband ?punit ?dunit
WHERE {
$this qudt:hasUnit ?punit .
$this s223:hasDeadband ?deadband .
?deadband qudt:hasUnit ?dunit .
?punit qudt:hasDimensionVector ?pdv .
?dunit qudt:hasDimensionVector ?ddv .
FILTER (?punit != ?dunit) .
FILTER (?pdv = ?ddv) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "This `QuantifiableProperty` uses a different `Unit` than the threshold associated with it."^^xsd:string ;
            sh:path qudt:hasUnit ;
            sh:severity sh:Info ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "This `QuantifiableProperty` uses a different `Unit` than the threshold associated with it."^^xsd:string ;
                    sh:message "s223: {$this} uses `Unit` {?punit}, while threshold {?threshold} uses `Unit` {?tunit}. Be careful."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?threshold ?punit ?tunit
WHERE {
$this qudt:hasUnit ?punit .
$this s223:hasThreshold ?threshold .
?threshold qudt:hasUnit ?tunit .
?punit qudt:hasDimensionVector ?pdv .
?tunit qudt:hasDimensionVector ?tdv .
FILTER (?punit != ?tunit) .
FILTER (?pdv = ?tdv) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "This `QuantifiableProperty` cannot have a value without a `Unit`."^^xsd:string ;
            sh:path s223:hasValue ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "This `QuantifiableProperty` cannot have a value without a `Unit`."^^xsd:string ;
                    sh:message "s223: {$this} referenced by {?subject} has a value of {?v} but does not specify a `Unit`."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?v ?subject
WHERE {
$this s223:hasValue ?v .
FILTER NOT EXISTS {$this qudt:hasUnit ?u} .
?subject ?p $this .
}
"""^^xsd:string ] ],
        [ rdfs:comment "This `QuantifiableProperty` and the threshold associated with it have non-commensurate `QuantityKind`s."^^xsd:string ;
            sh:path qudt:hasQuantityKind ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "This `QuantifiableProperty` and the threshold associated with it have non-commensurate `QuantityKind`s."^^xsd:string ;
                    sh:message "s223: {$this} uses `QuantityKind` {?pqk} with DimensionVector {?pdv}, while threshold {?threshold} uses `QuantityKind` {?tqk} with DimensionVector {?tdv}. These are non-commensurate"^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?threshold ?pqk ?sqk ?pdv ?sdv
WHERE {
$this qudt:hasQuantityKind ?pqk .
$this s223:hasThreshold ?threshold .
?threshold qudt:hasQuantityKind ?tqk .
?pqk qudt:hasDimensionVector ?pdv .
?tqk qudt:hasDimensionVector ?tdv .
FILTER (?pqk != ?tqk) .
FILTER (?pdv != ?tdv) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `QuantifiableProperty` shall be associated with zero or more other `QuantifiableProperty`s using the relation `hasDeadband`."^^xsd:string ;
            sh:class s223:QuantifiableProperty ;
            sh:message "s223: A `QuantifiableProperty` shall be associated with zero or more other `QuantifiableProperty`s using the relation `hasDeadband`."^^xsd:string ;
            sh:path s223:hasDeadband ],
        [ rdfs:comment "A `QuantifiableProperty` shall be associated with zero or more other `QuantifiableProperty`s using the relation `hasThreshold`."^^xsd:string ;
            sh:class s223:QuantifiableProperty ;
            sh:message "s223: A `QuantifiableProperty` shall be associated with zero or more other `QuantifiableProperty`s using the relation `hasThreshold`."^^xsd:string ;
            sh:path s223:hasThreshold ],
        [ rdfs:comment "A `QuantifiableProperty` shall be associated with at most one `Unit` using the relation `qudt:hasUnit`."^^xsd:string ;
            sh:class qudt:Unit ;
            sh:maxCount 1 ;
            sh:message "s223: A `QuantifiableProperty` shall be associated with at most one `Unit` using the relation `qudt:hasUnit`."^^xsd:string ;
            sh:path qudt:hasUnit ],
        [ rdfs:comment "This `QuantifiableProperty` and the deadband associated with it have non-commensurate `QuantityKind`s."^^xsd:string ;
            sh:path qudt:hasQuantityKind ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "This `QuantifiableProperty` and the deadband associated with it have non-commensurate `QuantityKind`s."^^xsd:string ;
                    sh:message "s223: {$this} uses `QuantityKind` {?pqk} with DimensionVector {?pdv}, while deadband {?deadband} uses `QuantityKind` {?dqk} with DimensionVector {?ddv}. These are non-commensurate"^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?deadband ?pqk ?dqk ?pdv ?ddv
WHERE {
$this qudt:hasQuantityKind ?pqk .
$this s223:hasDeadband ?deadband .
?deadband qudt:hasQuantityKind ?dqk .
?pqk qudt:hasDimensionVector ?pdv .
?dqk qudt:hasDimensionVector ?ddv .
FILTER (?pqk != ?dqk) .
FILTER (?pdv != ?ddv) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "This `QuantifiableProperty` uses a different `Unit` than the setpoint associated with it."^^xsd:string ;
            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."^^xsd:string ;
                    sh:message "s223: {$this} uses `Unit` {?punit}, while setpoint {?setpoint} uses `Unit` {?sunit}. Be careful."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?setpoint ?punit ?sunit
WHERE {
$this qudt:hasUnit ?punit .
$this s223:hasSetpoint ?setpoint .
?setpoint qudt:hasUnit ?sunit .
?punit qudt:hasDimensionVector ?pdv .
?sunit qudt:hasDimensionVector ?sdv .
FILTER (?punit != ?sunit) .
FILTER (?pdv = ?sdv) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `QuantifiableProperty` shall be associated with exactly one `QuantityKind` using the relation `qudt:hasQuantityKind`."^^xsd:string ;
            sh:class qudt:QuantityKind ;
            sh:maxCount 1 ;
            sh:message "s223: A `QuantifiableProperty` shall be associated with exactly one `QuantityKind` using the relation `qudt:hasQuantityKind`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path qudt:hasQuantityKind ],
        [ rdfs:comment "A `QuantifiableProperty` should use `hasValue` instead of `qudt:value`."^^xsd:string ;
            sh:maxCount 0 ;
            sh:message "s223: A `QuantifiableProperty` should use `hasValue` instead of `qudt:value`."^^xsd:string ;
            sh:path qudt:value ],
        [ rdfs:comment "This `QuantifiableProperty` and the associated threshold use non-commensurate `Unit`s."^^xsd:string ;
            sh:path qudt:hasUnit ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "This `QuantifiableProperty` and the associated threshold use non-commensurate `Unit`s."^^xsd:string ;
                    sh:message "s223: {$this} uses `Unit` {?punit}, while threshold {?threshold} uses `Unit` {?tunit}. These are non-commensurate."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?threshold ?punit ?tunit
WHERE {
$this qudt:hasUnit ?punit .
$this s223:hasThreshold ?threshold .
?threshold qudt:hasUnit ?tunit .
?punit qudt:hasDimensionVector ?pdv .
?tunit qudt:hasDimensionVector ?tdv .
FILTER (?punit != ?tunit) .
FILTER (?pdv != ?tdv) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "This `QuantifiableProperty` and the associated setpoint use non-commensurate `Unit`s."^^xsd:string ;
            sh:path qudt:hasUnit ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "This `QuantifiableProperty` and the associated setpoint use non-commensurate `Unit`s."^^xsd:string ;
                    sh:message "s223: {$this} uses `Unit` {?punit}, while setpoint {?setpoint} uses `Unit` {?sunit}. These are non-commensurate."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?setpoint ?punit ?sunit
WHERE {
$this qudt:hasUnit ?punit .
$this s223:hasSetpoint ?setpoint .
?setpoint qudt:hasUnit ?sunit .
?punit qudt:hasDimensionVector ?pdv .
?sunit qudt:hasDimensionVector ?sdv .
FILTER (?punit != ?sunit) .
FILTER (?pdv != ?sdv) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "A `QuantifiableProperty` shall be associated with zero or more other `QuantifiableProperty`s using the relation `hasSetpoint`. This can be used to indicate the desired value which the control process is trying to maintain."^^xsd:string ;
            sh:class s223:QuantifiableProperty ;
            sh:message "s223: A `QuantifiableProperty` shall be associated with zero or more other `QuantifiableProperty`s using the relation `hasSetpoint`. This can be used to indicate the desired value which the control process is trying to maintain."^^xsd:string ;
            sh:path s223:hasSetpoint ] ;
    sh:sparql [ a sh:SPARQLConstraint ;
            rdfs:comment "Checks for consistent dimension vectors for a `QuantityKind` and the `Unit`"^^xsd:string ;
            sh:message "s223: Inconsistent dimensionalities among the `Property`'s `Unit` and `Property`'s `QuantityKind`"^^xsd:string ;
            sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
            sh:select """
SELECT $this
   WHERE
{
      $this qudt:hasQuantityKind/qudt:hasDimensionVector ?qkdv1 .
      $this qudt:hasUnit/qudt:hasDimensionVector ?qkdv2 .
FILTER (?qkdv1 != ?qkdv2) .
}
"""^^xsd:string ] .

s223:EnumerationKind-Role a s223:Class,
        s223:EnumerationKind-Role,
        sh:NodeShape ;
    rdfs:label "Role"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent roles played by entities, such as cooling, generator,
relief, and return. These enumeration kinds are intended to indicate the capability of an entity to play a given
role, rather than the role being actively played at any given point in time. For example,
a reversible piece of equipment might play a role of `Role-Cooling` at one time, and `Role-Heating` at another time.
Such an entity would be modeled using the `hasRole` relation with both role values. The active role at a particular time can be modeled as a `Property` with
an `ExternalReference` to telemetry data.

: EnumerationKind-Role Enumerations

| Enumeration |
|:-----------|
| `Role-Condenser` |
| `Role-Cooling` |
| `Role-Dehumidifying` |
| `Role-Discharge` |
| `Role-Economizer` |
| `Role-Evaporator` |
| `Role-Exhaust` |
| `Role-Expansion` |
| `Role-Generator` |
| `Role-Heating` |
| `Role-HeatRecovery` |
| `Role-HeatTransfer` |
| `Role-Load` |
| `Role-OutdoorAirIntake` |
| `Role-Primary` |
| `Role-Recirculating` |
| `Role-Relief` |
| `Role-Return` |
| `Role-Secondary` |
| `Role-Supply` |
| `Role-Ventilating` |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind .

s223:Frequency-50Hz a s223:Class,
        s223:Frequency-50Hz,
        sh:NodeShape ;
    rdfs:label "50 Hertz"^^xsd:string ;
    s223:hasValue 50.0 ;
    qudt:hasQuantityKind quantitykind:Frequency ;
    qudt:hasUnit unit:HZ ;
    rdfs:comment "Frequency-50Hz"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Frequency .

qudt:hasQuantityKind rdfs:comment "A reference to the `QuantityKind` of a `QuantifiableProperty` of interest, such as `Temperature`."^^xsd:string .

s223:NumberOfElectricalPhases-ThreePhase a s223:Class,
        s223:NumberOfElectricalPhases-ThreePhase,
        sh:NodeShape ;
    rdfs:label "Three phase"^^xsd:string ;
    s223:hasValue 3.0 ;
    qudt:hasQuantityKind quantitykind:NumberOfElectricalPhases ;
    qudt:hasUnit unit:NUM ;
    rdfs:comment "Three phase"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-NumberOfElectricalPhases .

s223:Fluid-Air a s223:Class,
        s223:Fluid-Air,
        sh:NodeShape ;
    rdfs:label "Air"^^xsd:string ;
    rdfs:comment "Fluid-Air."^^xsd:string ;
    rdfs:subClassOf s223:Mix-Fluid .

s223:Constituent-Refrigerant a s223:Class,
        s223:Constituent-Refrigerant,
        sh:NodeShape ;
    rdfs:label "Refrigerant"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent commonly used refrigerants. The composition of the refrigerants is defined in ASHRAE Standard 34 and ISO 817.

: Constituent-Refrigerant Enumerations

| Enumeration |
|:-----------|
| `Refrigerant-R-22` |
| `Refrigerant-R-32` |
| `Refrigerant-R-123` |
| `Refrigerant-R-134A` |
| `Refrigerant-R-290` |
| `Refrigerant-R-404A` |
| `Refrigerant-R-407A` |
| `Refrigerant-R-407C` |
| `Refrigerant-R-407F` |
| `Refrigerant-R-410A` |
| `Refrigerant-R-422A` |
| `Refrigerant-R-422C` |
| `Refrigerant-R-422D` |
| `Refrigerant-R-427A` |
| `Refrigerant-R-438A` |
| `Refrigerant-R-444A` |
| `Refrigerant-R-445A` |
| `Refrigerant-R-448A` |
| `Refrigerant-R-449A` |
| `Refrigerant-R-450A` |
| `Refrigerant-R-454A` |
| `Refrigerant-R-454C` |
| `Refrigerant-R-455A` |
| `Refrigerant-R-457A` |
| `Refrigerant-R-459B` |
| `Refrigerant-R-507` |
| `Refrigerant-R-513A` |
| `Refrigerant-R-516A` |
| `Refrigerant-R-600A` |
| `Refrigerant-R-717` |
| `Refrigerant-R-744` |
| `Refrigerant-R-1234yf` |
| `Refrigerant-R-1234ze` |"""^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:Fluid-Water a s223:Class,
        s223:Fluid-Water,
        sh:NodeShape ;
    rdfs:label "Water"^^xsd:string ;
    s223:composedOf [ a s223:QuantifiableProperty ;
            rdfs:label "H2O, i.e., pure water concentration"^^xsd:string ;
            s223:ofConstituent s223:Constituent-H2O ;
            qudt:hasQuantityKind quantitykind:VolumeFraction ;
            qudt:hasUnit unit:PERCENT ] ;
    rdfs:comment """This class and its enumerated subclasses represent water and aqueous solutions in various states.

: Fluid-Water Enumerations

| Enumeration |
|:-----------|
| `Water-ChilledWater` |
| `Water-GlycolSolution` (see {s223:Water-GlycolSolution}) |
| `Water-HotWater` |
| `Water-Steam` |"""^^xsd:string ;
    rdfs:subClassOf s223:Mix-Fluid .

s223:Numerical-Voltage a s223:Class,
        s223:Numerical-Voltage,
        sh:NodeShape ;
    rdfs:label "Voltage"^^xsd:string ;
    qudt:hasQuantityKind quantitykind:Voltage ;
    qudt:hasUnit unit:V ;
    rdfs:comment """This class and its enumerated subclasses represent common voltages for electricity service.

: Numerical-Voltage Enumerations

| Enumeration |
|:-----------|
| `Voltage-0V` |
| `Voltage-2.5V` |
| `Voltage-3V` |
| `Voltage-5V` |
| `Voltage-6V` |
| `Voltage-12V` |
| `Voltage-24V` |
| `Voltage-48V` |
| `Voltage-110V` |
| `Voltage-120V` |
| `Voltage-127V` |
| `Voltage-139V` |
| `Voltage-190V` |
| `Voltage-208V` |
| `Voltage-219V` |
| `Voltage-220V` |
| `Voltage-230V` |
| `Voltage-240V` |
| `Voltage-277V` |
| `Voltage-347V` |
| `Voltage-380V` |
| `Voltage-400V` |
| `Voltage-415V` |
| `Voltage-480V` |
| `Voltage-600V` |
| `Voltage-1730V` |
| `Voltage-1900V` |
| `Voltage-2400V` |
| `Voltage-3000V` |
| `Voltage-3300V` |
| `Voltage-3460V` |
| `Voltage-3810V` |
| `Voltage-4160V` |
| `Voltage-5770V` |
| `Voltage-6000V` |
| `Voltage-6600V` |
| `Voltage-10000V` |
| `Voltage-PoE` (see {s223:Voltage-PoE}) |"""^^xsd:string ;
    rdfs:subClassOf s223:EnumerationKind-Numerical ;
    sh:property [ rdfs:comment "A `Numerical-Voltage` shall have a `QuantityKind` of `Voltage`."^^xsd:string ;
            sh:in ( quantitykind:Voltage ) ;
            sh:message "s223: A `Numerical-Voltage` shall have a `QuantityKind` of `Voltage`."^^xsd:string ;
            sh:path qudt:hasQuantityKind ],
        [ rdfs:comment "A `Numerical-Voltage` shall have a `Unit` of `V` (volt)."^^xsd:string ;
            sh:in ( unit:V ) ;
            sh:message "s223: A `Numerical-Voltage` shall have a `Unit` of `V` (volt)."^^xsd:string ;
            sh:path qudt:hasUnit ] .

s223:Constituent-Electricity a s223:Class,
        s223:Constituent-Electricity,
        sh:NodeShape ;
    rdfs:label "Electricity"^^xsd:string ;
    rdfs:comment """This class and its enumerated subclasses represent common forms of electrical energy, including AC, DC, and electrical communication signals.

: Constituent-Electricity Enumerations

| Enumeration |
|:-----------|
| `Electricity-AC` (see {s223:Electricity-AC}) |
| `Electricity-DC` (see {s223:Electricity-DC}) |
| `Electricity-Earth` |
| `Electricity-Neutral` |
| `Electricity-Signal` (see {s223:Electricity-Signal}) |"""^^xsd:string ;
    rdfs:subClassOf s223:Medium-Constituent .

s223:NumberOfElectricalPhases-SinglePhase a s223:Class,
        s223:NumberOfElectricalPhases-SinglePhase,
        sh:NodeShape ;
    rdfs:label "Single phase"^^xsd:string ;
    s223:hasValue 1.0 ;
    qudt:hasQuantityKind quantitykind:NumberOfElectricalPhases ;
    qudt:hasUnit unit:NUM ;
    rdfs:comment "Single phase"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-NumberOfElectricalPhases .

s223:Frequency-60Hz a s223:Class,
        s223:Frequency-60Hz,
        sh:NodeShape ;
    rdfs:label "60 Hertz"^^xsd:string ;
    s223:hasValue 60.0 ;
    qudt:hasQuantityKind quantitykind:Frequency ;
    qudt:hasUnit unit:HZ ;
    rdfs:comment "Frequency-60Hz"^^xsd:string ;
    rdfs:subClassOf s223:Numerical-Frequency .

s223:OutletConnectionPoint a s223:Class,
        sh:NodeShape ;
    rdfs:label "Outlet connection point"^^xsd:string ;
    rdfs:comment "An `OutletConnectionPoint` is a `ConnectionPoint` for which a `Substance-Medium` is expected to flow out of the associated `Connectable`."^^xsd:string ;
    rdfs:subClassOf s223:ConnectionPoint ;
    sh:property [ rdfs:comment "An `OutletConnectionPoint` shall be associated with at most one other `OutletConnectionPoint` using the relation `mapsTo`."^^xsd:string ;
            sh:class s223:OutletConnectionPoint ;
            sh:maxCount 1 ;
            sh:message "s223: An `OutletConnectionPoint` shall be associated with at most one other `OutletConnectionPoint` using the relation `mapsTo`."^^xsd:string ;
            sh:path s223:mapsTo ],
        [ rdfs:comment "An `OutletConnectionPoint` shall be associated with at most one `InletConnectionPoint` or `BidirectionalConnectionPoint` using the relation `pairedConnectionPoint`."^^xsd:string ;
            sh:maxCount 1 ;
            sh:message "s223: An `OutletConnectionPoint` shall be associated with at most one `InletConnectionPoint` or `BidirectionalConnectionPoint` using the relation `pairedConnectionPoint`."^^xsd:string ;
            sh:path s223:pairedConnectionPoint ;
            sh:xor ( [ sh:class s223:InletConnectionPoint ] [ sh:class s223:BidirectionalConnectionPoint ] ) ],
        [ rdfs:comment "Ensure an `OutletConnectionPoint` has a `mapsTo` relation to its containing `Equipment` if it has an external `Connection`."^^xsd:string ;
            sh:path s223:mapsTo ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Ensure an `OutletConnectionPoint` has a `mapsTo` relation to its containing `Equipment` if it has an external `Connection`."^^xsd:string ;
                    sh:message "s223: {$this} must have a `mapsTo` an `OutletConnectionPoint` of {?parentEquipment} and not an external `Connection` to {?destinationEquipment}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?parentEquipment ?destinationEquipment
WHERE {
?equipment s223:hasConnectionPoint $this .
?parentEquipment s223:contains ?equipment .
$this s223:connectsThrough/s223:connectsTo ?destinationEquipment .
FILTER NOT EXISTS {?parentEquipment s223:contains ?destinationEquipment} .
FILTER NOT EXISTS {$this s223:mapsTo ?anything} .
}
"""^^xsd:string ] ] .

rdf:Property a sh:NodeShape ;
    sh:property [ rdfs:comment "Every `Property` must have a comment."^^xsd:string ;
            sh:path rdfs:comment ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    sh:message "s223: {$this} must have an rdfs:comment"^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    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}) .
}
"""^^xsd:string ] ],
        [ rdfs:comment "Every `Property` must have a label."^^xsd:string ;
            sh:path rdfs:label ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    sh:message "s223: {$this} must have an rdfs:label"^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this
WHERE {
BIND(REPLACE(STR($this), "^(.*)(/|#)([^#/]*)$", "$1") AS ?prop) .
FILTER (?prop = "http://data.ashrae.org/standard223") .
FILTER (NOT EXISTS {$this rdfs:label ?something}) .
}
"""^^xsd:string ] ] .

s223:Equipment a s223:Class,
        sh:NodeShape ;
    rdfs:label "Equipment"^^xsd:string ;
    rdfs:comment """`Equipment` is the modeling construct used to represent a thing designed to accomplish a specific task, or a complex thing
that contains component pieces of `Equipment` that are connected to each other and work together to accomplish a task. `Equipment` can have
`Connection`s and `ConnectionPoint`s through which one or more kinds of medium (see {s223:Substance-Medium}) might flow. Examples of `Equipment` defined in this ontology include `Pump`, `Fan`, `AirHeatExchanger`, `Luminaire`, and `Sensor`. `Equipment` can be connected to other `Connectable`s such as other `Equipment` or `DomainSpace`s.

The graphical depiction of Equipment used in this document is a round-cornered rectangle as shown in Figure 5-1.

![Graphical Depiction of Equipment.](figures/Figure_5-1_Graphical_Depiciton_of_Equipment.svg)"""^^xsd:string ;
    rdfs:subClassOf s223:Connectable ;
    sh:property [ a sh:PropertyShape ;
            rdfs:comment "A piece of `Equipment` shall be associated with zero or more other pieces of contained `Equipment` and/or `Junction`s using the relation `contains`."^^xsd:string ;
            sh:message "s223: A piece of `Equipment` shall be associated with zero or more other pieces of contained `Equipment` and/or `Junction`s using the relation `contains`."^^xsd:string ;
            sh:name "device contains shape"^^xsd:string ;
            sh:or ( [ sh:class s223:Equipment ] [ sh:class s223:Junction ] ) ;
            sh:path s223:contains ],
        [ rdfs:comment "A piece of `Equipment` shall be associated with zero or more `PhysicalSpace`s using the relation `hasPhysicalLocation`."^^xsd:string ;
            sh:class s223:PhysicalSpace ;
            sh:message "s223: A piece of `Equipment` shall be associated with zero or more `PhysicalSpace`s using the relation `hasPhysicalLocation`."^^xsd:string ;
            sh:path s223:hasPhysicalLocation ],
        [ rdfs:comment "Disallow contained equipment from having external incoming connections."^^xsd:string ;
            sh:message "s223: Disallow contained equipment from having external incoming connections."^^xsd:string ;
            sh:path s223:connectedFrom ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Disallow contained equipment from having external incoming connections."^^xsd:string ;
                    sh:message "s223: {$this} should not have a connection from external equipment {?otherDev} because {?container} contains {$this}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?container ?otherDev
WHERE {
$this s223:connectedFrom ?otherDev .
$this ^s223:contains ?container .
?container a/rdfs:subClassOf* s223:Equipment .
FILTER NOT EXISTS {?container s223:contains ?otherDev .}
}
"""^^xsd:string ] ],
        [ rdfs:comment "A piece of `Equipment` shall be associated with zero or more `Function`s using the relation `executes`."^^xsd:string ;
            sh:class s223:Function ;
            sh:message "s223: A piece of `Equipment` shall be associated with zero or more `Function`s using the relation `executes`."^^xsd:string ;
            sh:path s223:executes ],
        [ rdfs:comment "A piece of `Equipment` shall be associated with zero or more `EnumerationKind-Role`s using the relation `hasRole`."^^xsd:string ;
            sh:class s223:EnumerationKind-Role ;
            sh:message "s223: A piece of `Equipment` shall be associated with zero or more `EnumerationKind-Role`s using the relation `hasRole`."^^xsd:string ;
            sh:path s223:hasRole ],
        [ rdfs:comment "A piece of `Equipment` shall be associated with zero or more `ActuatableProperty`s using the relation `actuatedByProperty`."^^xsd:string ;
            sh:class s223:ActuatableProperty ;
            sh:message "s223: A piece of `Equipment` shall be associated with zero or more `ActuatableProperty`s using the relation `actuatedByProperty`."^^xsd:string ;
            sh:path s223:actuatedByProperty ],
        [ rdfs:comment "Warning about a subclass of `Equipment` of type A containing something that is in the same subclass branch."^^xsd:string ;
            sh:message "s223: Warning about a subclass of `Equipment` of type A containing something that is in the same subclass branch."^^xsd:string ;
            sh:path s223:contains ;
            sh:severity sh:Warning ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Warning about a subclass of `Equipment` of type A containing something that is in the same subclass branch."^^xsd:string ;
                    sh:message "s223: {$this}, of type {?type1}, contains {?subEquip} of type {?type2}, that could result in double-counting items in the class hierarchy of {?type1}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?subEquip ?type1 ?type2
WHERE {
  FILTER NOT EXISTS {$this a s223:Equipment} .
$this s223:contains+ ?subEquip .
  FILTER NOT EXISTS {?subEquip a s223:Equipment} .
$this a ?type1 .
?subEquip a ?type2 .
{
?type2 rdfs:subClassOf* ?type1 .
}
UNION
{
?type1 rdfs:subClassOf* ?type2 .
}
}
"""^^xsd:string ] ],
        [ rdfs:comment "Disallow contained equipment from having external outgoing connections."^^xsd:string ;
            sh:message "s223: Disallow contained equipment from having external outgoing connections."^^xsd:string ;
            sh:path s223:connectedTo ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Disallow contained equipment from having external outgoing connections."^^xsd:string ;
                    sh:message "s223: {$this} should not have a connection to external equipment {?otherDev} because {?container} contains {$this}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?container ?otherDev
WHERE {
$this s223:connectedTo ?otherDev .
$this ^s223:contains ?container .
?container a/rdfs:subClassOf* s223:Equipment .
FILTER NOT EXISTS {?container s223:contains ?otherDev .}
}
"""^^xsd:string ] ] .

s223:Electricity-AC a s223:Class,
        s223:Electricity-AC,
        sh:NodeShape ;
    rdfs:label "AC electricity"^^xsd:string ;
    s223:hasFrequency s223:Numerical-Frequency ;
    s223:hasNumberOfElectricalPhases s223:Numerical-NumberOfElectricalPhases ;
    rdfs:comment """This class and its enumerated subclasses represent common AC electricity services.

: Electricity-AC Enumerations

| Enumeration |
|:-----------|
| `AC-24VLN-1Ph-50Hz` |
| `AC-24VLN-1Ph-60Hz` |
| `AC-110VLN-1Ph-50Hz` |
| `AC-120VLN-1Ph-60Hz` |
| `AC-127VLN-1Ph-50Hz` |
| `AC-139VLN-1Ph-50Hz` |
| `AC-190VLL-1Ph-50Hz` |
| `AC-190VLL-3Ph-50Hz` |
| `AC-190VLL-110VLN-1Ph-50Hz` |
| `AC-190VLL-110VLN-3Ph-50Hz` |
| `AC-208VLL-1Ph-60Hz` |
| `AC-208VLL-3Ph-60Hz` |
| `AC-208VLL-120VLN-1Ph-60Hz` |
| `AC-208VLL-120VLN-3Ph-60Hz` |
| `AC-208VLN-1Ph-60Hz` |
| `AC-219VLN-1Ph-60Hz` |
| `AC-220VLL-1Ph-50Hz` |
| `AC-220VLL-3Ph-50Hz` |
| `AC-220VLL-127VLN-1Ph-50Hz` |
| `AC-220VLL-127VLN-3Ph-50Hz` |
| `AC-230VLN-1Ph-50Hz` |
| `AC-240VLL-1Ph-50Hz` |
| `AC-240VLL-1Ph-60Hz` |
| `AC-240VLL-3Ph-50Hz` |
| `AC-240VLL-3Ph-60Hz` |
| `AC-240VLL-120VLN-1Ph-60Hz` |
| `AC-240VLL-139VLN-1Ph-50Hz` |
| `AC-240VLL-139VLN-3Ph-50Hz` |
| `AC-240VLL-208VLN-120VLN-1Ph-60Hz` |
| `AC-240VLL-208VLN-120VLN-3Ph-60Hz` |
| `AC-240VLN-1Ph-50Hz` |
| `AC-277VLN-1Ph-60Hz` |
| `AC-347VLN-1Ph-60Hz` |
| `AC-380VLL-1Ph-60Hz` |
| `AC-380VLL-3Ph-60Hz` |
| `AC-380VLL-219VLN-1Ph-60Hz` |
| `AC-380VLL-219VLN-3Ph-60Hz` |
| `AC-400VLL-1Ph-50Hz` |
| `AC-400VLL-3Ph-50Hz` |
| `AC-400VLL-230VLN-1Ph-50Hz` |
| `AC-400VLL-230VLN-3Ph-50Hz` |
| `AC-415VLL-1Ph-50Hz` |
| `AC-415VLL-3Ph-50Hz` |
| `AC-415VLL-240VLN-1Ph-50Hz` |
| `AC-415VLL-240VLN-3Ph-50Hz` |
| `AC-480VLL-1Ph-60Hz` |
| `AC-480VLL-3Ph-60Hz` |
| `AC-480VLL-277VLN-1Ph-60Hz` |
| `AC-480VLL-277VLN-3Ph-60Hz` |
| `AC-600VLL-1Ph-60Hz` |
| `AC-600VLL-3Ph-60Hz` |
| `AC-600VLL-347VLN-1Ph-60Hz` |
| `AC-600VLL-347VLN-3Ph-60Hz` |
| `AC-1730VLN-1Ph-60Hz` |
| `AC-1900VLN-1Ph-60Hz` |
| `AC-2400VLN-1Ph-60Hz` |
| `AC-3000VLL-1Ph-60Hz` |
| `AC-3000VLL-3Ph-60Hz` |
| `AC-3000VLL-1730VLN-1Ph-60Hz` |
| `AC-3000VLL-1730VLN-3Ph-60Hz` |
| `AC-3300VLL-1Ph-60Hz` |
| `AC-3300VLL-3Ph-60Hz` |
| `AC-3300VLL-1900VLN-1Ph-60Hz` |
| `AC-3300VLL-1900VLN-3Ph-60Hz` |
| `AC-3460VLN-1Ph-60Hz` |
| `AC-3810VLN-1Ph-60Hz` |
| `AC-4160VLL-1Ph-60Hz` |
| `AC-4160VLL-3Ph-60Hz` |
| `AC-4160VLL-2400VLN-1Ph-60Hz` |
| `AC-4160VLL-2400VLN-3Ph-60Hz` |
| `AC-5770VLN-1Ph-60Hz` |
| `AC-6000VLL-1Ph-60Hz` |
| `AC-6000VLL-3Ph-60Hz` |
| `AC-6000VLL-3460VLN-1Ph-60Hz` |
| `AC-6000VLL-3460VLN-3Ph-60Hz` |
| `AC-6600VLL-1Ph-60Hz` |
| `AC-6600VLL-3Ph-60Hz` |
| `AC-6600VLL-3810VLN-1Ph-60Hz` |
| `AC-6600VLL-3810VLN-3Ph-60Hz` |
| `AC-10000VLL-1Ph-60Hz` |
| `AC-10000VLL-3Ph-60Hz` |
| `AC-10000VLL-5770VLN-1Ph-60Hz` |
| `AC-10000VLL-5770VLN-3Ph-60Hz` |"""^^xsd:string ;
    rdfs:subClassOf s223:Constituent-Electricity ;
    sh:property [ rdfs:comment "An `Electricity-AC` shall be associated with at least one `Numerical-Frequency` using the relation `hasFrequency`."^^xsd:string ;
            sh:class s223:Numerical-Frequency ;
            sh:message "s223: An `Electricity-AC` shall be associated with at least one `Numerical-Frequency` using the relation `hasFrequency`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasFrequency ],
        [ rdfs:comment "An `Electricity-AC` shall be associated with zero or more `Numerical-Voltage`s using the relation `hasACLineLineVoltage`."^^xsd:string ;
            sh:class s223:Numerical-Voltage ;
            sh:message "s223: An `Electricity-AC` shall be associated with zero or more `Numerical-Voltage`s using the relation `hasACLineLineVoltage`."^^xsd:string ;
            sh:path s223:hasACLineLineVoltage ],
        [ rdfs:comment "An `Electricity-AC` shall be associated with at least one `Numerical-NumberOfElectricalPhases` using the relation `hasNumberOfElectricalPhases`."^^xsd:string ;
            sh:class s223:Numerical-NumberOfElectricalPhases ;
            sh:message "s223: An `Electricity-AC` shall be associated with at least one `Numerical-NumberOfElectricalPhases` using the relation `hasNumberOfElectricalPhases`."^^xsd:string ;
            sh:minCount 1 ;
            sh:path s223:hasNumberOfElectricalPhases ],
        [ rdfs:comment "An `Electricity-AC` shall be associated with zero or more `Numerical-Voltage`s using the relation `hasACLineNeutralVoltage`."^^xsd:string ;
            sh:class s223:Numerical-Voltage ;
            sh:message "s223: An `Electricity-AC` shall be associated with zero or more `Numerical-Voltage`s using the relation `hasACLineNeutralVoltage`."^^xsd:string ;
            sh:path s223:hasACLineNeutralVoltage ] .

s223:InletConnectionPoint a s223:Class,
        sh:NodeShape ;
    rdfs:label "Inlet connection point"^^xsd:string ;
    rdfs:comment "An `InletConnectionPoint` is a `ConnectionPoint` for which a `Substance-Medium` is expected to flow into the associated `Connectable`."^^xsd:string ;
    rdfs:subClassOf s223:ConnectionPoint ;
    sh:property [ rdfs:comment "Ensure an `InletConnectionPoint` has a `mapsTo` relation to its containing `Equipment` if it has an external `Connection`"^^xsd:string ;
            sh:path s223:mapsTo ;
            sh:sparql [ a sh:SPARQLConstraint ;
                    rdfs:comment "Ensure an `InletConnectionPoint` has a `mapsTo` relation to its containing `Equipment` if it has an external `Connection`"^^xsd:string ;
                    sh:message "s223: {$this} must have a `mapsTo` an `InletConnectionPoint` of {?parentEquipment} and not an external `Connection` from {?sourceEquipment}."^^xsd:string ;
                    sh:prefixes <http://data.ashrae.org/standard223/1.0/model/all> ;
                    sh:select """
SELECT $this ?parentEquipment ?sourceEquipment
WHERE {
?equipment s223:hasConnectionPoint $this .
?parentEquipment s223:contains ?equipment .
$this s223:connectsThrough/s223:connectsFrom ?sourceEquipment .
FILTER NOT EXISTS {?parentEquipment s223:contains ?sourceEquipment} .
FILTER NOT EXISTS {$this s223:mapsTo ?anything} .
}
"""^^xsd:string ] ],
        [ rdfs:comment "An `InletConnectionPoint` shall be associated with at most one other `InletConnectionPoint` using the relation `mapsTo`."^^xsd:string ;
            sh:class s223:InletConnectionPoint ;
            sh:maxCount 1 ;
            sh:message "s223: An `InletConnectionPoint` shall be associated with at most one other `InletConnectionPoint` using the relation `mapsTo`."^^xsd:string ;
            sh:path s223:mapsTo ],
        [ rdfs:comment "An `InletConnectionPoint` shall be associated with at most one `OutletConnectionPoint` or `BidirectionalConnectionPoint` using the relation `pairedConnectionPoint`."^^xsd:string ;
            sh:maxCount 1 ;
            sh:message "s223: An `InletConnectionPoint` shall be associated with at most one `OutletConnectionPoint` or `BidirectionalConnectionPoint` using the relation `pairedConnectionPoint`."^^xsd:string ;
            sh:path s223:pairedConnectionPoint ;
            sh:xor ( [ sh:class s223:OutletConnectionPoint ] [ sh:class s223:BidirectionalConnectionPoint ] ) ] .

<http://data.ashrae.org/standard223/1.0/model/all> a owl:Ontology ;
    owl:imports <http://qudt.org/3.1.8/shacl/qudt-all>,
        sh: ;
    owl:versionInfo "1.0.0-ppr.2.1" ;
    sh:declare [ sh:namespace "http://data.ashrae.org/standard223/1.0/vocab/role#"^^xsd:anyURI ;
            sh:prefix "role"^^xsd:string ],
        [ sh:namespace "http://qudt.org/vocab/unit/"^^xsd:anyURI ;
            sh:prefix "unit"^^xsd:string ],
        [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ;
            sh:prefix "qudtqk"^^xsd:string ],
        [ sh:namespace "http://qudt.org/vocab/quantitykind/"^^xsd:anyURI ;
            sh:prefix "quantitykind"^^xsd:string ],
        [ sh:namespace "http://www.w3.org/ns/shacl#"^^xsd:anyURI ;
            sh:prefix "sh"^^xsd:string ],
        [ sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;
            sh:prefix "rdf"^^xsd:string ],
        [ sh:namespace "http://data.ashrae.org/standard223#"^^xsd:anyURI ;
            sh:prefix "s223"^^xsd:string ],
        [ sh:namespace "http://qudt.org/schema/qudt/"^^xsd:anyURI ;
            sh:prefix "qudt"^^xsd:string ],
        [ sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ;
            sh:prefix "rdfs"^^xsd:string ] .

s223:hasConnectionPoint a s223:RelationWithInverse,
        rdf:Property ;
    rdfs:label "has connection point"^^xsd:string ;
    s223:inverseOf s223:isConnectionPointOf ;
    rdfs:comment "One of two `Relation`s that associates `Connectable` thing with a `ConnectionPoint`. It is the inverse of the relation `isConnectionPointOf` (see {s223:isConnectionPointOf})."^^xsd:string .

s223:hasMedium a s223:Relation,
        rdf:Property ;
    rdfs:label "has medium"^^xsd:string ;
    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 `Substance-Medium` (see {s223:Substance-Medium})."^^xsd:string .

