推理者无法在类A下对类进行分类,类A被定义为另一个类B的补充。
我在protege 5中创建了一个最小的OWL本体示例(基于着名的比萨示例)来说明这个问题。
有两种披萨类:Americana和Soho,前者配有肉类浇头,后者配有蔬菜浇头。然后有两个类:VegetarianPizza定义为带蔬菜浇头的比萨饼和NonVegetarianPizza定义为不是VegetarianPizza的比萨饼。 Soho被正确归类为VegetarianPizza,但Americana未被归类为NonVegetarianPizza。
有人可以解释什么是错的吗?
这是代码:
<?xml version="1.0"?>
<Ontology xmlns="http://www.w3.org/2002/07/owl#"
xml:base="http://www.pizza.com/ontologies/pizza-minimal.owl"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
ontologyIRI="http://www.pizza.com/ontologies/pizza-minimal.owl"
versionIRI="http://www.pizza.com/ontologies/pizza-minimal.owl/v1.0">
<Prefix name="" IRI="http://www.pizza.com/ontologies/pizza-minimal.owl"/>
<Prefix name="owl" IRI="http://www.w3.org/2002/07/owl#"/>
<Prefix name="rdf" IRI="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/>
<Prefix name="xml" IRI="http://www.w3.org/XML/1998/namespace"/>
<Prefix name="xsd" IRI="http://www.w3.org/2001/XMLSchema#"/>
<Prefix name="rdfs" IRI="http://www.w3.org/2000/01/rdf-schema#"/>
<Declaration>
<ObjectProperty IRI="#isToppingOf"/>
</Declaration>
<Declaration>
<ObjectProperty IRI="#hasTopping"/>
</Declaration>
<Declaration>
<Class IRI="#NonVegetarianPizza"/>
</Declaration>
<Declaration>
<Class IRI="#SohoPizza"/>
</Declaration>
<Declaration>
<Class IRI="#VegetableTopping"/>
</Declaration>
<Declaration>
<Class IRI="#VegetarianPizza"/>
</Declaration>
<Declaration>
<Class IRI="#Pizza"/>
</Declaration>
<Declaration>
<Class IRI="#MeatTopping"/>
</Declaration>
<Declaration>
<Class IRI="#PizzaTopping"/>
</Declaration>
<Declaration>
<Class IRI="#AmericanaPizza"/>
</Declaration>
<EquivalentClasses>
<Class IRI="#NonVegetarianPizza"/>
<ObjectIntersectionOf>
<Class IRI="#Pizza"/>
<ObjectComplementOf>
<Class IRI="#VegetarianPizza"/>
</ObjectComplementOf>
</ObjectIntersectionOf>
</EquivalentClasses>
<EquivalentClasses>
<Class IRI="#VegetarianPizza"/>
<ObjectIntersectionOf>
<Class IRI="#Pizza"/>
<ObjectAllValuesFrom>
<ObjectProperty IRI="#hasTopping"/>
<Class IRI="#VegetableTopping"/>
</ObjectAllValuesFrom>
</ObjectIntersectionOf>
</EquivalentClasses>
<SubClassOf>
<Class IRI="#AmericanaPizza"/>
<Class IRI="#Pizza"/>
</SubClassOf>
<SubClassOf>
<Class IRI="#AmericanaPizza"/>
<ObjectSomeValuesFrom>
<ObjectProperty IRI="#hasTopping"/>
<Class IRI="#MeatTopping"/>
</ObjectSomeValuesFrom>
</SubClassOf>
<SubClassOf>
<Class IRI="#AmericanaPizza"/>
<ObjectAllValuesFrom>
<ObjectProperty IRI="#hasTopping"/>
<Class IRI="#MeatTopping"/>
</ObjectAllValuesFrom>
</SubClassOf>
<SubClassOf>
<Class IRI="#MeatTopping"/>
<Class IRI="#PizzaTopping"/>
</SubClassOf>
<SubClassOf>
<Class IRI="#SohoPizza"/>
<Class IRI="#Pizza"/>
</SubClassOf>
<SubClassOf>
<Class IRI="#SohoPizza"/>
<ObjectSomeValuesFrom>
<ObjectProperty IRI="#hasTopping"/>
<Class IRI="#VegetableTopping"/>
</ObjectSomeValuesFrom>
</SubClassOf>
<SubClassOf>
<Class IRI="#SohoPizza"/>
<ObjectAllValuesFrom>
<ObjectProperty IRI="#hasTopping"/>
<Class IRI="#VegetableTopping"/>
</ObjectAllValuesFrom>
</SubClassOf>
<SubClassOf>
<Class IRI="#VegetableTopping"/>
<Class IRI="#PizzaTopping"/>
</SubClassOf>
<InverseObjectProperties>
<ObjectProperty IRI="#hasTopping"/>
<ObjectProperty IRI="#isToppingOf"/>
</InverseObjectProperties>
<ObjectPropertyDomain>
<ObjectProperty IRI="#hasTopping"/>
<Class IRI="#Pizza"/>
</ObjectPropertyDomain>
<ObjectPropertyRange>
<ObjectProperty IRI="#hasTopping"/>
<Class IRI="#PizzaTopping"/>
</ObjectPropertyRange>
</Ontology>
此示例是标准OWL教程的一部分,请参阅here。显然教程有点不一致。
宣布VegetableTopping
为Disjoint With
MeatTopping
解决了这个问题。