Ali
Ali

Reputation: 183

OWL Ontology: how to write a complement class definition?

The reasoner fails to classify classes under a class A that is defined as a complement of another class B.

I have created a minimal OWL ontology example (based on the famous pizza example) in protege 5 to illustrate this problem.

There are two pizza classes: Americana and Soho, the former with meat toppings and the latter with vegetable toppings. There are then two classes: VegetarianPizza defined as those pizzas with vegetable toppings and NonVegetarianPizza as those pizzas that are not a VegetarianPizza. Soho is correctly classified under VegetarianPizza but Americana isn't getting classified under NonVegetarianPizza.

Could someone explain what's wrong?

Here is the code:

<?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>

Upvotes: 0

Views: 675

Answers (1)

Ali
Ali

Reputation: 183

This example is part of the standard OWL tutorial, see here. Apparently the tutorial is a bit inconsistent.

Declaring VegetableTopping to be Disjoint With MeatTopping solves the problem.

Upvotes: 1

Related Questions