用Protege建立一个本体,关于Pizza的,有三个类,包括Pizza, PiazzaBase和PizzaTopping,他们互相Disjointwith,我原以为这三个类既然是在层次上对等的,那代码也应该差不多。但是当我查看源代码时发现自动生成的代码中,这三个类是不一样的,主要是有些用的是rdf:ID,有些用的是rdf:about,还有用rdf:resource的,如下:
<?xml version="1.0"?>
<rdf:RDF xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns="http://www.owl-ontologies.com/unnamed.owl#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xml:base="http://www.owl-ontologies.com/unnamed.owl">
<owl:Ontology rdf:about=""/>
<owl:Class rdf:ID="PizzaBase">
<owl:disjointWith>
<owl:Class rdf:ID="Pizza"/>
</owl:disjointWith>
<owl:disjointWith>
<owl:Class rdf:ID="PizzaTopping"/>
</owl:disjointWith>
</owl:Class>
<owl:Class rdf:about="#Pizza">
<owl:disjointWith rdf:resource="#PizzaBase"/>
<owl:disjointWith>
<owl:Class rdf:about="#PizzaTopping"/>
</owl:disjointWith>
</owl:Class>
<owl:Class rdf:about="#PizzaTopping">
<owl:disjointWith rdf:resource="#PizzaBase"/>
<owl:disjointWith rdf:resource="#Pizza"/>
</owl:Class>
</rdf:RDF>
同样的结构,为什么有些要用rdf:resource有些又用rdf:about,还有些用rdf:ID?这几个有什么区别呢?
一些网友的观点: 1. 1)rdf:ID和rdf:about的区别: rdf:about的值是一个完整URIref,注意也可以是相对URI,(相对于xml:base); rdf:ID是对rdf:about的值的缩写,其值是一个“ XML Name”,所以,不能是数字开头,不能有“/”符号等。 例如:rdf:ID="PizzaBase" 等价于rdf:about="(xml:base)+‘#’+‘PizzaBase’ " 这个xml:base的值可以在XML文件头声明,如你例子中的,xml:base="http://www.owl-ontologies.com/unnamed.owl", 如果没有声明,则其值是RDF文件所放在的位置uri。
3.再补充一个rdf:ID和rdf:about的区别: rdf:ID是用来定义一个资源,或者说引入一个新的资源名称; rdf:about除了也可用来定义资源外,还可用来扩展对这个资源的定义(这可以出现在其他本体文件中)。 如果Pizza是用rdf:ID定义的,那么要增加对Pizza的描述,就必须用rdf:about。因为同一个RDF文档中,不能出现两个rdf:ID="Pizza",否则RDF Parser就会报错。
总结: rdf:ID是用来定义一个资源,或者说引入一个新的资源名称 。rdf:about除了也可用来定义资源外(引入一个新的资源名称),还可用来扩展对这个资源的定义(这可以出现在其他本体文件中)。<br />如果Pizza是用rdf:ID定义的,那么要增加对Pizza的描述,就必须用rdf:about。因为同一个RDF文档中,不能出现两个rdf:ID="Pizza"。<br />rdf:resource只用于属性是对一个对象的引用时,可以是在前面或后面定义过的;也可以使引用未定义的,那样就会生成blank node。