Размышляющему не удается классифицировать классы под классом A, который определен как дополнение к другому классу B.
Я создал минимальный пример онтологии OWL (на основе известного примера пиццы) в протеже 5 дляпроиллюстрируем эту проблему.
Существует два класса пиццы: Американа и Сохо: первый с мясной начинкой, а второй с овощной.Затем существует два класса: вегетарианская пицца, определенная как пицца с овощной начинкой, и не вегетарианская пицца как пицца, не являющаяся вегетарианской пиццей.Сохо правильно классифицируется как вегетарианская пицца, но Американа не классифицируется как не вегетарианская пицца.
Может кто-нибудь объяснить, что не так?
Вот код:
<?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>