3

一般问题

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

C subClassOf (pv)

但我想我希望能够更多地按照

C subClassOf (p some V)

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

一个具体的例子

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

为了添加更多细节,我定义了Auto类和两个子类:CarTruck。我还定义了一个Action类和一个子类TruckAction。我已经定义了一个具有域Auto和范围Action的hasAction属性来关联自动和操作。我进一步创造了几个不同类型的个体:

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

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

我认为带有限制的 OWL 类型推断的雄辩答案与我的问题有关,但我不能完全加起来。

4

1 回答 1

5

编码规则

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

如果我理解正确的话,你想要做的是这样说:

  1. 每个Vehicle都通过hasAction与每个Action相关联
  2. 每辆车都通过hasAction与每个CarAction相关
  3. 每个Truck都通过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。我已经在几个问题的答案中描述了 rolification 以及如何做到这一点,所以你应该看看:

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

rolification 在这里有什么用处?这意味着我们可以使用子属性链公理来推断一些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 规则的特殊性相同的问题;如果您说每个Vehicle通过hasAction与每个Action相关联,那么该子属性链也将适用于 vehicle 的子类和 action 的子类。

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

不同的操作层次结构

因为 SWRL 规则方法和具有 rolification 方法的子属性链都存在将每个车辆与每个动作相关联的通用规则将捕获来自 Action 子类的所有动作和来自 Vehicles 子类的车辆的问题,您可能需要重组其中一个你的层次结构有点。我建议而不是

Action
  CarAction
  TruckAction

你用的

Action
  VehicleAction
  CarAction
  TruckAction

而不是镜像您在 Vehicle 下的层次结构。这样您就可以编写以下形式的规则:

每个Vehicle通过hasAction与每个GenericAction相关 每辆Car通过hasAction与每个CarAction相关 每辆Truck通过hasAction与每个TruckAction相关

使用 SWRL 规则

如果您使用 SWRL 规则执行此操作,则如下所示:

在此处输入图像描述

(不过,Protégé 的默认布局可能不包括编辑 SWRL 规则的位置。请参阅我在 Protégé-OWL / SWRL 中对 Ontology 属性定义的回答以获取有关获取的说明。这只是一个小的界面调整;您不需要下载或安装任何东西。)这会产生如下结果:

在此处输入图像描述

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

@prefix :      <https://stackoverflow.com/q/21512765/1281433/cars#> .
@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 .

<https://stackoverflow.com/q/21512765/1281433/cars>
        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 .

与罗化

如果您使用 rolification 执行此操作,它看起来像这样: 在此处输入图像描述

你会得到你期望的结果:

在此处输入图像描述

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

@prefix :      <https://stackoverflow.com/q/21512765/1281433/cars#> .
@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 .

<https://stackoverflow.com/q/21512765/1281433/cars>
        a       owl:Ontology .

:LoadCargo  a   owl:NamedIndividual , :TruckAction .

:Vehicle  a                  owl:Class ;
        owl:equivalentClass  [ a               owl:Restriction ;
                               owl:hasSelf     true ;
                               owl:onProperty  :R_Vehicle
                             ] .
于 2014-02-02T23:32:05.980 回答