我正在尝试测试一个简单的SWRL规则。我的本体有三个类:LivingPlace有两个子类RuralArea和City。 LivingPlace是dataProperty hasHospital的域,其范围为boolean。
当我使用Pellet推理器测试以下规则时,我作为LivingPlace成员创建的个人也被推断为RuralArea的成员。
LivingPlace(?lp),hasHospital(?lp,false)→RuralArea(?lp)
然而,我真正想要做的是反过来推理。
RuralArea(?lp)→hasHospital(?lp,false)
每当我创建一个RuralArea类型的个体时,我希望Pellet推断出一个假的hasHospital。我怎么能这样做?
答案 0 :(得分:2)
这是一个最小的本体,如你所描述的那样,即,LivingPlace类有两个直接的子类,City和RuralArea。有一个个体,RuralArea1,属于RuralArea类型,本体包含SWRL规则
RuralArea(?x)→hasHospital(?x,false)
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://example.org/places#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:swrl="http://www.w3.org/2003/11/swrl#"
xmlns:swrlb="http://www.w3.org/2003/11/swrlb#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<owl:Ontology rdf:about="http://example.org/places"/>
<owl:Class rdf:about="http://example.org/places#LivingPlace"/>
<owl:Class rdf:about="http://example.org/places#City">
<rdfs:subClassOf rdf:resource="http://example.org/places#LivingPlace"/>
</owl:Class>
<owl:Class rdf:about="http://example.org/places#RuralArea">
<rdfs:subClassOf rdf:resource="http://example.org/places#LivingPlace"/>
</owl:Class>
<owl:DatatypeProperty rdf:about="http://example.org/places#hasHospital">
<rdfs:domain rdf:resource="http://example.org/places#LivingPlace"/>
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#boolean"/>
</owl:DatatypeProperty>
<swrl:Imp>
<swrl:body>
<swrl:AtomList>
<rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/>
<rdf:first>
<swrl:ClassAtom>
<swrl:classPredicate rdf:resource="http://example.org/places#RuralArea"/>
<swrl:argument1>
<swrl:Variable rdf:about="urn:swrl#x"/>
</swrl:argument1>
</swrl:ClassAtom>
</rdf:first>
</swrl:AtomList>
</swrl:body>
<swrl:head>
<swrl:AtomList>
<rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/>
<rdf:first>
<swrl:DatavaluedPropertyAtom>
<swrl:argument2 rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean"
>false</swrl:argument2>
<swrl:propertyPredicate rdf:resource="http://example.org/places#hasHospital"/>
<swrl:argument1 rdf:resource="urn:swrl#x"/>
</swrl:DatavaluedPropertyAtom>
</rdf:first>
</swrl:AtomList>
</swrl:head>
</swrl:Imp>
<owl:NamedIndividual rdf:about="http://example.org/places#ruralArea1">
<rdf:type rdf:resource="http://example.org/places#RuralArea"/>
</owl:NamedIndividual>
</rdf:RDF>
当我在Protégé4.x中加载此本体并使用Pellet作为推理器时,还要确保在UI中显示有关数据类型属性的推断(如this message on the Protégé OWL mailing list中所述),推断
ruralArea1 hasHospital false
显示,如下面的屏幕截图所示。
另一种看待Pellet可以得出这种推论的方法是使用SPARQL。例如,使用保存在query.sparql
prefix : <http://example.org/places#>
select ?s ?o where {
?s :hasHospital ?o
}
和pellet
命令行工具,我们获得了这些结果:
$ pellet query -q query.sparql ./places.owl
Query Results (1 answers):
s | o
============================================================
ruralArea1 | false^^http://www.w3.org/2001/XMLSchema#boolean
值得指出的是,您实际上并不需要SWRL来执行此特定推理。你可以简单地说
RuralArea subClassOf(hasHospital value false)
并获得相同的结果。在Protégé中,它看起来像下面的截图。这样做的好处是,如果您使用的是没有SWRL支持的OWL推理器,它将为您提供相同的结果。