本体建模设计模式——Closure
问题提出
OWL有些时候与我们的本能思维模式有些背离,因为我们不是生活在一个逻辑的世界里,不可能任何事物都能准确定义的。比如这样一个例子:肉食动物,草食动物,不偏食动物。
按照我们的思维模式,草食动物是要吃一些草的
- <owl:Class rdf:about="#carnivore">
- <owl:equivalentClass>
- <owl:Restriction>
- <owl:onProperty rdf:resource="#eats"/>
- <owl:someValuesFrom rdf:resource="#meat"/>
- </owl:Restriction>
- </owl:equivalentClass>
- <rdfs:subClassOf rdf:resource="#animal"/>
- </owl:Class>
按照我们的思维模式,肉食性动物是要吃一些肉的
- <owl:Class rdf:about="#herbivore">
- <owl:equivalentClass>
- <owl:Restriction>
- <owl:onProperty rdf:resource="#eats"/>
- <owl:someValuesFrom rdf:resource="#veg"/>
- </owl:Restriction>
- </owl:equivalentClass>
- <rdfs:subClassOf rdf:resource="#animal"/>
- </owl:Class>
按照我们的思维模式,不偏食性动物既是吃肉也是吃草的
- <owl:Class rdf:about="#omnivore">
- <owl:equivalentClass>
- <owl:Class>
- <owl:intersectionOf rdf:parseType="Collection">
- <owl:Restriction>
- <owl:onProperty rdf:resource="#eats"/>
- <owl:someValuesFrom rdf:resource="#meat"/>
- </owl:Restriction>
- <owl:Restriction>
- <owl:onProperty rdf:resource="#eats"/>
- <owl:someValuesFrom rdf:resource="#veg"/>
- </owl:Restriction>
- </owl:intersectionOf>
- </owl:Class>
- </owl:equivalentClass>
- <rdfs:subClassOf rdf:resource="#animal"/>
- </owl:Class>
如果我们这样定义之后,经过推理机的整理,如下图所示:

我们发现,omnivore成为了herbivore和carnivore的子类,而实际上,这3各类应该各自不相干,没有谁是谁的子类那种关系,它们是平行的。就这是因为在OWL的推理世界中,有一种原则叫Open World Reasoning,在这种原则下,肉食性动物也会吃草,因为eats这个object property仅仅定义了someValueFrom meat,推理机认为只要有一些meat就可以了,但没有排他性,即也可以吃其他类型的食物。在这里例子里面,当然omnivore会成为carnivore的子类。
目标
精确表达OWL一些类直接的从属关系,达到无二义性。这就是封闭性设计模式。
实现
在原有基础上,分别给carnivore和herbivore加上
注意
这里容易搞混的是allValuesFrom的准确含义,它所限制的是object property的范围,而没有限制object property本身。这里的allValuesFrom指要么没有,要么就是指定的类的实例,而someValuesFrom是指必须有一个或者一个以上指定的类的实例,但同时有其他类的实例也被允许。因此,这里少了这2个限制都不行。