编码规则
您正确地注意到,如果单个x是p 值 y的实例,那么您将推断出断言p(x,y)。但是,简单地说x是p some Y的实例(没有更多信息)不会让您推断出任何特定y i的p(x,y i ),即使y i是唯一特定的您已声明的Y的实例。这是因为 OWL 做出了开放世界假设; 仅仅因为你没有说某事是真的(或假的)但并不意味着它不可能是真的(或假的)。(当然,您可能已经说过其他可以让您判断某事是真是假的事情。)这在另一个问题中进行了更详细的描述,为什么这个 DL-Query 没有返回任何个人?
如果我理解正确的话,你想要做的是这样说:
- 每个Vehicle都通过hasAction与每个Action相关联
- 每辆车都通过hasAction与每个CarAction相关联
- 每个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)
不过有两个优点:
- 子属性链公理不需要推理器来支持 SWRL;和
- 子属性链公理适用于所有个体,但 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
] .