語義網絡與知識圖譜入門(二)
OWL
本體聲明
owl用owl:Ontology來聲明一個本體。rdf:about屬性為本體提供一個名稱或引用。根據標准,當rdf:about屬性的值為""時,本體的名稱是owl: Ontology元素的基准URI。
<owl:Ontology rdf:about="">
<rdfs:comment>An example OWL ontology</rdfs:comment>
<owl:priorVersion rdf:resource="http://www.w3.org/TR/2003/PR-owl-guide-20031215/wine"/>
<owl:imports rdf:resource="http://www.w3.org/TR/2004/REC-owl-guide-20040210/food"/>
<rdfs:label>Wine Ontology</rdfs:label>
</owl:Ontology>
rdfs:comment 提供了顯然必須的為本體添加注解的能力。
owl:priorVersion 是一個為用於本體的版本控制系統提供相關信息(hook)的標准標簽。
owl:imports 提供了一種嵌入機制,接受一個用rdf:resource屬性標識的參數。導入另一個本體將把那個本體中的全部聲引入到當前本體中.
rdfs:label對本體進行自然語言標注。
基本元素
類的定義
OWL中的所有個體都是類owl:Thing的成員。
<owl:Class rdf:ID="PotableLiquid">
<rdfs:subClassOf rdf:resource="#ConsumableThing" />
</owl:Class>
上例中PotableLiquid被定義為ConsumableThing的子類。
一個類的定義由兩部分組成:引入或引用一個名稱,以及一個限制列表。被直接包含在類定義中的各個表達式進一步限制了該類的實例,該類的實例屬於所有這些限制的交集。(這里描述的是成為某個類的必要條件,關於描述成為某個類的充分必要條件,請參見owl:equivalentClass部分。
個體的定義
類的成員就是類的個體。
先定義類。
<owl:Class rdf:ID="Grape">
</owl:Class>
在定義本體
<owl:Class rdf:ID="WineGrape">
<rdfs:subClassOf rdf:resource="&food;Grape" />
</owl:Class>
然后就可以定義個體了
<WineGrape rdf:ID="CabernetSauvignonGrape" />
這里WineGrape為類名,rdf:ID為個體名。
定義屬性
一個屬性是一個二元關系。有兩種類型的屬性:
-
數據類型屬性(datatype properties),類實例與RDF文字或XML Schema數據類型間的關系。
-
對象屬性(object properties),兩個類的實例間的關系。
<owl:ObjectProperty rdf:ID="madeFromGrape">
<rdfs:domain rdf:resource="#Wine"/>
<rdfs:range rdf:resource="#WineGrape"/>
</owl:ObjectProperty>
<owl:ObjectProperty rdf:ID="course">
<rdfs:domain rdf:resource="#Meal" />
<rdfs:range rdf:resource="#MealCourse" />
</owl:ObjectProperty>
上面例子可以看出,定義域為Wine,值域為WineGrape,也就是說,屬性描述可以將兩個類相關聯,使得屬性取值的key在Wine中,value在WineGrape中。
實體如何擁有定義的屬性呢?
<owl:Thing rdf:ID="LindemansBin65Chardonnay">
<madeFromGrape rdf:resource="#ChardonnayGrape" />
</owl:Thing>
上面這個例子可以看出,LindemansBin65Chardonnay擁有屬性madeFromGrape。並且可以根據其定義域知道他一定是葡萄酒。
例如,我們可以通過定義一個locateIn屬性來將事物和他所在的地區相關聯。
<owl:ObjectProperty rdf:ID="locatedIn">
<rdfs:domain rdf:resource="http://www.w3.org/2002/07/owl#Thing" />
<rdfs:range rdf:resource="#Region" />
</owl:ObjectProperty>
數據類型屬性定義
<owl:Class rdf:ID="VintageYear" />
<owl:DatatypeProperty rdf:ID="yearValue">
<rdfs:domain rdf:resource="#VintageYear" />
<rdfs:range rdf:resource="&xsd;positiveInteger"/>
</owl:DatatypeProperty>
數據類型的屬性定義更像是類的屬性,而對象的屬性更像是實例的屬性。
屬性限制
可以使用owl:Restriction來對屬性的值域進行進一步的限制。
<owl:Class rdf:ID="Wine">
<rdfs:subClassOf rdf:resource="&food;PotableLiquid" />
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#hasMaker" />
<owl:allValuesFrom rdf:resource="#Winery" />
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
上面例子使用了owl:Restriction來對Wine類進行限制owl:onProperty表明對哪個屬性進行限制,而owl:allValuesForm則表明限制的取值范圍。所以上面的例子可以解釋為,所有Wine實例的hasMaker屬性值必須為Winery的實例。
數量限制:
<owl:Class rdf:ID="Vintage">
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#hasVintageYear"/>
<owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
使用owl:cardinality可以限制實例屬性的取值數量,這里onProperty表明對hasVintageYear屬性限制,owl:cardinality則限制了該屬性取值為1。
其他限制還有:
owl:maxCardinality 限制數值上界
owl:minCardinality 限制數值下界
owl:hasValue 限制屬性值的實例必須有hasValue的資源
<owl:Class rdf:ID="Burgundy">
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#hasSugar" />
<owl:hasValue rdf:resource="#Dry" />
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
這個例子中,只有實例的hasSugar屬性有Dry的資源,該實例才為Burgundy為的實例。
本體映射
表明兩個類等價等價。equivalentClass兩個類等價。
<owl:Class rdf:ID="TexasThings">
<owl:equivalentClass>
<owl:Restriction>
<owl:onProperty rdf:resource="#locatedIn" />
<owl:someValuesFrom rdf:resource="#TexasRegion" />
</owl:Restriction>
</owl:equivalentClass>
</owl:Class>
上例表明,TexasThings類等價於一個無名類,而這個無名類加了locatedIn限制。