package org.semanticweb.HermiT.reasoner; import org.semanticweb.HermiT.EntailmentChecker; import org.semanticweb.owlapi.io.OWLOntologyDocumentSource; import org.semanticweb.owlapi.io.StringDocumentSource; import org.semanticweb.owlapi.model.IRI; import org.semanticweb.owlapi.model.OWLOntology; public class EntailmentTest extends AbstractReasonerTest { public EntailmentTest(String name) { super(name); } public void testHasKey() throws Exception { String axioms = "Declaration(DataProperty(:dp))" + "ClassAssertion(owl:Thing :a)" + "SubClassOf(owl:Thing ObjectIntersectionOf(DataAllValuesFrom(:dp xsd:string) DataAllValuesFrom(:dp xsd:integer)))"; loadReasonerWithAxioms(axioms); axioms = "HasKey(owl:Thing () (:dp))"; OWLOntology conlusions=getOntologyWithAxioms(axioms); assertEntails(conlusions.getLogicalAxioms(), true); } public void testBlankNodes1() throws Exception { String axioms = "Declaration(ObjectProperty(:p))" + "ClassAssertion(owl:Thing :a )" + "ObjectPropertyAssertion(:p :a _:anon)"; loadReasonerWithAxioms(axioms); m_ontologyManager.removeOntology(m_ontology); axioms = "ClassAssertion(ObjectSomeValuesFrom(:p owl:Thing) :a)"; OWLOntology conlusions=getOntologyWithAxioms(axioms); assertEntails(conlusions.getLogicalAxioms(), true); } public void testInvalidBlankNodes() throws Exception { String axioms = "ClassAssertion(ObjectSomeValuesFrom(:p ObjectSomeValuesFrom(:s owl:Thing)) :a)" + "SubObjectPropertyOf( :s :r- )" + "InverseObjectProperties( :r- :r ) "; loadReasonerWithAxioms(axioms); m_ontologyManager.removeOntology(m_ontology); axioms = "ObjectPropertyAssertion(:p :a _:anon1)" + "ObjectPropertyAssertion(:s _:anon1 _:anon2)" + "ObjectPropertyAssertion(:r _:anon2 _:anon1)"; OWLOntology conlusions=getOntologyWithAxioms(axioms); try { new EntailmentChecker(m_reasoner, m_dataFactory).entails(conlusions.getLogicalAxioms()); fail(); } catch (Exception e) { // blank nodes in the conclusion ontology should not contain cycles } } public void testValidBlankNodesWithNominals() throws Exception { String axioms = "ClassAssertion(ObjectSomeValuesFrom(:p ObjectSomeValuesFrom(:s ObjectOneOf(:b))) :a)" + "SubObjectPropertyOf( :s :r )"; loadReasonerWithAxioms(axioms); m_ontologyManager.removeOntology(m_ontology); axioms = "ObjectPropertyAssertion(:p :a _:anon1)" + "ObjectPropertyAssertion(:r _:anon1 :b)"; OWLOntology conlusions=getOntologyWithAxioms(axioms); assertEntails(conlusions.getLogicalAxioms(), true); } public void testValidBlankNodesInPremise() throws Exception { String axioms = "ObjectPropertyAssertion(:r :a _:anon1)" + "ObjectPropertyAssertion(:s _:anon1 _:anon2)"; loadReasonerWithAxioms(axioms); m_ontologyManager.removeOntology(m_ontology); axioms = "ObjectPropertyAssertion(:r _:anon1 _:anon2)"; OWLOntology conlusions=getOntologyWithAxioms(axioms); assertEntails(conlusions.getLogicalAxioms(), true); } public void testValidBlankNodes() throws Exception { String axioms = "ObjectPropertyAssertion(:r :a :b)" + "ObjectPropertyAssertion(:s :b :c)"; loadReasonerWithAxioms(axioms); m_ontologyManager.removeOntology(m_ontology); axioms = "ObjectPropertyAssertion(:r _:anon1 _:anon2)"; OWLOntology conlusions=getOntologyWithAxioms(axioms); assertEntails(conlusions.getLogicalAxioms(), true); } public void testBlankWithDTs() throws Exception { String axioms = "ObjectPropertyAssertion(:r :a :b)" + "ObjectPropertyAssertion(:s :b :c)"; loadReasonerWithAxioms(axioms); m_ontologyManager.removeOntology(m_ontology); axioms = "DataPropertyAssertion(:dp _:anon1 \"test\")"; OWLOntology conlusions=getOntologyWithAxioms(axioms); assertEntails(conlusions.getLogicalAxioms(), false); } public void testBlankWithDTs2() throws Exception { String axioms = "DataPropertyAssertion(:dp :a \"test\")" + "ObjectPropertyAssertion(:s :b :c)"; loadReasonerWithAxioms(axioms); m_ontologyManager.removeOntology(m_ontology); axioms = "DataPropertyAssertion(:dp _:anon1 \"test\")"; OWLOntology conlusions=getOntologyWithAxioms(axioms); assertEntails(conlusions.getLogicalAxioms(), true); } public void testBlankWithDTs3() throws Exception { String axioms = "DataPropertyAssertion(:dp :a \"test\")" + "ObjectPropertyAssertion(:s :b :c)"; loadReasonerWithAxioms(axioms); m_ontologyManager.removeOntology(m_ontology); axioms = "DataPropertyAssertion(:dp _:anon1 \"test\"^^xsd:string)"; OWLOntology conlusions=getOntologyWithAxioms(axioms); assertEntails(conlusions.getLogicalAxioms(), true); } protected OWLOntology getOntologyFromRessource(String resourceName) throws Exception { IRI physicalIRI=IRI.create(getClass().getResource(resourceName).toURI()); return m_ontologyManager.loadOntologyFromOntologyDocument(physicalIRI); } protected OWLOntology getOntologyWithAxioms(String axioms) throws Exception { StringBuffer buffer=new StringBuffer(); buffer.append("Prefix(:=<"+NS+">)"); buffer.append("Prefix(a:=<"+NS+">)"); buffer.append("Prefix(rdfs:=<http://www.w3.org/2000/01/rdf-schema#>)"); buffer.append("Prefix(owl2xml:=<http://www.w3.org/2006/12/owl2-xml#>)"); buffer.append("Prefix(test:=<"+NS+">)"); buffer.append("Prefix(owl:=<http://www.w3.org/2002/07/owl#>)"); buffer.append("Prefix(xsd:=<http://www.w3.org/2001/XMLSchema#>)"); buffer.append("Prefix(rdf:=<http://www.w3.org/1999/02/22-rdf-syntax-ns#>)"); buffer.append("Ontology("); buffer.append(axioms); buffer.append(")"); OWLOntologyDocumentSource input=new StringDocumentSource(buffer.toString()); return m_ontologyManager.loadOntologyFromOntologyDocument(input); } }