【问题标题】:how can I recognize object properties vs datatype properties?如何识别对象属性与数据类型属性?
【发布时间】:2013-07-17 11:50:21
【问题描述】:

我的本​​体是图书分类库。我在这方面有问题。 我想通过protégé 4.1构建一个书籍分类本体,这个分类有14个类别,除了兄弟类Author,book,Isbn。 book 类的个人是 book 的主题(约 600 个主题),author 类的个人是 name 的作者,也是 isbn 类。 然后我对对象属性和数据类型属性感到困惑。如果 hasEdition 在我的本体中的属性中,那么我说类书中的每一本书都与版本类有关系。所以我使用对象属性,但这个类(版本类)中的个体是整数

【问题讨论】:

    标签: ontology owl protege


    【解决方案1】:

    关于对象和数据类型属性

    在 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 类(为了完整起见,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 是对象属性时,其作者居住在箭头的图书类别由以下表达式给出:

    lib:hasAuthor (places:livedAt value places:Arrowhead)
    

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

    【讨论】:

    • 谢谢约书亚。你怎么看?我使用 hasEdition 数据属性或对象属性?如果我假设一个带有某些特定个人的班级版那么它是如何工作的?我的意思是书的个人与版的个人有什么关系?很抱歉我还有一个问题。如果我想说参与关系“hasAuthor”属性是字符串类型的个人作者,那么如何告诉它? (至于 hasAuthor 是对象属性)
    • @sima412 我已经更新了我的答案,其中包含一些关于何时可以将hasEdition 设为数据类型或对象属性的想法。对于hasAuthor 之类的内容,您可以将作者设为个人,然后例如,有名称(由hasName 数据属性提供),或者您可以将hasAuthor 设为数据类型属性,在这种情况下,它将书籍与其作者的name 相关联。跨度>
    • 好的。因此,如果将 hasAuthor 作为对象属性,并且我创建了另一个包含作者姓名的属性(相同的 hasName)。我理解正确吗?但是 hasAuthor 和 hasName 之间的关系是什么?意思是:我怎么知道 hasAuthor 和 hasName 之间存在关系?对不起约书亚,谢谢你
    • @sima412 hasAuthor 将一本书与属于Author 班级成员的个人联系起来。 hasName 将作者个人与作者姓名相关联。该图看起来有点像[book] --hasAuthor--&gt; [author] --hasName--&gt; "Herman Melville"
    • 我有一个问题。如果个人作者类是姓名的作者,那么我需要制作 hasName 属性吗?因为作者中的个人是作者的名字。我可以通过hasAuthor 属性(对象属性)将书籍类(Moby-Dick)的成员与作者类(herman meville)的成员联系起来。无需制作hasName prpoerties?
    猜你喜欢
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2017-06-05
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多