2

我有一个带有两个完全独立的类的 RDFS 本​​体:UserVenue. 我希望它们都具有通过名为 的属性提供的名称,hasName对于 a而言,该名称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,它不会验证。

我应该如何处理这个?

4

1 回答 1

10

原则上,您可以只指定多个域属性:

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

然而,虽然这是有效的 RDF,但它并不意味着您可能认为它意味着什么。在 RDF 中,多个域被定义为具有交叉语义。这意味着,如果您如上所述定义多个域,RDF 推理器将推断任何具有属性“hasName”的东西都是 auser a venue(而不是非此即彼)。

要表示具有名称的事物是 auser a venue,您有多种选择。一种方法是找到(或创建) and 的公共超类,user并将其设为venue您的域:

 <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." .
于 2014-05-19T04:07:23.563 回答