【问题标题】:SWRL rules don't infer new Object and Data Property AssertionsSWRL 规则不推断新的对象和数据属性断言
【发布时间】:2014-02-04 00:41:32
【问题描述】:

我创建了这个本体,它包含两个类:Blood-SugarServicesBlood-Sugar 有两个数据属性:hasValu 范围为 xsd:int,hasStatut 范围为 xsd:string。对象属性 triggerServiceBlood-Sugar 作为域,将 Service 作为范围。

我想用这个规则推断一个数据属性断言:

Blood_Sugar(?x) ∧ hasValue(?x, ?y) ∧ swrlb:greaterThan(?y, 126) ∧ swrlb:lessThan(?y, 500) → hasStatut(?x, "High")

然后我想用这个规则推断一个新的对象属性:

Blood_Sugar(?x) ∧ hasStatut(?x, "High") ∧ Service(?s) → triggerService(?x, ?s)

但是,当我创建规则应适用的个体时,推理器并没有给出我想要的结果。这是一个演示此行为的本体:

<?xml version="1.0"?>


<!DOCTYPE rdf:RDF [
    <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
    <!ENTITY swrl "http://www.w3.org/2003/11/swrl#" >
    <!ENTITY swrlb "http://www.w3.org/2003/11/swrlb#" >
    <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
    <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
    <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
    <!ENTITY protege "http://protege.stanford.edu/plugins/owl/protege#" >
    <!ENTITY xsp "http://www.owl-ontologies.com/2005/08/07/xsp.owl#" >
    <!ENTITY swrla "http://swrl.stanford.edu/ontologies/3.3/swrla.owl#" >
    <!ENTITY sqwrl "http://sqwrl.stanford.edu/ontologies/built-ins/3.4/sqwrl.owl#" >
]>


<rdf:RDF xmlns="http://www.owl-ontologies.com/Ontology1391620136.owl#"
     xml:base="http://www.owl-ontologies.com/Ontology1391620136.owl"
     xmlns:swrla="http://swrl.stanford.edu/ontologies/3.3/swrla.owl#"
     xmlns:sqwrl="http://sqwrl.stanford.edu/ontologies/built-ins/3.4/sqwrl.owl#"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
     xmlns:xsp="http://www.owl-ontologies.com/2005/08/07/xsp.owl#"
     xmlns:swrl="http://www.w3.org/2003/11/swrl#"
     xmlns:protege="http://protege.stanford.edu/plugins/owl/protege#"
     xmlns:swrlb="http://www.w3.org/2003/11/swrlb#"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:owl="http://www.w3.org/2002/07/owl#">
    <owl:Ontology rdf:about="">
        <owl:imports rdf:resource="http://sqwrl.stanford.edu/ontologies/built-ins/3.4/sqwrl.owl"/>
        <owl:imports rdf:resource="http://swrl.stanford.edu/ontologies/3.3/swrla.owl"/>
    </owl:Ontology>
    <swrl:Variable rdf:ID="s"/>
    <swrl:Variable rdf:ID="x"/>
    <swrl:Variable rdf:ID="y"/>
    <owl:Class rdf:ID="Blood_Sugar"/>
    <swrl:Imp rdf:ID="Rule-2">
        <swrl:body>
            <swrl:AtomList>
                <rdf:first>
                    <rdf:Description>
                        <rdf:type rdf:resource="&swrl;ClassAtom"/>
                        <swrl:argument1>
                            <rdf:Description rdf:about="#x"/>
                        </swrl:argument1>
                        <swrl:classPredicate rdf:resource="#Blood_Sugar"/>
                    </rdf:Description>
                </rdf:first>
                <rdf:rest>
                    <swrl:AtomList>
                        <rdf:first>
                            <rdf:Description>
                                <rdf:type rdf:resource="&swrl;DatavaluedPropertyAtom"/>
                                <swrl:argument2 rdf:datatype="&xsd;string">High</swrl:argument2>
                                <swrl:argument1>
                                    <rdf:Description rdf:about="#x"/>
                                </swrl:argument1>
                                <swrl:propertyPredicate rdf:resource="#hasStatut"/>
                            </rdf:Description>
                        </rdf:first>
                        <rdf:rest>
                            <swrl:AtomList>
                                <rdf:first>
                                    <rdf:Description>
                                        <rdf:type rdf:resource="&swrl;ClassAtom"/>
                                        <swrl:argument1>
                                            <rdf:Description rdf:about="#s"/>
                                        </swrl:argument1>
                                        <swrl:classPredicate rdf:resource="#Service"/>
                                    </rdf:Description>
                                </rdf:first>
                                <rdf:rest rdf:resource="&rdf;nil"/>
                            </swrl:AtomList>
                        </rdf:rest>
                    </swrl:AtomList>
                </rdf:rest>
            </swrl:AtomList>
        </swrl:body>
        <swrl:head>
            <swrl:AtomList>
                <rdf:first>
                    <rdf:Description>
                        <rdf:type rdf:resource="&swrl;IndividualPropertyAtom"/>
                        <swrl:argument2>
                            <rdf:Description rdf:about="#s"/>
                        </swrl:argument2>
                        <swrl:argument1>
                            <rdf:Description rdf:about="#x"/>
                        </swrl:argument1>
                        <swrl:propertyPredicate rdf:resource="#triggerService"/>
                    </rdf:Description>
                </rdf:first>
                <rdf:rest rdf:resource="&rdf;nil"/>
            </swrl:AtomList>
        </swrl:head>
    </swrl:Imp>
    <swrl:Imp rdf:ID="Rule-1">
        <swrl:body>
            <swrl:AtomList>
                <rdf:first>
                    <rdf:Description>
                        <rdf:type rdf:resource="&swrl;ClassAtom"/>
                        <swrl:argument1>
                            <rdf:Description rdf:about="#x"/>
                        </swrl:argument1>
                        <swrl:classPredicate rdf:resource="#Blood_Sugar"/>
                    </rdf:Description>
                </rdf:first>
                <rdf:rest>
                    <swrl:AtomList>
                        <rdf:first>
                            <rdf:Description>
                                <rdf:type rdf:resource="&swrl;DatavaluedPropertyAtom"/>
                                <swrl:argument2>
                                    <rdf:Description rdf:about="#y"/>
                                </swrl:argument2>
                                <swrl:argument1>
                                    <rdf:Description rdf:about="#x"/>
                                </swrl:argument1>
                                <swrl:propertyPredicate rdf:resource="#hasValue"/>
                            </rdf:Description>
                        </rdf:first>
                        <rdf:rest>
                            <swrl:AtomList>
                                <rdf:first>
                                    <rdf:Description>
                                        <rdf:type rdf:resource="&swrl;BuiltinAtom"/>
                                        <swrl:arguments>
                                            <rdf:List>
                                                <rdf:first>
                                                    <rdf:Description rdf:about="#y"/>
                                                </rdf:first>
                                                <rdf:rest>
                                                    <rdf:List>
                                                        <rdf:first rdf:datatype="&xsd;long">126</rdf:first>
                                                        <rdf:rest rdf:resource="&rdf;nil"/>
                                                    </rdf:List>
                                                </rdf:rest>
                                            </rdf:List>
                                        </swrl:arguments>
                                        <swrl:builtin>
                                            <rdf:Description rdf:about="&swrlb;greaterThan"/>
                                        </swrl:builtin>
                                    </rdf:Description>
                                </rdf:first>
                                <rdf:rest>
                                    <swrl:AtomList>
                                        <rdf:first>
                                            <rdf:Description>
                                                <rdf:type rdf:resource="&swrl;BuiltinAtom"/>
                                                <swrl:arguments>
                                                    <rdf:List>
                                                        <rdf:first>
                                                            <rdf:Description rdf:about="#y"/>
                                                        </rdf:first>
                                                        <rdf:rest>
                                                            <rdf:List>
                                                                <rdf:first rdf:datatype="&xsd;long">500</rdf:first>
                                                                <rdf:rest rdf:resource="&rdf;nil"/>
                                                            </rdf:List>
                                                        </rdf:rest>
                                                    </rdf:List>
                                                </swrl:arguments>
                                                <swrl:builtin>
                                                    <rdf:Description rdf:about="&swrlb;lessThan"/>
                                                </swrl:builtin>
                                            </rdf:Description>
                                        </rdf:first>
                                        <rdf:rest rdf:resource="&rdf;nil"/>
                                    </swrl:AtomList>
                                </rdf:rest>
                            </swrl:AtomList>
                        </rdf:rest>
                    </swrl:AtomList>
                </rdf:rest>
            </swrl:AtomList>
        </swrl:body>
        <swrl:head>
            <swrl:AtomList>
                <rdf:first>
                    <rdf:Description>
                        <rdf:type rdf:resource="&swrl;DatavaluedPropertyAtom"/>
                        <swrl:argument2 rdf:datatype="&xsd;string">High</swrl:argument2>
                        <swrl:argument1>
                            <rdf:Description rdf:about="#x"/>
                        </swrl:argument1>
                        <swrl:propertyPredicate rdf:resource="#hasStatut"/>
                    </rdf:Description>
                </rdf:first>
                <rdf:rest rdf:resource="&rdf;nil"/>
            </swrl:AtomList>
        </swrl:head>
    </swrl:Imp>
    <Blood_Sugar rdf:ID="Blood_Sugar_1">
        <hasValue rdf:datatype="&xsd;int">150</hasValue>
    </Blood_Sugar>
    <owl:DatatypeProperty rdf:ID="hasStatut">
        <rdfs:domain rdf:resource="#Blood_Sugar"/>
        <rdfs:range rdf:resource="&xsd;string"/>
    </owl:DatatypeProperty>
    <owl:DatatypeProperty rdf:ID="hasValue">
        <rdfs:domain rdf:resource="#Blood_Sugar"/>
        <rdfs:range rdf:resource="&xsd;int"/>
    </owl:DatatypeProperty>
    <owl:Class rdf:ID="Service"/>
    <Service rdf:ID="Service_1"/>
    <owl:ObjectProperty rdf:ID="triggerService">
        <rdfs:domain rdf:resource="#Blood_Sugar"/>
        <rdfs:range rdf:resource="#Service"/>
    </owl:ObjectProperty>
</rdf:RDF>

【问题讨论】:

  • 您没有向我们展示任何可以应用您的规则的数据。如果没有实例数据,就没有规则可以运行,也不会有任何实例。请展示一个出现此问题的最小示例。也就是说,请创建并发布一个具有最少规则数和重现此问题所需数据量最少的本体。
  • 感谢您展示更多您遇到的问题,但您仍然没有提供我们可以处理的数据,您的类层次结构的大小表明您展示的内容我们不是问题的最小再现。如果你从头开始一个本体,添加一个类、一个属性、一些实例数据和一个规则,看看你是否得到了预期的结果,这将对所有参与的人都有帮助。从那个最小的点开始,看看事情在哪里破裂,然后向我们展示。这通常是诊断这类问题的最佳方法。例如,。见sscce.org
  • 谢谢,但是你能给我一个使用 SWRL 规则推断新对象属性的例子吗?
  • 我看到你已经更新了问题。我已经下载了你的本体,我能够得到(我所期望的)是所需的推论。要查看其中一些,您可能需要更改 Protégé 中的一两个选项。见my new answer。 (看看当我们有工作代码要测试时这有多容易?)

标签: rdf owl protege swrl description-logic


【解决方案1】:

但是当我创建实例时,reasonner 并没有给我想要的结果!!!

在这里更详细一点会有所帮助。您怎么知道推理器(顺便说一下,您使用的是哪个推理器?)没有推断出所需的属性?你启用了推理器吗?您是否运行查询以检查推理是否存在?您是否将 Protégé 中的配置设置为显示所有适当的推理?

无论如何,感谢您提供本体来重现您的结果。我能够将它加载到 Protégé 中,运行 Pellet 推理器,我可以得到以下推论:

Blood_Sugar_1 triggerService Service_1
Blood_Sugar_1 hasStatut "High"^^string
Blood_Sugar_1 hasStatut "150"^^int

虽然 Pellet 能够计算所有这些推论,但 Protégé 默认只显示对象属性的推论;您必须进入 Reasoner > Configure... 菜单并确保在“Displayed Individual Inferences”部分下选中“Data Property Assertions”选项。在my answerOntology property definition in Protégé-OWL / SWRL 中更详细地描述了打开 Pellet 推理器并设置此选项。

【讨论】:

  • 非常感谢你,它现在正在运行 ^_^ 但为什么它会认为这是一个收益 Blood_Sugar_1 hasStatut "150"^^int ????????????
  • 如果它不能推断出你专门给它的东西,你不担心吗? :) 我不知道为什么它会再次出现在 Protégé 中,但这实际上只是一个 UI 问题;你所断言的一切都应该是可推断的;这只是 Protégé 再次展示它的问题。
  • @JoshuaTaylor :我有同样的问题,但我知道 Pellet 返回正确的推断公理,但不是 Hermit。我注意到当规则中有DataProperty时Hermit无法得到结果,为什么?我想用hermit,因为它更快!
【解决方案2】:

基于your comment,也许使用 SWRL 规则来推断新对象属性断言的示例将使您步入正轨。一些 OWL 2 推理器支持 SWRL 规则,所以我使用 Protégé 4.x 和 Pellet。 SWRL 规则可以用于推断新的对象属性断言。例如,在以下本体中,有一个类 Person,其中包含个人 AliceBillCarlRaymond,一个对象属性likes,还有一个规则:

人(?x) &rightarrow;喜欢(?x,Raymond)

启用 Pellet 推理器(Reasoner > Pellet,然后 Reasoner > Start Reasoner)后,我们得到了预期的结果。例如,比尔喜欢雷蒙德:

这是本体:

@prefix :      <http://example.org/swrl-example#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix swrl:  <http://www.w3.org/2003/11/swrl#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix swrlb: <http://www.w3.org/2003/11/swrlb#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<http://example.org/swrl-example>
        a       owl:Ontology .

:Person  a      owl:Class .

:Raymond  a     owl:NamedIndividual , :Person .

:Alice  a       owl:NamedIndividual , :Person .

[ a          swrl:Imp ;
  swrl:body  [ a          swrl:AtomList ;
               rdf:first  [ a                    swrl:ClassAtom ;
                            swrl:argument1       <urn:swrl#x> ;
                            swrl:classPredicate  :Person
                          ] ;
               rdf:rest   ()

             ] ;
  swrl:head  [ a          swrl:AtomList ;
               rdf:first  [ a                       swrl:IndividualPropertyAtom ;
                            swrl:argument1          <urn:swrl#x> ;
                            swrl:argument2          :Raymond ;
                            swrl:propertyPredicate  :likes
                          ] ;
               rdf:rest   ()

             ]
] .

:Bill   a       owl:NamedIndividual , :Person .

:likes  a       owl:ObjectProperty .

:Carl   a       owl:NamedIndividual , :Person .

<urn:swrl#x>  a  swrl:Variable .

【讨论】:

  • 你定义了属性“likes”的域和范围吗?
  • @Anima 我没有,正如您在我提供的本体中看到的那样。 (我复制并粘贴了 整个 本体。您可以下载它并在 Protégé 中打开它。)在属性上声明域和范围是可选的,我试图演示一个 minimal 使用 SWRL 规则推断对象属性断言的示例。添加域和范围将是不必要的复杂化。
  • 我认为我的 Protegé 有问题,我尝试了您的示例,但它无法再次运行!
  • @Anima 您运行的是 Protege 3.x 还是 4.x?您的图像来自 Protege 3.x,但我使用的是 Protege 4.x。我建议你也这样做,除非你有一些令人信服的理由继续使用 Protege 3.x。 Protege 4.x 支持 OWL2,但 Protege 3.x 只支持 OWL 1。SWRL 规则是后来添加的,所以你真的想要以后的 Protege。 “不运行”的描述性不够,因为它可能有很多原因:未打开或同步推理器,在启动推理器之前未保存本体等。您没有提供足够的信息来诊断问题。
  • 我用的是3.x和4.x的2个版本,“不运行”表示不给结果
猜你喜欢
  • 2021-07-27
  • 2015-11-23
  • 2013-02-21
  • 1970-01-01
  • 2021-11-03
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多