package uk.ac.manchester.cs.jfact; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; import org.semanticweb.owlapi.model.OWLAnnotationAssertionAxiom; import org.semanticweb.owlapi.model.OWLAnnotationPropertyDomainAxiom; import org.semanticweb.owlapi.model.OWLAnnotationPropertyRangeAxiom; import org.semanticweb.owlapi.model.OWLAsymmetricObjectPropertyAxiom; import org.semanticweb.owlapi.model.OWLAxiomVisitorEx; import org.semanticweb.owlapi.model.OWLClassAssertionAxiom; import org.semanticweb.owlapi.model.OWLClassExpression; import org.semanticweb.owlapi.model.OWLDataFactory; import org.semanticweb.owlapi.model.OWLDataPropertyAssertionAxiom; import org.semanticweb.owlapi.model.OWLDataPropertyDomainAxiom; import org.semanticweb.owlapi.model.OWLDataPropertyExpression; import org.semanticweb.owlapi.model.OWLDataPropertyRangeAxiom; import org.semanticweb.owlapi.model.OWLDatatypeDefinitionAxiom; import org.semanticweb.owlapi.model.OWLDeclarationAxiom; import org.semanticweb.owlapi.model.OWLDifferentIndividualsAxiom; import org.semanticweb.owlapi.model.OWLDisjointClassesAxiom; import org.semanticweb.owlapi.model.OWLDisjointDataPropertiesAxiom; import org.semanticweb.owlapi.model.OWLDisjointObjectPropertiesAxiom; import org.semanticweb.owlapi.model.OWLDisjointUnionAxiom; import org.semanticweb.owlapi.model.OWLEntity; import org.semanticweb.owlapi.model.OWLEquivalentClassesAxiom; import org.semanticweb.owlapi.model.OWLEquivalentDataPropertiesAxiom; import org.semanticweb.owlapi.model.OWLEquivalentObjectPropertiesAxiom; import org.semanticweb.owlapi.model.OWLFunctionalDataPropertyAxiom; import org.semanticweb.owlapi.model.OWLFunctionalObjectPropertyAxiom; import org.semanticweb.owlapi.model.OWLHasKeyAxiom; import org.semanticweb.owlapi.model.OWLInverseFunctionalObjectPropertyAxiom; import org.semanticweb.owlapi.model.OWLInverseObjectPropertiesAxiom; import org.semanticweb.owlapi.model.OWLIrreflexiveObjectPropertyAxiom; import org.semanticweb.owlapi.model.OWLNegativeDataPropertyAssertionAxiom; import org.semanticweb.owlapi.model.OWLNegativeObjectPropertyAssertionAxiom; import org.semanticweb.owlapi.model.OWLObjectPropertyAssertionAxiom; import org.semanticweb.owlapi.model.OWLObjectPropertyDomainAxiom; import org.semanticweb.owlapi.model.OWLObjectPropertyExpression; import org.semanticweb.owlapi.model.OWLObjectPropertyRangeAxiom; import org.semanticweb.owlapi.model.OWLReflexiveObjectPropertyAxiom; import org.semanticweb.owlapi.model.OWLSameIndividualAxiom; import org.semanticweb.owlapi.model.OWLSubAnnotationPropertyOfAxiom; import org.semanticweb.owlapi.model.OWLSubClassOfAxiom; import org.semanticweb.owlapi.model.OWLSubDataPropertyOfAxiom; import org.semanticweb.owlapi.model.OWLSubObjectPropertyOfAxiom; import org.semanticweb.owlapi.model.OWLSubPropertyChainOfAxiom; import org.semanticweb.owlapi.model.OWLSymmetricObjectPropertyAxiom; import org.semanticweb.owlapi.model.OWLTransitiveObjectPropertyAxiom; import org.semanticweb.owlapi.model.SWRLRule; import org.semanticweb.owlapi.reasoner.ReasonerInternalException; import uk.ac.manchester.cs.jfact.kernel.ExpressionManager; import uk.ac.manchester.cs.jfact.kernel.Ontology; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomConceptInclusion; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomDRoleDomain; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomDRoleFunctional; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomDRoleRange; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomDRoleSubsumption; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomDifferentIndividuals; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomDisjointConcepts; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomDisjointDRoles; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomDisjointORoles; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomDisjointUnion; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomEquivalentConcepts; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomEquivalentDRoles; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomEquivalentORoles; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomInstanceOf; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomORoleDomain; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomORoleFunctional; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomORoleRange; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomORoleSubsumption; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomRelatedTo; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomRelatedToNot; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomRoleAsymmetric; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomRoleInverse; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomRoleInverseFunctional; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomRoleIrreflexive; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomRoleReflexive; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomRoleSymmetric; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomRoleTransitive; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomSameIndividuals; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomValueOf; import uk.ac.manchester.cs.jfact.kernel.dl.axioms.AxiomValueOfNot; import uk.ac.manchester.cs.jfact.kernel.dl.interfaces.AxiomInterface; import uk.ac.manchester.cs.jfact.kernel.dl.interfaces.ConceptExpression; import uk.ac.manchester.cs.jfact.kernel.dl.interfaces.DataRoleExpression; import uk.ac.manchester.cs.jfact.kernel.dl.interfaces.ObjectRoleExpression; /** axiom translator */ public class AxiomTranslator implements OWLAxiomVisitorEx<AxiomInterface>, Serializable { private static final long serialVersionUID = 11000L; private final DeclarationVisitorEx v; private Ontology o; private TranslationMachinery tr; private ExpressionManager em; /** * @param o * o * @param df * df * @param tr * tr * @param em * em */ public AxiomTranslator(Ontology o, OWLDataFactory df, TranslationMachinery tr, ExpressionManager em) { v = new DeclarationVisitorEx(o, df, tr); this.o = o; this.tr = tr; this.em = em; } @Override public AxiomInterface visit(OWLSubClassOfAxiom axiom) { return o.add(new AxiomConceptInclusion(axiom, tr.pointer(axiom .getSubClass()), tr.pointer(axiom.getSuperClass()))); } @Override public AxiomInterface visit(OWLNegativeObjectPropertyAssertionAxiom axiom) { return o.add(new AxiomRelatedToNot(axiom, tr.pointer(axiom.getSubject()), tr.pointer(axiom.getProperty()), tr.pointer(axiom.getObject()))); } @Override public AxiomInterface visit(OWLAsymmetricObjectPropertyAxiom axiom) { return o.add(new AxiomRoleAsymmetric(axiom, tr.pointer(axiom .getProperty()))); } @Override public AxiomInterface visit(OWLReflexiveObjectPropertyAxiom axiom) { return o.add(new AxiomRoleReflexive(axiom, tr.pointer(axiom .getProperty()))); } @Override public AxiomInterface visit(OWLDisjointClassesAxiom axiom) { return o.add(new AxiomDisjointConcepts(axiom, translateClassExpressionSet(axiom.getClassExpressions()))); } private List<ConceptExpression> translateClassExpressionSet( Set<OWLClassExpression> classExpressions) { List<ConceptExpression> l = new ArrayList<ConceptExpression>(); for (OWLClassExpression ce : classExpressions) { l.add(tr.pointer(ce)); } return l; } @Override public AxiomInterface visit(OWLDataPropertyDomainAxiom axiom) { return o.add(new AxiomDRoleDomain(axiom, tr.pointer(axiom.getProperty()), tr.pointer(axiom.getDomain()))); } @Override public AxiomInterface visit(OWLObjectPropertyDomainAxiom axiom) { return o.add(new AxiomORoleDomain(axiom, tr.pointer(axiom.getProperty()), tr.pointer(axiom.getDomain()))); } @Override public AxiomInterface visit(OWLEquivalentObjectPropertiesAxiom axiom) { return o.add(new AxiomEquivalentORoles(axiom, translateObjectPropertySet(axiom.getProperties()))); } private List<ObjectRoleExpression> translateObjectPropertySet( Collection<OWLObjectPropertyExpression> properties) { List<ObjectRoleExpression> l = new ArrayList<ObjectRoleExpression>(); for (OWLObjectPropertyExpression property : properties) { l.add(tr.pointer(property)); } return l; } @Override public AxiomInterface visit(OWLNegativeDataPropertyAssertionAxiom axiom) { return o.add(new AxiomValueOfNot(axiom, tr.pointer(axiom.getSubject()), tr.pointer(axiom.getProperty()), tr.pointer(axiom.getObject()))); } @Override public AxiomInterface visit(OWLDifferentIndividualsAxiom axiom) { return o.add(new AxiomDifferentIndividuals(axiom, tr.translate(axiom .getIndividuals()))); } @Override public AxiomInterface visit(OWLDisjointDataPropertiesAxiom axiom) { return o.add(new AxiomDisjointDRoles(axiom, translateDataPropertySet(axiom.getProperties()))); } private List<DataRoleExpression> translateDataPropertySet( Set<OWLDataPropertyExpression> properties) { List<DataRoleExpression> l = new ArrayList<DataRoleExpression>(); for (OWLDataPropertyExpression property : properties) { l.add(tr.pointer(property)); } return l; } @Override public AxiomInterface visit(OWLDisjointObjectPropertiesAxiom axiom) { return o.add(new AxiomDisjointORoles(axiom, translateObjectPropertySet(axiom.getProperties()))); } @Override public AxiomInterface visit(OWLObjectPropertyRangeAxiom axiom) { return o.add(new AxiomORoleRange(axiom, tr.pointer(axiom.getProperty()), tr.pointer(axiom.getRange()))); } @Override public AxiomInterface visit(OWLObjectPropertyAssertionAxiom axiom) { return o.add(new AxiomRelatedTo(axiom, tr.pointer(axiom.getSubject()), tr.pointer(axiom.getProperty()), tr.pointer(axiom.getObject()))); } @Override public AxiomInterface visit(OWLFunctionalObjectPropertyAxiom axiom) { return o.add(new AxiomORoleFunctional(axiom, tr.pointer(axiom .getProperty()))); } @Override public AxiomInterface visit(OWLSubObjectPropertyOfAxiom axiom) { return o.add(new AxiomORoleSubsumption(axiom, tr.pointer(axiom .getSubProperty()), tr.pointer(axiom.getSuperProperty()))); } @Override public AxiomInterface visit(OWLDisjointUnionAxiom axiom) { return o.add(new AxiomDisjointUnion(axiom, tr.pointer(axiom .getOWLClass()), translateClassExpressionSet(axiom .getClassExpressions()))); } @Override public AxiomInterface visit(OWLDeclarationAxiom axiom) { OWLEntity entity = axiom.getEntity(); return entity.accept(v); } @Override public AxiomInterface visit(OWLAnnotationAssertionAxiom axiom) { // Ignore return null; } @Override public AxiomInterface visit(OWLSymmetricObjectPropertyAxiom axiom) { return o.add(new AxiomRoleSymmetric(axiom, tr.pointer(axiom .getProperty()))); } @Override public AxiomInterface visit(OWLDataPropertyRangeAxiom axiom) { return o.add(new AxiomDRoleRange(axiom, tr.pointer(axiom.getProperty()), tr.pointer(axiom.getRange()))); } @Override public AxiomInterface visit(OWLFunctionalDataPropertyAxiom axiom) { return o.add(new AxiomDRoleFunctional(axiom, tr.pointer(axiom .getProperty()))); } @Override public AxiomInterface visit(OWLEquivalentDataPropertiesAxiom axiom) { return o.add(new AxiomEquivalentDRoles(axiom, translateDataPropertySet(axiom.getProperties()))); } @Override public AxiomInterface visit(OWLClassAssertionAxiom axiom) { return o.add(new AxiomInstanceOf(axiom, tr.pointer(axiom .getIndividual()), tr.pointer(axiom.getClassExpression()))); } @Override public AxiomInterface visit(OWLEquivalentClassesAxiom axiom) { return o.add(new AxiomEquivalentConcepts(axiom, translateClassExpressionSet(axiom.getClassExpressions()))); } @Override public AxiomInterface visit(OWLDataPropertyAssertionAxiom axiom) { return o.add(new AxiomValueOf(axiom, tr.pointer(axiom.getSubject()), tr .pointer(axiom.getProperty()), tr.pointer(axiom.getObject()))); } @Override public AxiomInterface visit(OWLTransitiveObjectPropertyAxiom axiom) { return o.add(new AxiomRoleTransitive(axiom, tr.pointer(axiom .getProperty()))); } @Override public AxiomInterface visit(OWLIrreflexiveObjectPropertyAxiom axiom) { return o.add(new AxiomRoleIrreflexive(axiom, tr.pointer(axiom .getProperty()))); } @Override public AxiomInterface visit(OWLSubDataPropertyOfAxiom axiom) { return o.add(new AxiomDRoleSubsumption(axiom, tr.pointer(axiom .getSubProperty()), tr.pointer(axiom.getSuperProperty()))); } @Override public AxiomInterface visit(OWLInverseFunctionalObjectPropertyAxiom axiom) { return o.add(new AxiomRoleInverseFunctional(axiom, tr.pointer(axiom .getProperty()))); } @Override public AxiomInterface visit(OWLSameIndividualAxiom axiom) { return o.add(new AxiomSameIndividuals(axiom, tr.translate(axiom .getIndividuals()))); } @Override public AxiomInterface visit(OWLSubPropertyChainOfAxiom axiom) { return o.add(new AxiomORoleSubsumption(axiom, em .compose(translateObjectPropertySet(axiom.getPropertyChain())), tr.pointer(axiom.getSuperProperty()))); } @Override public AxiomInterface visit(OWLInverseObjectPropertiesAxiom axiom) { return o.add(new AxiomRoleInverse(axiom, tr.pointer(axiom .getFirstProperty()), tr.pointer(axiom.getSecondProperty()))); } @Override public AxiomInterface visit(OWLHasKeyAxiom axiom) { // translateObjectPropertySet(axiom.getObjectPropertyExpressions()); // TDLObjectRoleExpression objectPropertyPointer = kernel // .getObjectPropertyKey(); // translateDataPropertySet(axiom.getDataPropertyExpressions()); throw new ReasonerInternalException( "JFact Kernel: unsupported operation 'getDataPropertyKey' " + axiom); // TDLDataRoleExpression dataPropertyPointer = kernel // .getDataPropertyKey(); // return kernel.tellHasKey( // toClassPointer(axiom.getClassExpression()), // dataPropertyPointer, objectPropertyPointer); } @Override public AxiomInterface visit(OWLDatatypeDefinitionAxiom axiom) { throw new ReasonerInternalException( "JFact Kernel: unsupported operation 'OWLDatatypeDefinitionAxiom' " + axiom); // kernel.getDataSubType(axiom.getDatatype().getIRI().toString(), // toDataTypeExpressionPointer(axiom.getDataRange())); } @Override public AxiomInterface visit(SWRLRule rule) { // Ignore return null; } @Override public AxiomInterface visit(OWLSubAnnotationPropertyOfAxiom axiom) { // Ignore return null; } @Override public AxiomInterface visit(OWLAnnotationPropertyDomainAxiom axiom) { // Ignore return null; } @Override public AxiomInterface visit(OWLAnnotationPropertyRangeAxiom axiom) { // Ignore return null; } }