我的本体是书籍分类库。我有这个问题。 我想通过protégé4.1建立一个书籍分类本体,这个分类有14个类别,除了兄弟类作者,书,伊斯本。书籍类中的个人是书的主题(约600个主题),作者类中的个人是名字的作者,也是isbn类。 然后我对对象属性和数据类型属性感到困惑。如果hasEdition在我的本体中的属性中,那么我说课本中的每本书都与版本类有关。所以我使用对象属性,但这个类(版本类)中的个体是整数< 9。那怎么说呢?是数据类型还是对象? 并可以使用对象属性与数据类型属性? (同名)
答案 0 :(得分:30)
在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
(并且为了完整性,{{1} })。也就是说,根据owl:AnnotationProperty
是对象属性还是数据类型属性,您会看到:
hasEdition
或
hasEdition a owl:ObjectProperty .
您是希望hasEdition a owl:DatatypeProperty .
属性是数据类型属性还是对象属性,实际上取决于您要存储的数据类型,这取决于您的应用程序。如果您只是表示hasEdition
,"first"
等简单信息,那么您可能希望使用将图书与其版本相关联的数据类型属性。如果您在抽象中代表书籍,这可能是一个很好的途径,即不是单独的实例书籍(而不是书商的库存系统,这将与书籍的个别实例有关)
另一方面,如果您实际代表的是书籍的实例。例如,如果您是书商,并且有25份Semantic Web for the Working Ontologist和27份Programming the Semantic Web),那么您可能真的有兴趣代表书籍的各个版本,标题,ISBN等等可能会存储在版本中,而不是书籍个人。
这只是一个意见,您在选择数据模型时确实有很大的灵活性。获得不错的数据模型通常需要一些经验,而且经验需要时间。即便如此,您还是拥有操作和转换数据的好工具,因此您可以尝试不同的表示,并从一个映射到另一个。
我建议你看看RDF Primer。资源和文字是不同类型的东西。资源是匿名的或由IRI识别,并且可以是语句的主题(因此,根据声明,它是类的成员
"second"
文字,例如字符串@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 .
是一个对象属性的情况下,我可以写一个这样的查询来查找住在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
1}}属性,但它使得查询数据有点复杂,因为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
是一个数据类型属性,那么编写这样一个表达式要困难得多,甚至不可能,因为你需要找到两个具有相同文字值的东西(一本书和一个作者)(是作者的名字。)