我的本体论是图书分类库。我在这方面有问题。我想用protégé4.1构建一个图书分类本体,这个分类有14个类别,除了Author,book,Isbn这三个兄弟类。图书类中的个人是图书的主题(大约600个主题),作者类中的个人是姓名的作者,也是isbn类。然后我对对象属性和数据类型属性感到困惑。如果hasEdition在我的本体中属于属性,那么我可以说类中的每一本书都与版本类有关。所以我使用对象属性,但是这个类(edition类)中的个体是integer<9。它是数据类型还是对象?并且可以使用对象属性而不是数据类型属性?(同名)
发布于 2013-07-19 01:07:14
关于Object和Datatype属性
在Protégé中,有用于创建对象属性和数据类型属性的不同选项卡。如果属性应该将个体与个体关联起来,那么它需要是一个对象属性,如果它将个体与文字关联起来,那么它就需要是一个数据类型属性。
如果您有一个属性域为Book的属性hasEdition,那么问题就变成了范围应该是什么。如果你想要三倍数,就像这样:
Book72 hasEdition "1"^^xsd:int
Book16 hasEdition "3"^^xsd:int如果值是文字,则hasEdition应为数据类型属性。另一方面,如果你有一个包含某些特定个体的类Edition,例如,
Edition a owl:Class .
first a Edition .
second a Edition .
third a Edition .
…这样你就可以拥有
Book72 hasEdition first .
Book16 hasEdition third .那么hasEdition应该是一个对象属性。
如果需要查看RDF序列化并确定属性的类型,则应该查询类owl:ObjectProperty和owl:DatatypeProperty (为了完整性,还应该查询owl:AnnotationProperty)。也就是说,根据hasEdition是对象属性还是数据类型属性,您将看到:
hasEdition a owl:ObjectProperty .或
hasEdition a owl:DatatypeProperty .决定使用哪一个
您希望hasEdition属性是数据类型属性还是对象属性,这实际上取决于您要存储的数据类型,这取决于您的应用程序。如果您只表示简单的信息,如"first"、"second"等,那么您可能希望使用将书籍与其版本相关联的数据类型属性。如果您在抽象中表示图书,即不是图书的单个实例(而不是书商的库存系统,后者关注的是图书的单个实例),这可能是一个很好的方法。
另一方面,如果你实际表示的是书的实例。例如,如果你是一名书商,库存中有25本Semantic Web for the Working Ontologist和27本Programming the Semantic Web),那么你实际上可能会对表示图书的各个版本感兴趣,在这些版本上,标题、ISBN等可能会存储在版本中,而不是存储在图书的个体上。
这只是一种观点,您在选择数据模型时确实有很大的灵活性。通常需要一些经验才能获得好的数据模型,而经验需要时间。尽管如此,您已经有了很好的工具来操作和转换数据,因此您可以尝试不同的表示,并从一种映射到另一种。
选择其中之一的后果的示例
我建议你看看RDF Primer。资源和文字是不同类型的东西。资源是匿名的或由IRI标识的,并且可以是语句的主题(因此,根据语句,资源是类的成员
@prefix lib: <http://example.org/library/> .
lib:HermanMelville rdf:type lib:Author .字面量,比如字符串"Herman Melville“不能是句子的主语,也不能是类的成员。
lib:MobyDick lib:hasAuthor lib:HermanMelville .
lib:HermanMelville lib:hasName "HermanMelville"@en .在本例中,hasAuthor是一个对象属性,而hasName是一个数据类型属性。
另一方面,您可以使hasAuthor成为数据类型属性,而不是这样做
lib:MobyDick lib:hasAuthor "Herman Melville"@en .但是,如果这样做,那么就没有一种方便的方法来添加关于作者的任何附加信息,因为文字"Herman Melville"@en不能是三元组的主题,所以例如,您不能这样做
"Herman Melville"@en places:livedAt places:Arrowhead .而在第一种情况下,你可以说
lib:HermanMelville places:livedAt places:Arrowhead .这实际上只是一个你想如何查询你的数据的问题。在hasAuthor是一个对象属性的情况下,我可以像这样编写一个查询来查找居住在箭头上的作者所写的书籍:
PREFIX lib: <http://...>
PREFIX places: <http//...>
SELECT ?book WHERE {
?book lib:hasAuthor ?author .
?author places:livedAt places:Arrowhead .
}或者更简明扼要(但等效):
PREFIX lib: <http://...>
PREFIX places: <http//...>
SELECT ?book WHERE {
?book lib:hasAuthor [ places:livedAt places:Arrowhead ] .
}另一方面,如果hasAuthor是一个将一本书与其作者的名字联系起来的数据类型属性,我们仍然可以有一个Author类,它的实例通过hasName属性与它们的名字相关联,但是它使查询数据变得有点复杂,因为hasAuthor属性强制执行了一层间接层(获取书的作者的名字,然后找到具有该名字的作者),因此我们有如下查询:
PREFIX lib: <http://...>
PREFIX places: <http//...>
SELECT ?book WHERE {
?book lib:hasAuthor ?authorName .
?author lib:hasName ?authorName .
?author places:livedAt places:Arrowhead .
}这个查询不能被很好地简化。这实际上取决于你希望如何查询你的数据,以及什么对你来说是方便的。请注意,可以用SPARQL编写的一些查询很难编写为OWL DL表达式。当hasAuthor是一个对象属性时,其作者居住在箭头上的图书的类由表达式给出:
lib:hasAuthor (places:livedAt value places:Arrowhead)简单地说就是有一个住在箭头的作者的类。如果hasAuthor是一个数据类型属性,那么编写这样一个表达式即使不是不可能,也要困难得多,因为您需要找到两个具有相同文字值(即作者姓名的字符串)的东西(一本书和一个作者)。
https://stackoverflow.com/questions/17724983
复制相似问题