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

时间:2013-07-18 13:35:08

标签: ontology owl protege

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

1 个答案:

答案 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:ObjectPropertyowl: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是一个数据类型属性,那么编写这样一个表达式要困难得多,甚至不可能,因为你需要找到两个具有相同文字值的东西(一本书和一个作者)(是作者的名字。)