這是我如何做事以及啟用哪些類型的推理/建模的要點
我們使用的幾乎所有內容都屬於 OWL Lite,但owl:hasValue
屬性除外,我們使用該屬性來定義標籤集和類別名稱之間的 1-1 映射。因此,目前的解決方案屬於 OWL DL。
這也意味著我們需要一個推理器,但幸運的是不是支援 OWL Full 的推理器:)。 OWL-RL 是與 RDFlib 搭配使用的好選擇。
# G is our RDFlib Graph
# apply reasoning to expand all of the inferred triples
import owlrl
owlrl . DeductiveClosure ( owlrl . OWLRL_Semantics ). expand ( G )
# get namespaces
print ( list ( G . namespaces ()))
G . query ( "SELECT ?x WHERE { ?x brick:hasTag tag:Equip }" )
如果我們需要使用不支援推理的 SPARQL 查詢處理器,我們可以將圖的擴展形式序列化到磁碟。
https://brickschema.org/schema/1.1.0/Brick#
owl:Class
並透過rdfs:subClassOf
排列成層次結構owl:equivalentClass
屬性相關skos:definition
給出的定義brick:AHU_Average_Exhaust_Air_Static_Pressure_Sensor
只是一個Average_Exhaust_Air_Static_Pressure_Sensor
,它是 AHU 的一個點。我們定義的根類別是:
Equipment
Location
Point
Tag
Substance
Quantity
(關係是類別實例之間 owl ObjectProperties 的 Brick 術語)
從表面上看,關係的運作方式與原始磚塊中的運作方式相同。所有相同的關係仍然存在(我記得定義它們),它們的逆關係使用owl:inverseOf
定義。
域和範圍是根據類別來定義的。宣告關係的rdfs:range
屬於類別brick:Equipment
意味著關係的物件應該是brick:Equipment
類別的實例。
此原型除了關係之外還包括子關係。可以使用子關係來代替超級關係,以為該關係的性質添加更多細節。到目前為止唯一的例子是feedsAir
是feeds
的子屬性。
需要弄清楚的是我們如何推斷feedsAir
關係;也許兩個端點設備具有air
標籤和feeds
關係?這可能需要明確指定而不是推斷。
https://brickschema.org/schema/1.1.0/BrickTag#
skos:definition
屬性給出的定義這是透過將 Brick 類別(例如Air_Temperature_Sensor
)聲明為等效於匿名類別來實現的,匿名類別是一個owl:Restriction
,它是具有某些標籤的實體的交集。
# in turtle format
brick:Temperature_Sensor a owl:Class ;
rdfs:subClassOf brick:Sensor ;
owl:equivalentClass [ owl:intersectionOf (
[ a owl:Restriction ;
owl:hasValue tag:Sensor ;
owl:onProperty brick:hasTag
]
[ a owl:Restriction ;
owl:hasValue tag:Temperature ;
owl:onProperty brick:hasTag
]
) ] .
第一個owl:Restriction
是所有將tag:Sensor
作為其brick:hasTag
屬性之一的值的類別的集合。
這意味著溫度感測器:ts1
可以用兩種不同的方式定義,並且推理機將推斷其他三元組:
# using classes
:ts1 a brick:Temperature_Sensor
# using tags
:ts1 brick:hasTag tag:Temp
:ts1 brick:hasTag tag:Sensor
Brick 現在定義了物質層次結構 ( substances.py
) 和數量層次結構 ( quantities.py
)。物質和數量可以與設備和點相關。
並非所有這些都得到實施。在目前的原型中,感測器透過「 brick:measures
關係與物質和數量相關。
:ts1 a brick:Temperature_Sensor
:ts1 brick:measures :Air
# this implies the following
:ts1 a brick:Air_Temperature_Sensor
我們可以進一步對物質進行子類化,為其定義提供系統或過程層級的脈絡:
:ts1 a brick:Sensor
:ts1 brick:measures brick:Return_Air
:ts1 brick:measures brick:Temperature
# implies...
:ts1 a brick:Return_Air_Temperature_Sensor
Brick 使用 OWL 限制來根據此類關係細化類別。對於此範例,因為:ts1
測量空氣(特別是brick:Air
類別),所以 OWL 將我們的感測器推斷為brick:Air_Temperature_Sensor
。
海龜中的定義如下:
brick:Air_Temperature_Sensor a owl:Class ;
rdfs:subClassOf brick:Temperature_Sensor ;
owl:equivalentClass [ owl:intersectionOf ( [ a owl:Restriction ;
owl:hasValue brick:Temperature ;
owl:onProperty brick:measures ] [ a owl:Restriction ;
owl:hasValue brick:Air ;
owl:onProperty brick:measures ] ) ] .
注意:我們在這裡使用類別作為值,這與 Brick 的其餘部分不同。這稱為“雙關語”。這是為了避免必須為我們的感測器創建要測量的物質實例等,但保留了將來實現這一點的可能性。物質的實例可以對過程階段中的“物質”區域/塊進行建模,例如進入冷卻器的水或空氣處理單元的混合空氣區域。
我們沒有迷失在如何將所有內容格式化為 YAML 的西西弗斯式自行車中,而是只使用 Python 字典,因此我們不必擔心任何(好吧,不是那麼多)解析邏輯。
definitions = {
"Lighting_System" : {
"tagvalues" : [ # Lighting_System class is equivalent to the Lighting tag
( BRICK . hasTag , TAG . Lighting ),
# if you have more required tags add them as their own tuple in the list
],
# defining subclasses. This can be nested ad-infinitum
"subclasses" : {
"Lighting" : {
"subclasses" : {
"Luminaire" : {},
"Luminaire_Driver" : {},
},
},
"Interface" : {
"subclasses" : {
"Switch" : {
"subclasses" : {
"Dimmer" : {},
},
},
"Touchpanel" : {},
},
},
},
}
}
define_subclasses ( definitions , BRICK . Equipment )
目前,程式碼就是文檔。查看equipment.py
、 point.py
等範例以及如何新增到每個類別層次結構。
作者:加布·菲耶羅