我有一个RDFS本体,有两个完全独立的类:User
和Venue
。我希望他们两个都有通过名为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
,它也不会验证。
我该如何处理?
答案 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
的内容,您有多种选择。一种方法是找到(或创建)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." .