本体映射
为了让本体发挥最大的作用,就需要让本体得到充分的共享。为了使得在开发本体时尽可能的节省人力,就需要使得开发出的本体能够被重用。更理想的情况是他们能够被组合使用。例如,你可能同时使用来自某一来源的日期本体(date ontology)和来自另一来源的物理位置本体(physical location ontology),并将位置(location)的概念加以扩展以包括这个位置所处在的时间段。
在开发一个本体的过程中,很多的精力都被投入到将类与属性联系起来以获取最大的意义的工作上去了,意识到这一点也是很重要的。我们希望对类成员作出的断言较为简单同时又要求有广泛的和有用的含意在里面。这也是在本体开发过程中最为困难的工作。如果你能够找到已经经过广泛使用和精炼的本体,那么采用它才有意义。
多个本体的合并工作是非常具有挑战性的。为了维护其一致性,几乎必然需要工具的支持。
4.1. 类和属性之间的等价关系
equivalentClass, equivalentProperty
当我们要把一些本体组合在一起作为另一个新的本体的一部分时,能说明在一个本体中的某个类或者属性与另一个本体中的某个类或者属性是等价的,这往往很有用。在实际应用中我们这样做的时候要千万小心。因为如果要组合的那些本体是互相矛盾的(所有A的都是B的 与 A的并不全是B的),那么在组合得到的结果中就不会有满足条件的扩展(没有满足条件的个体或关系)了。
在食物本体中,我们现在想把在餐宴菜肴中对葡萄酒特点的描述与葡萄酒本体相联系起来。达到这一目的一种方法就是在食物本体中定义一个类(&food;Wine),然后在葡萄酒本体中将一个已有的类声明为与这个类是等价的。
<owl:Class rdf:ID="Wine">
<owl:equivalentClass rdf:resource="&vin;Wine"/>
</owl:Class>
属性owl:equivalentClass被用来表示两个类有着完全相同的实例。但我们要注意,在OWL DL中,类仅仅代表着个体的集合而不是个体本身。然而在OWL FULL中,我们能够使用owl:sameAs来表示两个类在各方面均完全一致。
当然了,上面我们举的例子多少有点刻意人为的意思,因为我们总是能在本来用#Wine的地方使用&vin;Wine以取得同样的效果而不需要重新定义类。一种更可能出现的情况是:我们依赖两个独立开发的本体,并注意到他们使用了O1:foo和O2:bar这两个URI引用相同的一个类。 这时我们就能够使用owl:equivalentClass将这两个类关联起来,使得从这两个本体中继承的限制也得到合并。
大家都知道,类名(类的表达式)既能用于<rdfs:subClassOf >设计中,又能用于<owl: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指的是那些恰好位于Texas地区的事物。使用owl:equivalentClass 和使用rdfs:subClassOf 的不同就像必要条件和充要条件的不同一样。如果是使用subClassOf的话,位于Texas地区的事物不一定是TexasThings。但是,如果使用owl:equivalentClass,位于Texas地区的事物一定属于TexasThings类。
关系 蕴涵
subClassOf TexasThings(x) implies locatedIn(x,y) and TexasRegion(y)
equivalentClass TexasThings(x) implies locatedIn(x,y) and TexasRegion(y)
类似的,我们可以通过使用owl:equivalentProperty属性声明表达属性的等同。
4.2 个体间的同一性
sameAs
描述个体之间相同的机制与描述类之间的相同的机制类似,仅仅只要将两个个体声明成一致的就可以了。
例如这样一个例子:
<Wine rdf:ID="MikesFavoriteWine">
<owl:sameAs rdf:resource="#StGenevieveTexasWhite" />
</Wine>
<Wine rdf:ID="MikesFavoriteWine">
<owl:sameAs rdf:resource="#StGenevieveTexasWhite" />
</Wine>
在这个例子并没有什么实际意义。所有我们从中能了解到的就是Mike喜欢一种便宜的本地酒。sameAs的一种更加典型的用法是将不同文档中定义的两个个体等同起来,作为统一两个本体的部分。
但这样做带来了一个问题。OWL中并没有名称唯一这一假定。仅仅名称不同并不意味着这两个名称引用的是不同的个体。
在上面的例子中,我们对两个截然不同的名称作出一致性断言。但是也只有在这种标示的情况下,才可能进行推理。请记住那些可能从函数型属性中得出的含意。假如hasMaker是一个函数型属性,那么下面的例子就不一定会产生冲突。
<owl:Thing rdf:about="#BancroftChardonnay">
<hasMaker rdf:resource="#Bancroft" />
<hasMaker rdf:resource="#Beringer" />
</owl:Thing>
除非和我们本体中的其他信息发生冲突,不然的话这样的描述是没有冲突的,他说明Bancroft和Beringer是相同的个体。
要清楚,修饰(或引用)两个类用sameAs还是用equivalentClass效果是不同的。用sameAs的时候,把一个类解释为一个个体,就像在OWL Full中一样,这有利于对本体进行分类。在OWL Full中,sameAs可以用来引用两个东西,如一个类和一个个体、一个类和一个属性等等,无论什么情况,都将被解释为个体。
4.3. 不同的个体
differentFrom, AllDifferent
这一机制提供了与sameAs相反的效果。
<WineSugar rdf:ID="Dry" />
<WineSugar rdf:ID="Sweet">
<owl:differentFrom rdf:resource="#Dry"/>
</WineSugar>
<WineSugar rdf:ID="OffDry">
<owl:differentFrom rdf:resource="#Dry"/>
<owl:differentFrom rdf:resource="#Sweet"/>
</WineSugar>
这是一种声明这三个值相互不同的方法。但在有些时候,更重要的是利用这些定义元素能把这种不同区别开来。没有上述的定义元素,我们可能会定义一种既干又甜的葡萄酒,并且添加hasSugar属性使其取值小于等于某个值来限定该种葡萄酒的甜度。如果我们没有用 differentFrom元素来申明既干又甜的葡萄酒,这意味着“干葡萄酒”和“甜葡萄酒”是相同的。但是我们从上面申明的元素来推断,这又是矛盾的。
还有一种更便利的定义相互不同个体的机制。如下面申明红葡萄酒、白葡萄酒和玫瑰葡萄酒的例子。
<owl:AllDifferent>
<owl:distinctMembers rdf:parseType="Collection">
<vin:WineColor rdf:about="#Red" />
<vin:WineColor rdf:about="#White" />
<vin:WineColor rdf:about="#Rose" />
</owl:distinctMembers>
</owl:AllDifferent>
要注意,owl:distinctMembers属性声明只能和owl:AllDifferent属性声明一起结合使用。
在葡萄酒本体中,我们为所有的WineDescriptor提供了一个owl:AllDifferent声明。我们同时还声明了所有的Winery是不同的。这时,如果我们想要在其他的某个本体中添加一个新的酿酒厂,并表明它是与其他已定义的任何酿酒厂都是不同的,我们可能需要拷贝原来的owl:AllDifferent属性声明,然后将新的制造厂添加到列表中。在OWL DL中,没有更加简单的方法以扩展一个声明为owl:AllDifferent的集合。而在OWL Full中,通过使用RDF三元组和rdf:List构造,可以实现一些其他的方法来完成这一扩展。
(来源:www.webw3c.org)