我要做的是创建一个接受和识别数字间隔的数据类型属性。例如,假设我有“温度”属性。在本体中,我想创建2个子属性“hot”和“cold”。炎热的温度是20-30,冷的是0-19。 我现在正在做的是将一些属性设置为lowerlim和upperlim。但有没有更方便的方式直接通过属性表达间隔?因此,当我查询例如“23”时,它会识别出它的“热”。有什么提示吗?
提前谢谢
答案 0 :(得分:8)
这在OWL中非常简单,但是你所期待的那种推论可能与我现在解释的推论有点不同。
在OWL中,您可以定义对数据类型属性的限制(如I've shown before)。
但是,推断需要数据类型推理,某些具有特定数据类型值的资源/个人属于某个类。请注意,并非所有推理器实现都支持此功能,但我会专注于Pellet,这样做。
为了演示,我将创建一个小的OWL本体。我将用OWL / XML语法编写它。它会很长,但希望能够解释它是如何完成的。
首先,定义一个名为Temp
的“reified”类:
<Declaration>
<Class IRI="#Temp"/>
</Declaration>
接下来,有两个名为Hot
和Cold
的子类:
<Declaration>
<Class IRI="#Hot"/>
</Declaration>
<SubClassOf>
<Class IRI="#Hot"/>
<Class IRI="#Temp"/>
</SubClassOf>
<Declaration>
<Class IRI="#Cold"/>
</Declaration>
<SubClassOf>
<Class IRI="#Cold"/>
<Class IRI="#Temp"/>
</SubClassOf>
现在,我们可以定义我们的数据类型属性,名为tempDegC
:
<Declaration>
<DataProperty IRI="#tempDegC"/>
</Declaration>
我还会创建一些使用此属性的人,如下所示:
<Declaration>
<NamedIndividual IRI="#x"/>
</Declaration>
<DataPropertyAssertion>
<DataProperty IRI="#tempDegC"/>
<NamedIndividual IRI="#x"/>
<Literal datatypeIRI="&xsd;double">13.5</Literal>
</DataPropertyAssertion>
<Declaration>
<NamedIndividual IRI="#y"/>
</Declaration>
<DataPropertyAssertion>
<DataProperty IRI="#tempDegC"/>
<NamedIndividual IRI="#y"/>
<Literal datatypeIRI="&xsd;double">23.4</Literal>
</DataPropertyAssertion>
请注意,我没有断言哪个类x
或y
属于,只是他们有tempDegC
个xsd:double
个值
如果我们要求推理人在此时对本体进行分类,我们就不会看到任何新的推论。
我们想要的是推理者自动推断x
属于班级Cold
,而y
属于班级Hot
。
我们可以通过在数据类型属性Cold
方面限制类Hot
和tempDegC
的定义来实现此目的,如下所示:
<EquivalentClasses>
<Class IRI="#Cold"/>
<DataSomeValuesFrom>
<DataProperty IRI="#tempDegC"/>
<DatatypeRestriction>
<Datatype abbreviatedIRI="xsd:double"/>
<FacetRestriction facet="&xsd;maxInclusive">
<Literal datatypeIRI="&xsd;double">19.0</Literal>
</FacetRestriction>
</DatatypeRestriction>
</DataSomeValuesFrom>
</EquivalentClasses>
此处,此公理将Cold
定义为“任何实例,其tempDegC
的{{1}}值为xsd:double
<= 19
“。
同样,我们可以按如下方式限制Hot
:
<EquivalentClasses>
<Class IRI="#Hot"/>
<DataSomeValuesFrom>
<DataProperty IRI="#tempDegC"/>
<DatatypeRestriction>
<Datatype abbreviatedIRI="xsd:double"/>
<FacetRestriction facet="&xsd;maxInclusive">
<Literal datatypeIRI="&xsd;double">30.0</Literal>
</FacetRestriction>
<FacetRestriction facet="&xsd;minExclusive">
<Literal datatypeIRI="&xsd;double">19.0</Literal>
</FacetRestriction>
</DatatypeRestriction>
</DataSomeValuesFrom>
</EquivalentClasses>
此处,此公理将Hot
定义为“任何实例,其tempDegC
的{{1}}值为xsd:double
> 19
和<= 30
“。
现在,根据这些定义,要求推理者对本体进行分类推断出两个新的陈述:
x : Cold
y : Hot
<强>解释强>
获得这些推论的关键是使用EquivalentClasses
来定义Cold
和Hot
类的限制。使用EquivalentClasses
代替SubClassOf
,我们说的是指定范围内带有tempdegC
的任何属于类。
但是,如果我们使用SubClassOf
来定义上述Cold
和Hot
类的限制,则只会限制Cold
和{{的实例1}}遵守约束,即所谓的必要的条件,因为所有实例都必须遵守限制。
相比之下,Hot
定义了必要的和所谓的足够的条件:不仅所有实例(必须)都必须遵守限制,但它是足够的,如果任何个人(例如EquivalentClasses
或x
)符合限制,那么他们也是成员。这是足够的条件,推理者用来推断y
和x : Cold
。
指向full example ontology is here的链接。尝试将其加载到Protege并使用Pellet reasoner plugin对其进行分类。
请注意,我尝试使用HermiT和FaCT++对此本体进行分类,否则无法产生推断,抛出异常,表明它们不支持此类数据类型推理。