OWL Онтология: как написать определение класса дополнения?
Разумщик не может классифицировать классы под классом 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>
1 ответ
Этот пример является частью стандартного учебника по OWL, см. Здесь. Очевидно, учебник немного противоречив.
декларирование VegetableTopping
быть Disjoint With
MeatTopping
решает проблему.