/* Copyright 2008, 2009, 2010 by the Oxford University Computing Laboratory This file is part of HermiT. HermiT is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. HermiT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with HermiT. If not, see <http://www.gnu.org/licenses/>. */ package org.semanticweb.HermiT.structural; import org.semanticweb.HermiT.model.AtomicRole; import org.semanticweb.owlapi.model.IRI; import org.semanticweb.owlapi.model.OWLClass; import org.semanticweb.owlapi.model.OWLClassAssertionAxiom; import org.semanticweb.owlapi.model.OWLClassExpression; import org.semanticweb.owlapi.model.OWLClassExpressionVisitor; import org.semanticweb.owlapi.model.OWLDataAllValuesFrom; import org.semanticweb.owlapi.model.OWLDataExactCardinality; import org.semanticweb.owlapi.model.OWLDataFactory; import org.semanticweb.owlapi.model.OWLDataHasValue; import org.semanticweb.owlapi.model.OWLDataMaxCardinality; import org.semanticweb.owlapi.model.OWLDataMinCardinality; import org.semanticweb.owlapi.model.OWLDataOneOf; import org.semanticweb.owlapi.model.OWLDataProperty; import org.semanticweb.owlapi.model.OWLDataPropertyAssertionAxiom; import org.semanticweb.owlapi.model.OWLDataPropertyExpression; import org.semanticweb.owlapi.model.OWLDataSomeValuesFrom; import org.semanticweb.owlapi.model.OWLDatatype; import org.semanticweb.owlapi.model.OWLDifferentIndividualsAxiom; import org.semanticweb.owlapi.model.OWLIndividual; import org.semanticweb.owlapi.model.OWLIndividualAxiom; import org.semanticweb.owlapi.model.OWLLiteral; import org.semanticweb.owlapi.model.OWLNegativeDataPropertyAssertionAxiom; import org.semanticweb.owlapi.model.OWLNegativeObjectPropertyAssertionAxiom; import org.semanticweb.owlapi.model.OWLObjectAllValuesFrom; import org.semanticweb.owlapi.model.OWLObjectComplementOf; import org.semanticweb.owlapi.model.OWLObjectExactCardinality; import org.semanticweb.owlapi.model.OWLObjectHasSelf; import org.semanticweb.owlapi.model.OWLObjectHasValue; import org.semanticweb.owlapi.model.OWLObjectIntersectionOf; import org.semanticweb.owlapi.model.OWLObjectMaxCardinality; import org.semanticweb.owlapi.model.OWLObjectMinCardinality; import org.semanticweb.owlapi.model.OWLObjectOneOf; import org.semanticweb.owlapi.model.OWLObjectProperty; import org.semanticweb.owlapi.model.OWLObjectPropertyAssertionAxiom; import org.semanticweb.owlapi.model.OWLObjectPropertyExpression; import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom; import org.semanticweb.owlapi.model.OWLObjectUnionOf; import org.semanticweb.owlapi.model.OWLSameIndividualAxiom; import org.semanticweb.owlapi.util.OWLAxiomVisitorAdapter; public class BuiltInPropertyManager { protected final OWLDataFactory m_factory; protected final OWLObjectProperty m_topObjectProperty; protected final OWLObjectProperty m_bottomObjectProperty; protected final OWLDataProperty m_topDataProperty; protected final OWLDataProperty m_bottomDataProperty; public BuiltInPropertyManager(OWLDataFactory factory) { m_factory=factory; m_topObjectProperty=m_factory.getOWLObjectProperty(IRI.create(AtomicRole.TOP_OBJECT_ROLE.getIRI())); m_bottomObjectProperty=m_factory.getOWLObjectProperty(IRI.create(AtomicRole.BOTTOM_OBJECT_ROLE.getIRI())); m_topDataProperty=m_factory.getOWLDataProperty(IRI.create(AtomicRole.TOP_DATA_ROLE.getIRI())); m_bottomDataProperty=m_factory.getOWLDataProperty(IRI.create(AtomicRole.BOTTOM_DATA_ROLE.getIRI())); } public void axiomatizeBuiltInPropertiesAsNeeded(OWLAxioms axioms,boolean skipTopObjectProperty,boolean skipBottomObjectProperty,boolean skipTopDataProperty,boolean skipBottomDataProperty) { Checker checker=new Checker(axioms); if (checker.m_usesTopObjectProperty && !skipTopObjectProperty) axiomatizeTopObjectProperty(axioms); if (checker.m_usesBottomObjectProperty && !skipBottomObjectProperty) axiomatizeBottomObjectProperty(axioms); if (checker.m_usesTopDataProperty && !skipTopDataProperty) axiomatizeTopDataProperty(axioms); if (checker.m_usesBottomDataProperty && !skipBottomDataProperty) axiomatizeBottomDataProperty(axioms); } public void axiomatizeBuiltInPropertiesAsNeeded(OWLAxioms axioms) { axiomatizeBuiltInPropertiesAsNeeded(axioms,false,false,false,false); } protected void axiomatizeTopObjectProperty(OWLAxioms axioms) { // TransitiveObjectProperty( owl:topObjectProperty ) axioms.m_complexObjectPropertyInclusions.add(new OWLAxioms.ComplexObjectPropertyInclusion(m_topObjectProperty)); // SymmetricObjectProperty( owl:topObjectProperty ) axioms.m_simpleObjectPropertyInclusions.add(new OWLObjectPropertyExpression[] { m_topObjectProperty,m_topObjectProperty.getInverseProperty() }); // SubClassOf( owl:Thing ObjectSomeValuesFrom( owl:topObjectProperty ObjectOneOf( <internal:nam#topIndividual> ) ) ) OWLIndividual newIndividual=m_factory.getOWLNamedIndividual(IRI.create("internal:nam#topIndividual")); OWLObjectOneOf oneOfNewIndividual=m_factory.getOWLObjectOneOf(newIndividual); OWLObjectSomeValuesFrom hasTopNewIndividual=m_factory.getOWLObjectSomeValuesFrom(m_topObjectProperty,oneOfNewIndividual); axioms.m_conceptInclusions.add(new OWLClassExpression[] { hasTopNewIndividual }); } protected void axiomatizeBottomObjectProperty(OWLAxioms axioms) { axioms.m_conceptInclusions.add(new OWLClassExpression[] { m_factory.getOWLObjectAllValuesFrom(m_bottomObjectProperty,m_factory.getOWLNothing()) }); } protected void axiomatizeTopDataProperty(OWLAxioms axioms) { OWLDatatype anonymousConstantsDatatype=m_factory.getOWLDatatype(IRI.create("internal:anonymous-constants")); OWLLiteral newConstant=m_factory.getOWLLiteral("internal:constant",anonymousConstantsDatatype); OWLDataOneOf oneOfNewConstant=m_factory.getOWLDataOneOf(newConstant); OWLDataSomeValuesFrom hasTopNewConstant=m_factory.getOWLDataSomeValuesFrom(m_topDataProperty,oneOfNewConstant); axioms.m_conceptInclusions.add(new OWLClassExpression[] { hasTopNewConstant }); } protected void axiomatizeBottomDataProperty(OWLAxioms axioms) { axioms.m_conceptInclusions.add(new OWLClassExpression[] { m_factory.getOWLDataAllValuesFrom(m_bottomDataProperty,m_factory.getOWLDataComplementOf(m_factory.getTopDatatype())) }); } protected class Checker implements OWLClassExpressionVisitor { public boolean m_usesTopObjectProperty; public boolean m_usesBottomObjectProperty; public boolean m_usesTopDataProperty; public boolean m_usesBottomDataProperty; public Checker(OWLAxioms axioms) { for (OWLClassExpression[] inclusion : axioms.m_conceptInclusions) for (OWLClassExpression description : inclusion) description.accept(this); for (OWLObjectPropertyExpression[] inclusion : axioms.m_simpleObjectPropertyInclusions) { visitProperty(inclusion[0]); visitProperty(inclusion[1]); } for (OWLAxioms.ComplexObjectPropertyInclusion inclusion : axioms.m_complexObjectPropertyInclusions) { for (OWLObjectPropertyExpression subObjectProperty : inclusion.m_subObjectProperties) visitProperty(subObjectProperty); visitProperty(inclusion.m_superObjectProperty); } for (OWLObjectPropertyExpression[] disjoint : axioms.m_disjointObjectProperties) for (int index=0;index<disjoint.length;index++) visitProperty(disjoint[index]); for (OWLObjectPropertyExpression property : axioms.m_reflexiveObjectProperties) visitProperty(property); for (OWLObjectPropertyExpression property : axioms.m_irreflexiveObjectProperties) visitProperty(property); for (OWLObjectPropertyExpression property : axioms.m_asymmetricObjectProperties) visitProperty(property); for (OWLDataPropertyExpression[] inclusion : axioms.m_dataPropertyInclusions) { visitProperty(inclusion[0]); visitProperty(inclusion[1]); } for (OWLDataPropertyExpression[] disjoint : axioms.m_disjointDataProperties) for (int index=0;index<disjoint.length;index++) visitProperty(disjoint[index]); FactVisitor factVisitor=new FactVisitor(); for (OWLIndividualAxiom fact : axioms.m_facts) fact.accept(factVisitor); } protected void visitProperty(OWLObjectPropertyExpression object) { if (object.getNamedProperty().equals(m_topObjectProperty)) m_usesTopObjectProperty=true; else if (object.getNamedProperty().equals(m_bottomObjectProperty)) m_usesBottomObjectProperty=true; } protected void visitProperty(OWLDataPropertyExpression object) { if (object.asOWLDataProperty().equals(m_topDataProperty)) m_usesTopDataProperty=true; else if (object.asOWLDataProperty().equals(m_bottomDataProperty)) m_usesBottomDataProperty=true; } public void visit(OWLClass object) { } public void visit(OWLObjectComplementOf object) { object.getOperand().accept(this); } public void visit(OWLObjectIntersectionOf object) { for (OWLClassExpression description : object.getOperands()) description.accept(this); } public void visit(OWLObjectUnionOf object) { for (OWLClassExpression description : object.getOperands()) description.accept(this); } public void visit(OWLObjectOneOf object) { } public void visit(OWLObjectSomeValuesFrom object) { visitProperty(object.getProperty()); object.getFiller().accept(this); } public void visit(OWLObjectHasValue object) { visitProperty(object.getProperty()); } public void visit(OWLObjectHasSelf object) { visitProperty(object.getProperty()); } public void visit(OWLObjectAllValuesFrom object) { visitProperty(object.getProperty()); object.getFiller().accept(this); } public void visit(OWLObjectMinCardinality object) { visitProperty(object.getProperty()); object.getFiller().accept(this); } public void visit(OWLObjectMaxCardinality object) { visitProperty(object.getProperty()); object.getFiller().accept(this); } public void visit(OWLObjectExactCardinality object) { visitProperty(object.getProperty()); object.getFiller().accept(this); } public void visit(OWLDataHasValue object) { visitProperty(object.getProperty()); } public void visit(OWLDataSomeValuesFrom object) { visitProperty(object.getProperty()); } public void visit(OWLDataAllValuesFrom object) { visitProperty(object.getProperty()); } public void visit(OWLDataMinCardinality object) { visitProperty(object.getProperty()); } public void visit(OWLDataMaxCardinality object) { visitProperty(object.getProperty()); } public void visit(OWLDataExactCardinality object) { visitProperty(object.getProperty()); } protected class FactVisitor extends OWLAxiomVisitorAdapter { public void visit(OWLSameIndividualAxiom object) { } public void visit(OWLDifferentIndividualsAxiom object) { } public void visit(OWLClassAssertionAxiom object) { object.getClassExpression().accept(Checker.this); } public void visit(OWLObjectPropertyAssertionAxiom object) { visitProperty(object.getProperty()); } public void visit(OWLNegativeObjectPropertyAssertionAxiom object) { visitProperty(object.getProperty()); } public void visit(OWLDataPropertyAssertionAxiom object) { visitProperty(object.getProperty()); } public void visit(OWLNegativeDataPropertyAssertionAxiom object) { visitProperty(object.getProperty()); } } } }