Inference and Reasoning¶
Inference is the process by which implied information is discovered and made explicit in a model. Informally, you can think of this process as automatically adding additional metadata to your Brick model.
The Brick ontology definition includes a set of formal axioms that outline what information can be implied by the statements in a particular Brick model. These axioms are interpreted by a piece of software called a reasoner, which derives all implied information and adds it to the Brick model. The process of performing inference is sometimes referred to as reasoning.
Note
Brick uses the OWL 2 RL profile, described in this W3C document. This section of the W3C documentation provides first-order definitions of the OWL 2 RL axioms, which may be helpful in understanding the specific reasoning mechanisms at hand. Reading and understanding these documents are not necessary to effective use of Brick.
Brick Inference Results¶
Applying inference to a Brick model can automatically add a great deal of information that would otherwise need to be manually added. This includes, but is not limited to:
Superclasses: for Brick entities that are instances of Brick classes, reasoning will also attach the superclasses to the instance
Inverse relationships: reasoning will automatically add the “inverse” Brick relationships where needed (e.g.
brick:feeds
is the reverse ofbrick:isFedBy
)Tags: reasoning will add tags to Brick entities which are instances of Brick classes
While using a reasoner is not strictly necessary for effective use of Brick, it does fill in a substantial amount of information that makes Brick easier to use and a more consistent experience.
Example: Superclasses¶
Before reasoning:
@prefix brick: <https://brickschema.org/schema/1.1/Brick#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix mybldg: <mybuilding#> .
mybldg:t1 a brick:Zone_Air_Temperature_Sensor .
After reasoning:
@prefix brick: <https://brickschema.org/schema/1.1/Brick#> .
@prefix tag: <https://brickschema.org/schema/1.1/BrickTag#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix mybldg: <mybuilding#> .
# The reasoner adds all parent classes of brick:Zone_Air_Temperature_Sensor as types
# of the mybldg:t1 entity.
# For clarity, we are eliding the tags that would also be associated with mybldg:t1
mybldg:t1 a brick:Zone_Air_Temperature_Sensor,
brick:Air_Temperature_Sensor,
brick:Temperature_Sensor,
brick:Sensor,
brick:Point .
Example: Tags¶
Before reasoning:
@prefix brick: <https://brickschema.org/schema/1.1/Brick#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix mybldg: <mybuilding#> .
mybldg:t1 a brick:Zone_Air_Temperature_Sensor .
After reasoning:
@prefix brick: <https://brickschema.org/schema/1.1/Brick#> .
@prefix tag: <https://brickschema.org/schema/1.1/BrickTag#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix mybldg: <mybuilding#> .
# The reasoner adds the tags associated with brick:Zone_Air_Temperature_Sensor and all
# of its superclasses to the mybldg:t1 entity.
# For clarity, we are eliding the superclasses that would also be added
mybldg:t1 a brick:Zone_Air_Temperature_Sensor,
brick:hasTag tag:Zone, tag:Air, tag:Temperature,
tag:Sensor, tag:Point .
Example: Inverse Relationships¶
Before reasoning:
@prefix brick: <https://brickschema.org/schema/1.1/Brick#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix mybldg: <mybuilding#> .
mybldg:t1 a brick:Zone_Air_Temperature_Sensor .
mybldg:vav1 a brick:VAV ;
brick:hasPoint mybldg:t1 .
After reasoning:
@prefix brick: <https://brickschema.org/schema/1.1/Brick#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix mybldg: <mybuilding#> .
# the inverse relationship (brick:isPointOf) is added by the reasoner.
# Note that for clarity we are eliding the tags and superclasses that would
# be associated with mybldg:t1 and mybldg:vav1
mybldg:t1 a brick:Zone_Air_Temperature_Sensor ;
brick:isPointOf mybldg:vav1 .
mybldg:vav1 a brick:VAV ;
brick:hasPoint mybldg:t1 .