首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别对象属性与数据类型属性?

如何识别对象属性与数据类型属性?
EN

Stack Overflow用户
提问于 2013-07-18 21:35:08
回答 1查看 14.9K关注 0票数 11

我的本体论是图书分类库。我在这方面有问题。我想用protégé4.1构建一个图书分类本体,这个分类有14个类别,除了Author,book,Isbn这三个兄弟类。图书类中的个人是图书的主题(大约600个主题),作者类中的个人是姓名的作者,也是isbn类。然后我对对象属性和数据类型属性感到困惑。如果hasEdition在我的本体中属于属性,那么我可以说类中的每一本书都与版本类有关。所以我使用对象属性,但是这个类(edition类)中的个体是integer<9。它是数据类型还是对象?并且可以使用对象属性而不是数据类型属性?(同名)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-19 01:07:14

关于Object和Datatype属性

在Protégé中,有用于创建对象属性和数据类型属性的不同选项卡。如果属性应该将个体与个体关联起来,那么它需要是一个对象属性,如果它将个体与文字关联起来,那么它就需要是一个数据类型属性。

如果您有一个属性域为Book的属性hasEdition,那么问题就变成了范围应该是什么。如果你想要三倍数,就像这样:

代码语言:javascript
复制
Book72 hasEdition "1"^^xsd:int
Book16 hasEdition "3"^^xsd:int

如果值是文字,则hasEdition应为数据类型属性。另一方面,如果你有一个包含某些特定个体的类Edition,例如,

代码语言:javascript
复制
Edition a owl:Class .
first a Edition .
second a Edition .
third a Edition .
…

这样你就可以拥有

代码语言:javascript
复制
Book72 hasEdition first .
Book16 hasEdition third .

那么hasEdition应该是一个对象属性。

如果需要查看RDF序列化并确定属性的类型,则应该查询类owl:ObjectPropertyowl:DatatypeProperty (为了完整性,还应该查询owl:AnnotationProperty)。也就是说,根据hasEdition是对象属性还是数据类型属性,您将看到:

代码语言:javascript
复制
hasEdition a owl:ObjectProperty .

代码语言:javascript
复制
hasEdition a owl:DatatypeProperty .

决定使用哪一个

您希望hasEdition属性是数据类型属性还是对象属性,这实际上取决于您要存储的数据类型,这取决于您的应用程序。如果您只表示简单的信息,如"first""second"等,那么您可能希望使用将书籍与其版本相关联的数据类型属性。如果您在抽象中表示图书,即不是图书的单个实例(而不是书商的库存系统,后者关注的是图书的单个实例),这可能是一个很好的方法。

另一方面,如果你实际表示的是书的实例。例如,如果你是一名书商,库存中有25本Semantic Web for the Working Ontologist和27本Programming the Semantic Web),那么你实际上可能会对表示图书的各个版本感兴趣,在这些版本上,标题、ISBN等可能会存储在版本中,而不是存储在图书的个体上。

这只是一种观点,您在选择数据模型时确实有很大的灵活性。通常需要一些经验才能获得好的数据模型,而经验需要时间。尽管如此,您已经有了很好的工具来操作和转换数据,因此您可以尝试不同的表示,并从一种映射到另一种。

选择其中之一的后果的示例

我建议你看看RDF Primer。资源和文字是不同类型的东西。资源是匿名的或由IRI标识的,并且可以是语句的主题(因此,根据语句,资源是类的成员

代码语言:javascript
复制
@prefix lib: <http://example.org/library/> .

lib:HermanMelville rdf:type lib:Author .

字面量,比如字符串"Herman Melville“不能是句子的主语,也不能是类的成员。

代码语言:javascript
复制
lib:MobyDick lib:hasAuthor lib:HermanMelville .
lib:HermanMelville  lib:hasName "HermanMelville"@en .

在本例中,hasAuthor是一个对象属性,而hasName是一个数据类型属性。

另一方面,您可以使hasAuthor成为数据类型属性,而不是这样做

代码语言:javascript
复制
lib:MobyDick lib:hasAuthor "Herman Melville"@en .

但是,如果这样做,那么就没有一种方便的方法来添加关于作者的任何附加信息,因为文字"Herman Melville"@en不能是三元组的主题,所以例如,您不能这样做

代码语言:javascript
复制
"Herman Melville"@en places:livedAt places:Arrowhead .

而在第一种情况下,你可以说

代码语言:javascript
复制
lib:HermanMelville places:livedAt places:Arrowhead .

这实际上只是一个你想如何查询你的数据的问题。在hasAuthor是一个对象属性的情况下,我可以像这样编写一个查询来查找居住在箭头上的作者所写的书籍:

代码语言:javascript
复制
PREFIX lib: <http://...>
PREFIX places: <http//...>

SELECT ?book WHERE { 
  ?book lib:hasAuthor ?author .
  ?author places:livedAt places:Arrowhead .
}

或者更简明扼要(但等效):

代码语言:javascript
复制
PREFIX lib: <http://...>
PREFIX places: <http//...>

SELECT ?book WHERE { 
  ?book lib:hasAuthor [ places:livedAt places:Arrowhead ] .
}

另一方面,如果hasAuthor是一个将一本书与其作者的名字联系起来的数据类型属性,我们仍然可以有一个Author类,它的实例通过hasName属性与它们的名字相关联,但是它使查询数据变得有点复杂,因为hasAuthor属性强制执行了一层间接层(获取书的作者的名字,然后找到具有该名字的作者),因此我们有如下查询:

代码语言:javascript
复制
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是一个对象属性时,其作者居住在箭头上的图书的类由表达式给出:

代码语言:javascript
复制
lib:hasAuthor (places:livedAt value places:Arrowhead)

简单地说就是有一个住在箭头的作者的类。如果hasAuthor是一个数据类型属性,那么编写这样一个表达式即使不是不可能,也要困难得多,因为您需要找到两个具有相同文字值(即作者姓名的字符串)的东西(一本书和一个作者)。

票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17724983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档