RDFS:多个域的相同属性

时间:2014-05-18 16:24:38

标签: rdf ontology rdfs

我有一个RDFS本体,有两个完全独立的类:UserVenue。我希望他们两个都有通过名为hasName的属性提供的名称,User看起来应该类似于:

<rdf:Property rdf:ID="hasName"> 
    <rdfs:comment> 
        Comment here. Blah blah blah.
    </rdfs:comment>
    <rdfs:domain rdf:resource="#user"/> 
    <rdfs:range rdf:resource="Literal"/> 
</rdf:Property>

但是,如果我想要它Venue,它也不会验证。

我该如何处理?

1 个答案:

答案 0 :(得分:9)

原则上您只需指定多个域属性:

<rdf:Property rdf:ID="hasName"> 
    <rdfs:domain rdf:resource="#user"/> 
    <rdfs:domain rdf:sources="#venue"/> 
</rdf:Property>

然而,虽然这是有效的RDF,但这并不意味着你可能认为它意味着什么。在RDF中,多个域被定义为具有交叉语义。这意味着,如果您按上述方式定义多个域,则RDF推理器将推断出具有属性&#39; hasName&#39;是user a venue(而不是/或)。

要表达名称为user a venue的内容,您有多种选择。一种方法是找到(或创建)uservenue的公共超类,并将其作为您的域名:

 <rdf:Property rdf:ID="hasName"> 
        <rdfs:comment> 
            Comment here. Blah blah blah.
        </rdfs:comment>
        <rdfs:domain rdf:sources="#ThingsWithNames"/> 
    </rdf:Property>

   <rdfs:Class rdf:about="#ThingsWithNames"/> 
   <rdfs:Class rdf:about="#user">
        <rdfs:subClassOf rdf:resource="#ThingsWithNames"/>
   </rdfs:Class> 
   <rdfs:Class rdf:about="#venue">
        <rdfs:subClassOf rdf:resource="#ThingsWithNames"/>
   </rdfs:Class>

另一种方法是,您使用owl:unionOf这两个类作为您的域。但是,这种方法需要使用OWL,因此简单的RDFS推理器将无法完全解释它。

顺便说一下,提示:开始使​​用Turtle语法而不是RDF / XML。它更容易阅读和编辑。例如,您的原始属性定义在Turtle中将如下所示:

 :hasName a rdf:Property ;
          rdfs:domain :user ;
          rdfs:range rdfs:Literal ;
          rdfs:comment "Comment here. Blah blah blah." .