如何将类的每个实例与另一个类的每个实例相关联?

SW-*_*SAP 2 semantic-web owl ontology protege description-logic

一般问题

我正在使用Protégé4.3创建一个简单的本体,并尝试创建一个模型,以使C类的每个实例对于给定的属性p都具有特定的值v,它是V类的实例。我可以使用公理来得到这个推论

C subClassOf(p v)

但我想我希望能够按照

C subClassOf(p 一些 V)

因为我实际上希望C的每个实例都与V的每个实例相关。

一个具体的例子

我的示例是汽车和动作-我想为汽车创建一组动作。当我创建汽车的新实例时,我希望每个实例都有一套动作。如果我添加了新的动作实例,我希望所有汽车实例都能反映出它们所有相关的动作。

为了进一步说明,我定义了Auto类和两个子类:CarTruck。我还定义了一个Action类和一个子类TruckAction。我定义了具有域自动和范围动作hasAction属性,以关联自动和动作。我进一步创建了几个不同类型的人:

  • 汽车
    • 卡车{F150}
    • 车{ChevyMalibu}
  • 动作{加速}
    • TruckAction {LoadCargo}

当我将Car 设为(hasAction值Accelerate)的子类时,我可以看到ChevyMalibu具有推断的对象属性hasAction Accelerate,但这似乎类似于对对象属性断言进行硬编码。我想为ChevyMalibu推断所有的汽车动作,以及为F150推断所有的 TruckActions 。我不太确定为什么做类似使Car成为(hasAction和Action的子类)之类的事情不会使我到那里。

我认为对OWL类型推断的雄辩回答有一个局限性与我的问题有关,但我不能完全加以总结。

Jos*_*lor 5

编码规则

您正确地注意到,如果单个xp值y的实例,则将推断断言p(x,y)。但是,简单地说xp的一个实例,有些Y不会(没有更多信息)不会让您推断出任何特定y i的 p(x,y i,即使y i是唯一的特定您声明的Y的实例。这是因为OWL做出了开放世界假设; 仅仅因为您还没有说某件事是正确的(或错误的),并不表示它不可能是正确的(或错误的)。(当然,您可能已经说过其他话,可以让您确定是真还是假。)这在另一个问题中进行了详细说明,为什么这个DL查询不返回任何个人?

如果我对它的理解正确,那么您想要做的就是说:

  1. 每个车辆都通过hasAction与每个Action相关
  2. 每个汽车都通过hasAction与每个CarAction相关
  3. 每个卡车都由hasAction关联到每个TruckAction

您可以通过两种方法来执行此操作。最简单的方法是简单地使用一些SWRL规则,另一个称为rolification

使用SWRL规则

您可以编写与上述规则相对应的SWRL规则,它们非常容易编写:

Vehicle(?v)∧Action(?a)→hasAction(?v,?a)
Car(?v)∧CarAction(?a)→hasAction(?v,?a)
Truck(?v)∧TruckAction(?a )→hasAction(?v,?a)

如果使用所有这些规则,则会发现每辆车的动作要多于您想要的动作,因为根据第一个规则,每辆车都与每个动作相关。例如,由于每个TruckAction也是Action,并且由于每辆Car都是Vehicle,因此第一个规则会将每个TruckAction与每辆Car关联起来,而您并不是真正想要的。即使这样,在这里使用一些规则也可能是最简单的选择。

使用旋转

如果您不想使用SWRL规则,那么另一个选择是rolification。我已经在回答几个问题时描述了旋转,以及如何进行旋转,因此您应该看一下:

这些将为您提供有关细化的更多详细信息。但是,要点是,我们获得了具有特殊行为的新属性,例如R Car:它们仅将特定类的实例与该相同实例相关联。例如,R Car将Car的每个实例与其 自身相关联,并且不执行其他任何操作。它实际上是特定类上的等价关系。

汽化在这里有什么用?这意味着我们可以使用子属性链公理来推断某些hasAction属性。例如,

hasAction⊑R Car •topObjectProperty•R CarAction

从本质上讲,这等效于SWRL规则(topObjectProperty是OWL的内置属性,将所有内容与所有内容相关联):

R Car(?c,?c)∧topObjectProperty(?c,?a)∧R CarAction(?a,?a)→hasAction(?c,?a)

但是,有两个优点:

  1. 子财产链公理不需要推理程序就可以支持SWRL;和
  2. 子财产链公理适用于所有个人,但SWRL规则仅适用于指定个人,因此您可以获得更好的覆盖率。

但是,您仍然会遇到与SWRL规则的特殊性相同的问题;如果您通过hasAction表示每个Vehicle与每个Action相关,那么该子属性链也将应用于vehicle的子类和action的子类。

但是,有一个明显的缺点:对于要在这些“规则”之一中使用的每个类,您都需要一个新属性和一个等效的类公理,这变得有些乏味。

行动的不同层次

由于SWRL规则方法和带有rolification方法的子属性链都存在以下问题:将每个车辆与每个动作相关联的通用规则将捕获Action子类中的所有动作,以及Vehicles子类中的车辆,因此您可能需要重组其中一个您的层次结构有点。我建议不要

Action
  CarAction
  TruckAction
Run Code Online (Sandbox Code Playgroud)

你用的

Action
  VehicleAction
  CarAction
  TruckAction
Run Code Online (Sandbox Code Playgroud)

而不是反映“车辆”下的层次结构。这样,您可以编写以下形式的规则:

每个车辆是关系到每一个GenericActionhasAction
是关系到每一个CarActionhasAction
卡车是关系到每一个TruckActionhasAction

使用SWRL规则

如果使用SWRL规则执行此操作,则它看起来像这样:

在此处输入图片说明

(Protégé的默认布局可能未包括编辑SWRL规则的位置。有关获取一个Protégé-OWL/ SWRL的说明,请参阅我对Ontology属性定义的回答。有关该操作的说明,请稍作调整;您无需下载或安装任何东西。)这将产生如下结果:

在此处输入图片说明

您可以复制并粘贴此本体:

@prefix :      </sf/ask/1505893581/#> .
@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#> .

:Action  a      owl:Class .

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

:DodgeRam  a    owl:NamedIndividual , :Truck .

:Truck  a                owl:Class ;
        rdfs:subClassOf  :Vehicle .

:Car    a                owl:Class ;
        rdfs:subClassOf  :Vehicle .

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

:LoadCargo  a   owl:NamedIndividual , :TruckAction .

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

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

             ]
] .

:Accelerate  a  owl:NamedIndividual , :GenericAction .

:F150   a       owl:NamedIndividual , :Truck .

:FordFocusZX5  a  owl:NamedIndividual , :Car .

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

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

             ]
] .

:Brake  a       owl:NamedIndividual , :GenericAction .

:hasAction  a   owl:ObjectProperty .

:GenericAction  a        owl:Class ;
        rdfs:subClassOf  :Action .

</sf/ask/1505893581/>
        a       owl:Ontology .

:Vehicle  a     owl:Class .

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

:ChevyMalibu  a  owl:NamedIndividual , :Car .

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

:CarAction  a            owl:Class ;
        rdfs:subClassOf  :Action .

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

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

             ]
] .

:TruckAction  a          owl:Class ;
        rdfs:subClassOf  :Action .
Run Code Online (Sandbox Code Playgroud)

有汽化作用

如果您使用rolification进行此操作,则如下所示: 在此处输入图片说明

您会得到预期的结果:

在此处输入图片说明

您可以复制并粘贴此本体:

@prefix :      </sf/ask/1505893581/#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:GenericAction  a            owl:Class ;
        rdfs:subClassOf      :Action ;
        owl:equivalentClass  [ a               owl:Restriction ;
                               owl:hasSelf     true ;
                               owl:onProperty  :R_GenericAction
                             ] .

:Car    a                    owl:Class ;
        rdfs:subClassOf      :Vehicle ;
        owl:equivalentClass  [ a               owl:Restriction ;
                               owl:hasSelf     true ;
                               owl:onProperty  :R_Car
                             ] .

:CarAction  a                owl:Class ;
        rdfs:subClassOf      :Action ;
        owl:equivalentClass  [ a               owl:Restriction ;
                               owl:hasSelf     true ;
                               owl:onProperty  :R_CarAction
                             ] .

:R_TruckAction  a  owl:ObjectProperty .

:R_Car  a       owl:ObjectProperty .

:Truck  a                    owl:Class ;
        rdfs:subClassOf      :Vehicle ;
        owl:equivalentClass  [ a               owl:Restriction ;
                               owl:hasSelf     true ;
                               owl:onProperty  :R_Truck
                             ] .

:Brake  a       owl:NamedIndividual , :GenericAction .

:hasAction  a                   owl:ObjectProperty ;
        owl:propertyChainAxiom  ( :R_Vehicle owl:topObjectProperty :R_GenericAction ) ;
        owl:propertyChainAxiom  ( :R_Car owl:topObjectProperty :R_CarAction ) ;
        owl:propertyChainAxiom  ( :R_Truck owl:topObjectProperty :R_TruckAction ) .

:R_CarAction  a  owl:ObjectProperty .

:R_Truck  a     owl:ObjectProperty .

:F150   a       owl:NamedIndividual , :Truck .

:Accelerate  a  owl:NamedIndividual , :GenericAction .

:Action  a      owl:Class .

:ChevyMalibu  a  owl:NamedIndividual , :Car .

:R_Vehicle  a   owl:ObjectProperty .

:FordFocusZX5  a  owl:NamedIndividual , :Car .

:R_GenericAction  a  owl:ObjectProperty .

:TruckAction  a              owl:Class ;
        rdfs:subClassOf      :Action ;
        owl:equivalentClass  [ a               owl:Restriction ;
                               owl:hasSelf     true ;
                               owl:onProperty  :R_TruckAction
                             ] .

:DodgeRam  a    owl:NamedIndividual , :Truck .

</sf/ask/1505893581/>
        a       owl:Ontology .

:LoadCargo  a   owl:NamedIndividual , :TruckAction .

:Vehicle  a                  owl:Class ;
        owl:equivalentClass  [ a               owl:Restriction ;
                               owl:hasSelf     true ;
                               owl:onProperty  :R_Vehicle
                             ] .
Run Code Online (Sandbox Code Playgroud)