From 537277d9ce3ba2aff1d66d1b19dbb77e17be0d48 Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Wed, 18 May 2022 15:09:37 +0100 Subject: build(hermit): bump HermiT v1.3.8.1 -> v1.4.5.519 This commit contains a "hacky" fix for KARMA2 to access some (now private) field in the OWLAxioms class. The code is now using Java Reflections to turn a private field public and gain access to internal resources. --- .../karma2/clausifier/OntologyProcesser.java | 36 +++++++++++++++++++--- .../ac/ox/cs/pagoda/reasoner/HermiTReasoner.java | 3 +- .../ox/cs/pagoda/reasoner/full/HermitChecker.java | 9 +++--- .../ac/ox/cs/pagoda/rules/LowerDatalogProgram.java | 5 +-- .../java/uk/ac/ox/cs/pagoda/rules/Program.java | 2 +- .../uk/ac/ox/cs/hermit/HermitQueryReasoner.java | 3 +- src/test/java/uk/ac/ox/cs/hermit/HermitTester.java | 2 +- .../uk/ac/ox/cs/pagoda/summary/SummaryTester.java | 3 +- 8 files changed, 47 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/main/java/org/semanticweb/karma2/clausifier/OntologyProcesser.java b/src/main/java/org/semanticweb/karma2/clausifier/OntologyProcesser.java index 5ff339e..8e97a2f 100644 --- a/src/main/java/org/semanticweb/karma2/clausifier/OntologyProcesser.java +++ b/src/main/java/org/semanticweb/karma2/clausifier/OntologyProcesser.java @@ -12,6 +12,7 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import java.lang.reflect.*; import org.semanticweb.HermiT.model.Atom; import org.semanticweb.HermiT.model.AtomicConcept; @@ -196,21 +197,46 @@ public class OntologyProcesser { public void clausify(OWLDataFactory factory,String ontologyIRI,OWLAxioms axioms,OWLAxiomsExpressivity axiomsExpressivity, File dataFile, File ruleFile) { Set dlClauses=new LinkedHashSet(); Set positiveFacts=new HashSet(); - for (OWLObjectPropertyExpression[] inclusion : axioms.m_simpleObjectPropertyInclusions) { - Atom subRoleAtom=getRoleAtom(inclusion[0],X,Y); - Atom superRoleAtom=getRoleAtom(inclusion[1],X,Y); + /* Quick fix (using Java reflexions) to access some fields that became private in later versions. + * TODO: find how to properly do this... don't be that guy! + */ + Field f_simpleObjectPropertyInclusions; + Field f_conceptInclusions; + Field f_facts; + Collection> m_simpleObjectPropertyInclusions; + Collection> m_conceptInclusions; + Collection m_facts; + try { + f_simpleObjectPropertyInclusions = axioms.getClass().getDeclaredField("m_simpleObjectPropertyInclusions"); + f_simpleObjectPropertyInclusions.setAccessible(true); + f_conceptInclusions = axioms.getClass().getDeclaredField("m_conceptInclusions"); + f_conceptInclusions.setAccessible(true); + f_facts = axioms.getClass().getDeclaredField("m_facts"); + f_facts.setAccessible(true); + m_simpleObjectPropertyInclusions = (Collection>) f_simpleObjectPropertyInclusions.get(axioms); + m_conceptInclusions = (Collection>) f_conceptInclusions.get(axioms); + m_facts = (Collection) f_facts.get(axioms); + } catch (java.lang.NoSuchFieldException e) { + return; + } catch (java.lang.IllegalAccessException e) { + return; + } + + for (List inclusion : m_simpleObjectPropertyInclusions) { + Atom subRoleAtom=getRoleAtom(inclusion.get(0),X,Y); + Atom superRoleAtom=getRoleAtom(inclusion.get(1),X,Y); DLClause dlClause=DLClause.create(new Atom[] { superRoleAtom },new Atom[] { subRoleAtom }); dlClauses.add(dlClause); } NormalizedDatalogAxiomClausifier clausifier=new NormalizedDatalogAxiomClausifier(positiveFacts,factory); - for (OWLClassExpression[] inclusion : axioms.m_conceptInclusions) { + for (List inclusion : m_conceptInclusions) { for (OWLClassExpression description : inclusion) description.accept(clausifier); for(DLClause dlClause :clausifier.getDLClause()) dlClauses.add(dlClause.getSafeVersion(AtomicConcept.THING)); } DatalogFactClausifier factClausifier=new DatalogFactClausifier(positiveFacts); - for (OWLIndividualAxiom fact : axioms.m_facts) + for (OWLIndividualAxiom fact : m_facts) fact.accept(factClausifier); writeDataFile(positiveFacts, dataFile); writeRules(dlClauses, ruleFile); diff --git a/src/main/java/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java b/src/main/java/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java index ac62488..ebf1960 100644 --- a/src/main/java/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java +++ b/src/main/java/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java @@ -1,5 +1,6 @@ package uk.ac.ox.cs.pagoda.reasoner; +import org.semanticweb.HermiT.Configuration; import org.semanticweb.HermiT.Reasoner; import org.semanticweb.owlapi.model.*; import uk.ac.ox.cs.JRDFox.model.Individual; @@ -63,7 +64,7 @@ class HermiTReasoner extends QueryReasoner { factory = onto.getOWLOntologyManager().getOWLDataFactory(); roller = new QueryRoller(factory); - hermit = new Reasoner(onto); + hermit = new Reasoner(new Configuration(), onto); return isConsistent(); } diff --git a/src/main/java/uk/ac/ox/cs/pagoda/reasoner/full/HermitChecker.java b/src/main/java/uk/ac/ox/cs/pagoda/reasoner/full/HermitChecker.java index 3f3c22d..fb7e062 100644 --- a/src/main/java/uk/ac/ox/cs/pagoda/reasoner/full/HermitChecker.java +++ b/src/main/java/uk/ac/ox/cs/pagoda/reasoner/full/HermitChecker.java @@ -1,5 +1,6 @@ package uk.ac.ox.cs.pagoda.reasoner.full; +import org.semanticweb.HermiT.Configuration; import org.semanticweb.HermiT.Reasoner; import org.semanticweb.HermiT.model.DLClause; import org.semanticweb.HermiT.model.Term; @@ -57,7 +58,7 @@ public class HermitChecker extends Checker { // record = other.record; } - hermit = new Reasoner(ontology); + hermit = new Reasoner(new Configuration(), ontology); } public HermitChecker(OWLOntology ontology, QueryRecord record, boolean toCheck) { @@ -174,12 +175,12 @@ public class HermitChecker extends Checker { addTopAndBotTuple(topAxioms, botAxioms); manager.addAxioms(ontology, topAxioms); manager.addAxioms(ontology, botAxioms); - hermit = new Reasoner(ontology); + hermit = new Reasoner(new Configuration(), ontology); boolean topValid = true; if(!hermit.isConsistent() || topAnswerTuple != null && (topValid = check(topAnswerTuple))) { hermit.dispose(); manager.removeAxioms(ontology, topAxioms); - hermit = new Reasoner(ontology); + hermit = new Reasoner(new Configuration(), ontology); } else { if(!topValid) tag = -1; @@ -187,7 +188,7 @@ public class HermitChecker extends Checker { } } else - hermit = new Reasoner(ontology); + hermit = new Reasoner(new Configuration(), ontology); } private void addTopAndBotTuple(Set topAxioms, Set botAxioms) { diff --git a/src/main/java/uk/ac/ox/cs/pagoda/rules/LowerDatalogProgram.java b/src/main/java/uk/ac/ox/cs/pagoda/rules/LowerDatalogProgram.java index a2676e8..2610652 100644 --- a/src/main/java/uk/ac/ox/cs/pagoda/rules/LowerDatalogProgram.java +++ b/src/main/java/uk/ac/ox/cs/pagoda/rules/LowerDatalogProgram.java @@ -1,6 +1,7 @@ package uk.ac.ox.cs.pagoda.rules; import org.apache.commons.io.FilenameUtils; +import org.semanticweb.HermiT.Configuration; import org.semanticweb.HermiT.Reasoner; import org.semanticweb.HermiT.model.*; import org.semanticweb.owlapi.model.*; @@ -149,7 +150,7 @@ class ClassifyThread extends Thread { public void run() { ontology = m_program.getOntology(); try { - hermitReasoner = new Reasoner(ontology); + hermitReasoner = new Reasoner(new Configuration(), ontology); Timer t = new Timer(); hermitReasoner.classifyClasses(); Utility.logInfo("HermiT classification done: " + t.duration()); @@ -235,4 +236,4 @@ class ClassifyThread extends Thread { private Atom getAtom(OWLClass c) { return Atom.create(AtomicConcept.create(c.toStringID()), X); } -} \ No newline at end of file +} diff --git a/src/main/java/uk/ac/ox/cs/pagoda/rules/Program.java b/src/main/java/uk/ac/ox/cs/pagoda/rules/Program.java index de06f52..22eb9ec 100644 --- a/src/main/java/uk/ac/ox/cs/pagoda/rules/Program.java +++ b/src/main/java/uk/ac/ox/cs/pagoda/rules/Program.java @@ -273,7 +273,7 @@ protected PredicateDependency dependencyGraph; Utility.logInfo("The number of data property range axioms that are ignored: " + noOfDataPropertyRangeAxioms + "(" + noOfAxioms + ")"); DLOntology dlOntology = (DLOntology) clausifier.preprocessAndClausify(filteredOntology, null)[1]; - dlClauses = dlOntology.getDLClauses(); + dlClauses = new HashSet(dlOntology.getDLClauses()); positiveFacts = dlOntology.getPositiveFacts(); } diff --git a/src/test/java/uk/ac/ox/cs/hermit/HermitQueryReasoner.java b/src/test/java/uk/ac/ox/cs/hermit/HermitQueryReasoner.java index 957790f..a98acba 100644 --- a/src/test/java/uk/ac/ox/cs/hermit/HermitQueryReasoner.java +++ b/src/test/java/uk/ac/ox/cs/hermit/HermitQueryReasoner.java @@ -1,5 +1,6 @@ package uk.ac.ox.cs.hermit; +import org.semanticweb.HermiT.Configuration; import org.semanticweb.HermiT.Reasoner; import org.semanticweb.HermiT.model.Atom; import org.semanticweb.HermiT.model.AtomicRole; @@ -75,7 +76,7 @@ public class HermitQueryReasoner { // for (OWLAxiom axiom: o.getAxioms()) // System.out.println(axiom); - Reasoner hermit = new Reasoner(onto); + Reasoner hermit = new Reasoner(new Configuration(), onto); if (!hermit.isConsistent()) { System.out.println("The ontology is inconsistent."); return ; diff --git a/src/test/java/uk/ac/ox/cs/hermit/HermitTester.java b/src/test/java/uk/ac/ox/cs/hermit/HermitTester.java index dc70284..b46360d 100644 --- a/src/test/java/uk/ac/ox/cs/hermit/HermitTester.java +++ b/src/test/java/uk/ac/ox/cs/hermit/HermitTester.java @@ -20,7 +20,7 @@ public class HermitTester { public static void main(String[] args) { OWLOntology onto = OWLHelper.loadOntology("imported.owl"); - Reasoner hermit = new Reasoner(onto); + Reasoner hermit = new Reasoner(new Configuration(), onto); OWLDataFactory f = onto.getOWLOntologyManager().getOWLDataFactory(); OWLClass concept = f.getOWLClass(IRI.create("http://semantics.crl.ibm.com/univ-bench-dl.owl#Query12")); diff --git a/src/test/java/uk/ac/ox/cs/pagoda/summary/SummaryTester.java b/src/test/java/uk/ac/ox/cs/pagoda/summary/SummaryTester.java index 60c8ed4..f91251d 100644 --- a/src/test/java/uk/ac/ox/cs/pagoda/summary/SummaryTester.java +++ b/src/test/java/uk/ac/ox/cs/pagoda/summary/SummaryTester.java @@ -6,6 +6,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.Scanner; +import org.semanticweb.HermiT.Configuration; import org.semanticweb.HermiT.Reasoner; import org.semanticweb.owlapi.model.AxiomType; import org.semanticweb.owlapi.model.IRI; @@ -65,7 +66,7 @@ public class SummaryTester { OWLDataFactory factory = summary.getOWLOntologyManager().getOWLDataFactory(); QueryRoller r = new QueryRoller(factory); OWLClassExpression summarisedQueryExp; - Reasoner reasoner = new Reasoner(summary); + Reasoner reasoner = new Reasoner(new Configuration(), summary); QueryManager queryManager = new QueryManager(); int upperBoundCounter, queryID = 0; StringBuilder queryText = new StringBuilder(); -- cgit v1.2.3