Protege教程——DisjointClasses(一个非常重要的公理)
这里是Protege教程中一些比较重要的片段,完整教程在http://www.crabone.com/index.php/protege-introduction#more-6
DisjointClasses、SubClassOf、EquivalentClasses是类的三大公理,见下图:
SubClassOf已经在上一节讲过了,EquivalentClasses和推理密切相关,在下面的章节将会讲述,DisjointClasses则是为了让推理能够顺利进行的一个必要条件,没有它的显式声明,有些推理将无法运行。可以说,在OWL里面DisjointClasses无处不在,这也是和我们的思维非常不一样的。因为我们在UML中的类,OOP中的类,都不需要申明它们之间的关系,类与类之间要么是父子关系,要么没有任何关系,一个对象只能是一个类的实例,比如JAVA中
String tempStr = new String();
这里的tempStr就是类String的实例,不存在类似于
String int temp = new String() or int(乱写的);
这样的形式,既是String又是int的类型。然而,在OWL中,一个实例可以既是这个类的实例,又是其他类的实例,比如下图:
上面有2个集合,这里的集合就好比类,集合里面的小块块就是这个类的实例。从这个图里,我们可以读出那几个类呢?
A、B、A∩B、A∪B…还有很多比如:非A、A和B的交集的补集等等,我这里公式不打了,这些都是一个个的类
那么在上面这些类中的小块块,就是属于这个类的个体,也叫实例,我们发现,有些小方块可以属于很多类,比如中间的那些,既是属于A的,又是属于B的,也可以属于(A∪B),也可以属于……总之可能会属于很多类。
在这里,我们可以进行一个小小的总结了:
OWL中的类,和OOP中的类并不一样,只有继承上来说,是类似的,但我们更应该把这些类当作集合来考虑!
看到这里,我想大家就应该明白DisjointClasses的意思了,是的!为了声明2个类没有交集!!只要2个类没有了交集,那么就不存在一个个体同时属于这2个类的情况了,这样推理机可以更加准确无误地表达出我们的意思了。
那么什么样的类需要去申明DisjointClasses呢?答案:同一层次的类!这里涉及到一个模式,叫做Upper Level Ontology
这个设计模式给了我们建模一个指导规范:将本体里面的类先按照层次划分,然后将一个层次的类相互DisjointClasses。我们还是以我们的社团本体来举例:
这里,Music和Sport就是一个层次的,我们将它们2个相互DisjointClasses。Guitar和Hominca是一个层次的,我们将它们2个相互DisjointClasses。同理,Basketball和Football也是一样要被DisjointClasses。这样设置好之后,思路就非常明确了,不会有一个兴趣爱好既是足球又是篮球的,但是,可以有一个个体的类型是(足球∪篮球),它的意思是,这个个体要么是足球,要么是篮球。不过,没有一个个体的类型会是(足球∩篮球),因为(足球∩篮球)是空集。当我们定义一个个体的类型为(足球∩篮球),进行推理的时候,会得到如下错误提示: