我的本体是图书分类库。我在这方面有问题。
我想通过protégé 4.1建立一个图书分类本体,这个分类有14个类别,除了兄弟类Author、book、Isbn。 book类的个人是book的subject(约600个科目),author类的个人是name的作者,也是isbn类。
然后我对对象属性和数据类型属性感到困惑。如果 hasEdition 在我的本体中的属性中,那么我说 class book 中的每一本书都与 edition class 有关系。所以我使用对象属性,但这个类(版本类)中的个体是整数<9。那怎么能说呢?它是数据类型还是对象?
并且可以使用对象属性还是数据类型属性? (同名)
最佳答案
关于对象和数据类型属性
在 Protégé 中有用于创建对象属性和数据类型属性的不同选项卡。如果一个属性应该将个体与个体相关联,那么它需要是一个对象属性,如果它将个体与文字相关联,那么它需要是一个数据类型属性。
如果您有房产hasEdition
其域是 Book
,那么问题就变成了范围应该是多少。如果您期望像这样的三元组:
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
是一个对象属性,我可以写一个这样的查询来查找住在 Arrowhead 的作者写的书: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
是一个对象属性,作者居住在 Arrowhead 的书籍类别由以下表达式给出:lib:hasAuthor (places:livedAt value places:Arrowhead)
这只是拥有一位住在 Arrowhead 的作者的一类事物。如
hasAuthor
是一个数据类型属性,编写这样的表达式要困难得多,如果不是不可能的话,因为您需要找到具有相同文字值(即作者姓名的字符串)的两件事(一本书和一个作者)。
关于ontology - 如何识别对象属性与数据类型属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17724983/