RDFS:多个域的相同属性

cgf*_*cgf 2 rdf ontology rdfs

我有一个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>
Run Code Online (Sandbox Code Playgroud)

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

我该怎么做呢?

Jee*_*tra 9

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

<rdf:Property rdf:ID="hasName"> 
    <rdfs:domain rdf:resource="#user"/> 
    <rdfs:domain rdf:sources="#venue"/> 
</rdf:Property>
Run Code Online (Sandbox Code Playgroud)

但是,虽然这是有效的RDF,但它并不意味着您可能认为它意味着什么.在RDF中,多个域被定义为具有交叉语义.这意味着如果您如上所述定义多个域,则RDF推理器将推断具有属性'hasName'的任何内容都是a user a venue(而不是/或).

要表达名称为a 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>
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用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." .
Run Code Online (Sandbox Code Playgroud)