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

sim*_*412 9 owl ontology protege

我的本体是图书分类库.我有这个问题.我想通过protégé4.1建立一个书籍分类本体,这个分类有14个类别,除了兄弟类作者,书,伊斯本.书籍类中的个人是书的主题(约600个主题),作者类中的个人是名字的作者,也是isbn类.然后我对对象属性和数据类型属性感到困惑.如果hasEdition在我的本体中的属性中,那么我说课本中的每本书都与版本类有关.所以我使用对象属性,但这个类(版本类)中的个体是整数<9.那怎么说呢?是数据类型还是对象?并可以使用对象属性与数据类型属性?(同名)

Jos*_*lor 32

关于对象和数据类型属性

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

如果您拥有hasEdition域名为的属性Book,则问题将成为范围应该是什么.如果您希望三倍如下:

Book72 hasEdition "1"^^xsd:int
Book16 hasEdition "3"^^xsd:int
Run Code Online (Sandbox Code Playgroud)

其中值是文字,那么hasEdition应该是数据类型属性.另一方面,如果你有一个Edition特定个人的班级,例如,

Edition a owl:Class .
first a Edition .
second a Edition .
third a Edition .
…
Run Code Online (Sandbox Code Playgroud)

这样你就可以拥有

Book72 hasEdition first .
Book16 hasEdition third .
Run Code Online (Sandbox Code Playgroud)

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

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

hasEdition a owl:ObjectProperty .
Run Code Online (Sandbox Code Playgroud)

要么

hasEdition a owl:DatatypeProperty .
Run Code Online (Sandbox Code Playgroud)

决定使用哪个

是否希望hasEdition属性是数据类型属性或对象属性实际上取决于您将要存储的数据类型,这取决于您的应用程序.如果你只是表示喜欢简单信息"first","second"等等,那么你可能想使用涉及一本书,它的版本数据类型属性.如果您以抽象方式表示书籍,这可能是一条很好的途径,也就是说,不是单独的书籍实例(而不是书商的库存系统,而是与书籍的个别实例有关).

另一方面,如果你实际代表的是书籍的实例.例如,如果你是一个书商,并且有25份为工作本体论者提供语义网和27份语义网编程,那么你可能真的有兴趣代表书籍的各个版本,标题,ISBN ,等等可能会存储在版本上,而不是书籍个人.

这只是一个意见,您在选择数据模型时确实有很大的灵活性.获得不错的数据模型通常需要一些经验,而且经验需要时间.即便如此,您还是拥有操作和转换数据的好工具,因此您可以尝试不同的表示,并从一个映射到另一个.

选择一个或另一个的后果的一个例子

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

@prefix lib: <http://example.org/library/> .

lib:HermanMelville rdf:type lib:Author .
Run Code Online (Sandbox Code Playgroud)

文字,如字符串"Herman Melville"不能成为句子的主语,因此不能成为课程的成员.作者作为资源(个人),你可以做

lib:MobyDick lib:hasAuthor lib:HermanMelville .
lib:HermanMelville  lib:hasName "HermanMelville"@en .
Run Code Online (Sandbox Code Playgroud)

在这种情况下,hasAuthor是对象属性并且hasName是数据类型属性.

另一方面,您可以创建hasAuthor一个数据类型属性,而不是

lib:MobyDick lib:hasAuthor "Herman Melville"@en .
Run Code Online (Sandbox Code Playgroud)

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

"Herman Melville"@en places:livedAt places:Arrowhead .
Run Code Online (Sandbox Code Playgroud)

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

lib:HermanMelville places:livedAt places:Arrowhead .
Run Code Online (Sandbox Code Playgroud)

这实际上只是您希望如何查询数据的问题.在这hasAuthor是一个对象属性的情况下,我可以写一个这样的查询来查找住在Arrowhead的作者写的书:

PREFIX lib: <http://...>
PREFIX places: <http//...>

SELECT ?book WHERE { 
  ?book lib:hasAuthor ?author .
  ?author places:livedAt places:Arrowhead .
}
Run Code Online (Sandbox Code Playgroud)

甚至更简洁(但等效):

PREFIX lib: <http://...>
PREFIX places: <http//...>

SELECT ?book WHERE { 
  ?book lib:hasAuthor [ places:livedAt places:Arrowhead ] .
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果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 .
}
Run Code Online (Sandbox Code Playgroud)

这个查询不能简单地简化.这实际上取决于您希望如何查询数据,以及对您来说方便的内容.请注意,您可以在SPARQL中编写的某些查询更难以作为OWL DL表达式编写.何时hasAuthor是对象属性,其作者居住在Arrowhead的书籍类由以下表达式给出:

lib:hasAuthor (places:livedAt value places:Arrowhead)
Run Code Online (Sandbox Code Playgroud)

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