From d81b086fe329fa69891eba0a4b1f73e44183620d Mon Sep 17 00:00:00 2001 From: RncLsn Date: Wed, 20 May 2015 18:52:47 +0100 Subject: Added more tests. Querying of the upper bound is currently unstable. --- src/uk/ac/ox/cs/pagoda/Pagoda.java | 6 +- .../ox/cs/pagoda/endomorph/plan/OpenEndPlan.java | 14 +- .../ox/cs/pagoda/multistage/StageQueryEngine.java | 21 +- src/uk/ac/ox/cs/pagoda/query/QueryRecord.java | 157 ++++++++------ .../ox/cs/pagoda/reasoner/ELHOQueryReasoner.java | 6 +- .../ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java | 8 +- .../ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java | 72 +++---- src/uk/ac/ox/cs/pagoda/reasoner/QueryReasoner.java | 12 +- .../ac/ox/cs/pagoda/reasoner/RLQueryReasoner.java | 4 +- .../ac/ox/cs/pagoda/reasoner/RLUQueryReasoner.java | 6 +- .../ox/cs/pagoda/summary/HermitSummaryFilter.java | 226 ++++++++++----------- src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java | 126 ++++++++++++ src/uk/ac/ox/cs/pagoda/util/Properties.java | 66 ------ 13 files changed, 407 insertions(+), 317 deletions(-) create mode 100644 src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java delete mode 100644 src/uk/ac/ox/cs/pagoda/util/Properties.java (limited to 'src/uk/ac/ox') diff --git a/src/uk/ac/ox/cs/pagoda/Pagoda.java b/src/uk/ac/ox/cs/pagoda/Pagoda.java index 04920c4..aeb85a7 100644 --- a/src/uk/ac/ox/cs/pagoda/Pagoda.java +++ b/src/uk/ac/ox/cs/pagoda/Pagoda.java @@ -2,7 +2,7 @@ package uk.ac.ox.cs.pagoda; import org.apache.commons.cli.*; import uk.ac.ox.cs.pagoda.reasoner.QueryReasoner; -import uk.ac.ox.cs.pagoda.util.Properties; +import uk.ac.ox.cs.pagoda.util.PagodaProperties; import uk.ac.ox.cs.pagoda.util.Timer; import uk.ac.ox.cs.pagoda.util.Utility; @@ -19,13 +19,13 @@ public class Pagoda implements Runnable { private static final String OPTION_ANSWER = "a"; private static final String OPTION_CLASSIFY = "c"; private static final String OPTION_HERMIT = "f"; - private final Properties properties; + private final PagodaProperties properties; /** * Do not use it * */ private Pagoda() { - properties = new Properties(); + properties = new PagodaProperties(); } public static void main(String... args) { diff --git a/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java index 202021d..19d567a 100644 --- a/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java +++ b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java @@ -1,13 +1,7 @@ package uk.ac.ox.cs.pagoda.endomorph.plan; -import java.util.Collection; -import java.util.Deque; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.Map; -import java.util.Set; - -import uk.ac.ox.cs.pagoda.endomorph.*; +import uk.ac.ox.cs.pagoda.endomorph.Clique; +import uk.ac.ox.cs.pagoda.endomorph.DependencyGraph; import uk.ac.ox.cs.pagoda.query.AnswerTuple; import uk.ac.ox.cs.pagoda.query.QueryRecord; import uk.ac.ox.cs.pagoda.query.QueryRecord.Step; @@ -16,6 +10,8 @@ import uk.ac.ox.cs.pagoda.summary.NodeTuple; import uk.ac.ox.cs.pagoda.util.Timer; import uk.ac.ox.cs.pagoda.util.Utility; +import java.util.*; + public class OpenEndPlan implements CheckPlan { public static final int TIME_OUT_MIN = 1; @@ -91,7 +87,7 @@ public class OpenEndPlan implements CheckPlan { } m_record.addLowerBoundAnswers(validAnswers); - m_record.addProcessingTime(Step.FullReasoning, t.duration()); + m_record.addProcessingTime(Step.FULL_REASONING, t.duration()); return count; } diff --git a/src/uk/ac/ox/cs/pagoda/multistage/StageQueryEngine.java b/src/uk/ac/ox/cs/pagoda/multistage/StageQueryEngine.java index 84798ce..e652f66 100644 --- a/src/uk/ac/ox/cs/pagoda/multistage/StageQueryEngine.java +++ b/src/uk/ac/ox/cs/pagoda/multistage/StageQueryEngine.java @@ -8,16 +8,17 @@ import uk.ac.ox.cs.pagoda.rules.DatalogProgram; import uk.ac.ox.cs.pagoda.util.Utility; public abstract class StageQueryEngine extends BasicQueryEngine { - - protected boolean checkValidity; - + + protected boolean checkValidity; + Boolean validMaterialisation = null; + public StageQueryEngine(String name, boolean checkValidity) { super(name); - this.checkValidity = checkValidity; + this.checkValidity = checkValidity; } - public abstract void materialiseFoldedly(DatalogProgram dProgram, GapByStore4ID gap); - + public abstract void materialiseFoldedly(DatalogProgram dProgram, GapByStore4ID gap); + public abstract int materialiseRestrictedly(DatalogProgram dProgram, GapByStore4ID gap); public abstract int materialiseSkolemly(DatalogProgram dProgram, GapByStore4ID gap); @@ -25,8 +26,6 @@ public abstract class StageQueryEngine extends BasicQueryEngine { public void dispose() { super.dispose(); } - - Boolean validMaterialisation = null; public boolean isValid() { if (!checkValidity) return true; @@ -45,9 +44,9 @@ public abstract class StageQueryEngine extends BasicQueryEngine { } if (validMaterialisation) - Utility.logInfo("The lazy-upper-bound store is valid."); - else - Utility.logInfo("The lazy-upper-bound store is not valid."); + Utility.logInfo("The " + name + " store is valid."); + else + Utility.logInfo("The " + name + " store is not valid."); return validMaterialisation; } diff --git a/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java b/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java index 4998a19..1ecd867 100644 --- a/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java +++ b/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java @@ -9,6 +9,7 @@ import uk.ac.ox.cs.pagoda.reasoner.light.RDFoxAnswerTuples; import uk.ac.ox.cs.pagoda.rules.GeneralProgram; import uk.ac.ox.cs.pagoda.util.ConjunctiveQueryHelper; import uk.ac.ox.cs.pagoda.util.Namespace; +import uk.ac.ox.cs.pagoda.util.PagodaProperties; import uk.ac.ox.cs.pagoda.util.Utility; import uk.ac.ox.cs.pagoda.util.tuples.Tuple; import uk.ac.ox.cs.pagoda.util.tuples.TupleBuilder; @@ -101,7 +102,13 @@ public class QueryRecord { update = true; } } - Utility.logInfo("The number of answers in the lower bound: " + soundAnswerTuples.size()); + + if(soundAnswerTuples.isEmpty()) + Utility.logInfo("Lower bound answers empty"); + else if(update) + Utility.logInfo("Lower bound answers updated: " + soundAnswerTuples.size()); + else + Utility.logInfo("Lower bound answers unchanged"); return update; } @@ -111,69 +118,98 @@ public class QueryRecord { } public boolean updateUpperBoundAnswers(AnswerTuples answerTuples, boolean toCheckAux) { - RDFoxAnswerTuples rdfAnswerTuples; - if(answerTuples instanceof RDFoxAnswerTuples) - rdfAnswerTuples = (RDFoxAnswerTuples) answerTuples; - else { - Utility.logError("The upper bound must be computed by RDFox!"); - return false; + if(!(answerTuples instanceof RDFoxAnswerTuples)) { + String msg = "The upper bound must be computed by RDFox!"; + Utility.logError(msg); + throw new IllegalArgumentException(msg); } - if(soundAnswerTuples.size() > 0) { - int number = 0; - for(; rdfAnswerTuples.isValid(); rdfAnswerTuples.moveNext()) { - ++number; - } - Utility.logInfo("The number of answers returned by an upper bound: " + number); - if(number == soundAnswerTuples.size()) { - if(gapAnswerTuples != null) gapAnswerTuples.clear(); - else gapAnswerTuples = new HashSet(); + RDFoxAnswerTuples rdfoxAnswerTuples = (RDFoxAnswerTuples) answerTuples; - Utility.logInfo("The number of upper bound answers: " + (soundAnswerTuples.size() + gapAnswerTuples.size())); - return false; - } else if(number < soundAnswerTuples.size()) - throw new IllegalArgumentException("The upper bound answers must contain all the lower bound ones!"); - rdfAnswerTuples.reset(); - } +// if(soundAnswerTuples.size() > 0) { +// int number = 0; +// for(; rdfoxAnswerTuples.isValid(); rdfoxAnswerTuples.moveNext()) { +// ++number; +// } +// Utility.logInfo("The number of answers returned by an upper bound: " + number); +// if(number == soundAnswerTuples.size()) { +// if(gapAnswerTuples != null) gapAnswerTuples.clear(); +// else gapAnswerTuples = new HashSet(); +// +// Utility.logInfo("The number of upper bound answers: " + (soundAnswerTuples.size() + gapAnswerTuples.size())); +// return false; +// } else if(number < soundAnswerTuples.size()) +// throw new IllegalArgumentException("The upper bound answers must contain all the lower bound ones!"); +// rdfoxAnswerTuples.reset(); +// } - boolean justCheck = (rdfAnswerTuples.getArity() != answerVariables[1].length); +// boolean justCheck = (rdfoxAnswerTuples.getArity() < getDistinguishedVariables().length); +// boolean justCheck = (rdfoxAnswerTuples.getArity() != getDistinguishedVariables().length); +// if(justCheck) throw new Error("justCheck!"); + boolean justCheck = false; - Set tupleSet = new HashSet(); + Set candidateGapAnswerTuples = new HashSet(); AnswerTuple tuple, extendedTuple; - for(; rdfAnswerTuples.isValid(); rdfAnswerTuples.moveNext()) { - extendedTuple = rdfAnswerTuples.getTuple(); + for(; rdfoxAnswerTuples.isValid(); rdfoxAnswerTuples.moveNext()) { + extendedTuple = rdfoxAnswerTuples.getTuple(); if(isBottom() || !extendedTuple.hasAnonymousIndividual()) { - tuple = AnswerTuple.create(extendedTuple, answerVariables[0].length); + tuple = AnswerTuple.create(extendedTuple, getAnswerVariables().length); if((!toCheckAux || !tuple.hasAuxPredicate()) && !soundAnswerTuples.contains(tuple)) { if(!toCheckAux && justCheck) return false; // TODO check -// tupleSet.add(extendedTuple); - tupleSet.add(tuple); + candidateGapAnswerTuples.add(extendedTuple); +// candidateGapAnswerTuples.add(tuple); } } } - if(gapAnswerTuples == null) { - gapAnswerTuples = tupleSet; - - Utility.logInfo("The number of answers in the upper bound: " + (soundAnswerTuples.size() + gapAnswerTuples.size())); - return true; + /*** START: debugging ***/ + if(PagodaProperties.isDebuggingMode()) { + Set projectedAnswerTuples = new HashSet<>(); + rdfoxAnswerTuples.reset(); + for(; rdfoxAnswerTuples.isValid(); rdfoxAnswerTuples.moveNext()) { + extendedTuple = rdfoxAnswerTuples.getTuple(); + if(isBottom() || !extendedTuple.hasAnonymousIndividual()) { + tuple = AnswerTuple.create(extendedTuple, getAnswerVariables().length); + projectedAnswerTuples.add(tuple); + } + } + HashSet difference = new HashSet<>(soundAnswerTuples); + difference.removeAll(projectedAnswerTuples); + if(!difference.isEmpty()) + throw new IllegalArgumentException("The upper bound does not contain the lower bound!"); } + /*** END: debugging ***/ - boolean update = false; - for(Iterator iter = gapAnswerTuples.iterator(); iter.hasNext(); ) { - tuple = iter.next(); - if(!tupleSet.contains(tuple)) { - iter.remove(); - update = true; - } + boolean update; + if(gapAnswerTuples == null) { + gapAnswerTuples = candidateGapAnswerTuples; + update = true; + } else { + update = gapAnswerTuples.retainAll(candidateGapAnswerTuples); } - Utility.logInfo("The number of answers in the upper bound: " + (soundAnswerTuples.size() + gapAnswerTuples.size())); + if(update) + Utility.logInfo("Upper bound answers updated: " + getNumberOfAnswers()); + else + Utility.logInfo("Upper bound answers unchanged"); return update; + +// boolean update = false; +// for(Iterator iter = gapAnswerTuples.iterator(); iter.hasNext(); ) { +// tuple = iter.next(); +// if(!candidateGapAnswerTuples.contains(tuple)) { +// iter.remove(); +// update = true; +// } +// } } - + + public int getNumberOfAnswers() { + return soundAnswerTuples.size() + gapAnswerTuples.size(); + } + public void markAsProcessed() { processed = true; } @@ -567,26 +603,33 @@ public class QueryRecord { /** * Two QueryRecords are equal iff * they have the same queryText, - * soundAnswerTuples - * and gapAnswerTuples. + * soundAnswerTuples. */ @Override public boolean equals(Object o) { if(!o.getClass().equals(getClass())) return false; QueryRecord that = (QueryRecord) o; return this.queryText.equals(that.queryText) - && soundAnswerTuples.equals(that.soundAnswerTuples) - && gapAnswerTuples.equals(that.gapAnswerTuples); + && soundAnswerTuples.equals(that.soundAnswerTuples); } @Override public int hashCode() { - return Objects.hash(queryText, soundAnswerTuples, gapAnswerTuples); + return Objects.hash(queryText, soundAnswerTuples); } public enum Step { - LowerBound, UpperBound, ELLowerBound, - Fragment, FragmentRefinement, Summarisation, Dependency, FullReasoning + LOWER_BOUND, + UPPER_BOUND, + SIMPLE_UPPER_BOUND, + LAZY_UPPER_BOUND, + L_SKOLEM_UPPER_BOUND, + EL_LOWER_BOUND, + FRAGMENT, + FRAGMENT_REFINEMENT, + SUMMARISATION, + DEPENDENCY, + FULL_REASONING } /** @@ -598,11 +641,11 @@ public class QueryRecord { JsonObject object = new JsonObject(); object.addProperty("queryID", src.queryID); object.addProperty("queryText", src.queryText); - object.addProperty("difficulty", src.difficulty != null ? src.difficulty.toString() : ""); +// object.addProperty("difficulty", src.difficulty != null ? src.difficulty.toString() : ""); object.add("answerVariables", context.serialize(src.getAnswerVariables())); object.add("answers", context.serialize(src.soundAnswerTuples)); - object.add("gapAnswers", context.serialize(src.gapAnswerTuples)); +// object.add("gapAnswers", context.serialize(src.gapAnswerTuples)); return object; } @@ -619,7 +662,7 @@ public class QueryRecord { JsonObject object = json.getAsJsonObject(); record.queryID = object.getAsJsonPrimitive("queryID").getAsInt(); record.queryText = object.getAsJsonPrimitive("queryText").getAsString(); - record.difficulty = Step.valueOf(object.getAsJsonPrimitive("difficulty").getAsString()); +// record.difficulty = Step.valueOf(object.getAsJsonPrimitive("difficulty").getAsString()); JsonArray answerVariablesJson = object.getAsJsonArray("answerVariables"); record.answerVariables = new String[2][]; @@ -628,14 +671,14 @@ public class QueryRecord { record.answerVariables[0][i] = answerVariablesJson.get(i).getAsString(); record.soundAnswerTuples = new HashSet<>(); - record.gapAnswerTuples = new HashSet<>(); +// record.gapAnswerTuples = new HashSet<>(); Type type = new TypeToken() { }.getType(); for (JsonElement answer : object.getAsJsonArray("answers")) { record.soundAnswerTuples.add(context.deserialize(answer, type)); } - for (JsonElement answer : object.getAsJsonArray("gapAnswers")) { - record.soundAnswerTuples.add(context.deserialize(answer, type)); - } +// for (JsonElement answer : object.getAsJsonArray("gapAnswers")) { +// record.soundAnswerTuples.add(context.deserialize(answer, type)); +// } return record; } diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/ELHOQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/ELHOQueryReasoner.java index 2285b5f..f5a8093 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/ELHOQueryReasoner.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/ELHOQueryReasoner.java @@ -34,9 +34,9 @@ class ELHOQueryReasoner extends QueryReasoner { } finally { if (elAnswer != null) elAnswer.dispose(); } - queryRecord.addProcessingTime(Step.ELLowerBound, t.duration()); - - queryRecord.setDifficulty(Step.ELLowerBound); + queryRecord.addProcessingTime(Step.EL_LOWER_BOUND, t.duration()); + + queryRecord.setDifficulty(Step.EL_LOWER_BOUND); queryRecord.markAsProcessed(); } diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java index a4fa7c3..34742c8 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java @@ -50,7 +50,7 @@ class ELHOUQueryReasoner extends QueryReasoner { } finally { if(rlAnswer != null) rlAnswer.dispose(); } - queryRecord.addProcessingTime(Step.LowerBound, t.duration()); + queryRecord.addProcessingTime(Step.LOWER_BOUND, t.duration()); String extendedQueryText = queryRecord.getExtendedQueryText().get(0); String[] toQuery = queryRecord.getQueryText().equals(extendedQueryText) ? @@ -66,10 +66,10 @@ class ELHOUQueryReasoner extends QueryReasoner { } finally { if(rlAnswer != null) rlAnswer.dispose(); } - queryRecord.addProcessingTime(Step.UpperBound, t.duration()); + queryRecord.addProcessingTime(Step.UPPER_BOUND, t.duration()); if (queryRecord.processed()) { - queryRecord.setDifficulty(Step.UpperBound); + queryRecord.setDifficulty(Step.UPPER_BOUND); return; } } @@ -83,7 +83,7 @@ class ELHOUQueryReasoner extends QueryReasoner { } finally { if (elAnswer != null) elAnswer.dispose(); } - queryRecord.addProcessingTime(Step.ELLowerBound, t.duration()); + queryRecord.addProcessingTime(Step.EL_LOWER_BOUND, t.duration()); } @Override diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java index 6adbd37..2a49e24 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java @@ -198,26 +198,31 @@ class MyQueryReasoner extends QueryReasoner { return satisfiable == SatisfiabilityStatus.SATISFIABLE; } - // TODO why the following??? - private void queryUpperStore(BasicQueryEngine upperStore, QueryRecord queryRecord, Tuple extendedQuery) { + /** + * It deals with blanks nodes differently from variables + * according to SPARQL semantics for OWL2 Entailment Regime. + *

+ * In particular variables are matched only against named individuals, + * and blank nodes against named and anonymous individuals. + */ + private boolean queryUpperStore(BasicQueryEngine upperStore, QueryRecord queryRecord, + Tuple extendedQuery, Step step) { + + queryUpperBound(upperStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables()); + + if(queryRecord.hasNonAnsDistinguishedVariables()) { + if(!queryRecord.processed()) + queryUpperBound(upperStore, queryRecord, extendedQuery.get(0), queryRecord.getAnswerVariables()); + if(!queryRecord.processed()) + queryUpperBound(upperStore, queryRecord, extendedQuery.get(1), queryRecord.getDistinguishedVariables()); + } -// Utility.logInfo("1"); -// queryUpperBound(upperStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables()); -// -// boolean conditionA = !queryRecord.processed() && !queryRecord.getQueryText().equals(extendedQuery.get(0)); -// boolean conditionB = !queryRecord.processed() && queryRecord.hasNonAnsDistinguishedVariables(); -// -// if(conditionA ^ conditionB) -// throw new Error("It really happened! I thought it was impossible"); -// -// if (conditionA) { -// Utility.logInfo("2"); - queryUpperBound(upperStore, queryRecord, extendedQuery.get(0), queryRecord.getAnswerVariables()); -// } -// if (conditionB) { -// Utility.logInfo("3"); -// queryUpperBound(upperStore, queryRecord, extendedQuery.get(1), queryRecord.getDistinguishedVariables()); -// } + queryRecord.addProcessingTime(step, t.duration()); + if(queryRecord.processed()) { + queryRecord.setDifficulty(step); + return true; + } + return false; } /** @@ -234,7 +239,7 @@ class MyQueryReasoner extends QueryReasoner { } finally { if (rlAnswer != null) rlAnswer.dispose(); } - queryRecord.addProcessingTime(Step.LowerBound, t.duration()); + queryRecord.addProcessingTime(Step.LOWER_BOUND, t.duration()); t.reset(); @@ -249,17 +254,14 @@ class MyQueryReasoner extends QueryReasoner { // queryUpperStore(trackingStore, queryRecord, extendedQueryTexts); // else { - queryUpperStore(trackingStore, queryRecord, extendedQueryTexts); - if(!(queryRecord.isBottom() || (lazyUpperStore == null && limitedSkolemUpperStore == null))) { - if(lazyUpperStore != null) queryUpperStore(lazyUpperStore, queryRecord, extendedQueryTexts); - if(limitedSkolemUpperStore != null) - queryUpperStore(limitedSkolemUpperStore, queryRecord, extendedQueryTexts); - } - - queryRecord.addProcessingTime(Step.UpperBound, t.duration()); - if (queryRecord.processed()) { - queryRecord.setDifficulty(Step.UpperBound); + if(queryUpperStore(trackingStore, queryRecord, extendedQueryTexts, Step.SIMPLE_UPPER_BOUND)) return null; + + if(!queryRecord.isBottom()) { + if(lazyUpperStore != null && queryUpperStore(lazyUpperStore, queryRecord, extendedQueryTexts, Step.LAZY_UPPER_BOUND)) + return null; + if(limitedSkolemUpperStore != null && queryUpperStore(limitedSkolemUpperStore, queryRecord, extendedQueryTexts, Step.L_SKOLEM_UPPER_BOUND)) + return null; } t.reset(); @@ -271,10 +273,10 @@ class MyQueryReasoner extends QueryReasoner { } finally { if (elAnswer != null) elAnswer.dispose(); } - queryRecord.addProcessingTime(Step.ELLowerBound, t.duration()); + queryRecord.addProcessingTime(Step.EL_LOWER_BOUND, t.duration()); if (queryRecord.processed()) { - queryRecord.setDifficulty(Step.ELLowerBound); + queryRecord.setDifficulty(Step.EL_LOWER_BOUND); return null; } @@ -291,7 +293,7 @@ class MyQueryReasoner extends QueryReasoner { // } // else { knowledgeBase = tracker.extract(trackingStore, consistency.getQueryRecords(), true); - queryRecord.addProcessingTime(Step.Fragment, t.duration()); + queryRecord.addProcessingTime(Step.FRAGMENT, t.duration()); // } if(knowledgeBase.isEmpty() || queryRecord.isBottom()) @@ -307,10 +309,10 @@ class MyQueryReasoner extends QueryReasoner { // knowledgebase = iterativeRefinement.extractWithFullABox(importedData.toString(), program.getUpperBottomStrategy()); // } // -// queryRecord.addProcessingTime(Step.FragmentRefinement, t.duration()); +// queryRecord.addProcessingTime(Step.FRAGMENT_REFINEMENT, t.duration()); // // if (knowledgebase == null) -// queryRecord.setDifficulty(Step.FragmentRefinement); +// queryRecord.setDifficulty(Step.FRAGMENT_REFINEMENT); return knowledgeBase; } diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/QueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/QueryReasoner.java index d4f4596..64945e8 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/QueryReasoner.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/QueryReasoner.java @@ -6,7 +6,7 @@ import uk.ac.ox.cs.pagoda.owl.OWLHelper; import uk.ac.ox.cs.pagoda.query.AnswerTuples; import uk.ac.ox.cs.pagoda.query.QueryManager; import uk.ac.ox.cs.pagoda.query.QueryRecord; -import uk.ac.ox.cs.pagoda.util.Properties; +import uk.ac.ox.cs.pagoda.util.PagodaProperties; import uk.ac.ox.cs.pagoda.util.Timer; import uk.ac.ox.cs.pagoda.util.Utility; @@ -26,11 +26,11 @@ public abstract class QueryReasoner { public boolean fullReasoner = this instanceof MyQueryReasoner; protected StringBuilder importedData = new StringBuilder(); // protected boolean forSemFacet = false; - Properties properties; +PagodaProperties properties; BufferedWriter answerWriter = null; private QueryManager m_queryManager = new QueryManager(); - - public static QueryReasoner getInstance(Properties p) { + + public static QueryReasoner getInstance(PagodaProperties p) { OWLOntology ontology = OWLHelper.loadOntology(p.getOntologyPath()); QueryReasoner pagoda = getInstance(ontology, p); pagoda.properties = p; @@ -49,11 +49,11 @@ public abstract class QueryReasoner { public static QueryReasoner getInstance(OWLOntology o) { QueryReasoner pagoda = getInstance(Type.Full, o, DEFAULT_MULTI_STAGES, DEFAULT_EQUALITIES); - pagoda.properties = new Properties(); + pagoda.properties = new PagodaProperties(); return pagoda; } - private static QueryReasoner getInstance(OWLOntology o, Properties p) { + private static QueryReasoner getInstance(OWLOntology o, PagodaProperties p) { return getInstance(Type.Full, o, DEFAULT_MULTI_STAGES, DEFAULT_EQUALITIES); } diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/RLQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/RLQueryReasoner.java index 60f34c6..bea5bbf 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/RLQueryReasoner.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/RLQueryReasoner.java @@ -31,8 +31,8 @@ class RLQueryReasoner extends QueryReasoner { } finally { if (rlAnswer != null) rlAnswer.dispose(); } - queryRecord.addProcessingTime(Step.LowerBound, t.duration()); - queryRecord.setDifficulty(Step.LowerBound); + queryRecord.addProcessingTime(Step.LOWER_BOUND, t.duration()); + queryRecord.setDifficulty(Step.LOWER_BOUND); queryRecord.markAsProcessed(); } diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/RLUQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/RLUQueryReasoner.java index e5564d9..bdef436 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/RLUQueryReasoner.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/RLUQueryReasoner.java @@ -41,7 +41,7 @@ class RLUQueryReasoner extends QueryReasoner { } finally { if (ans != null) ans.dispose(); } - queryRecord.addProcessingTime(Step.LowerBound, t.duration()); + queryRecord.addProcessingTime(Step.LOWER_BOUND, t.duration()); ans = null; t.reset(); @@ -52,10 +52,10 @@ class RLUQueryReasoner extends QueryReasoner { } finally { if (ans != null) ans.dispose(); } - queryRecord.addProcessingTime(Step.UpperBound, t.duration()); + queryRecord.addProcessingTime(Step.UPPER_BOUND, t.duration()); if (queryRecord.processed()) - queryRecord.setDifficulty(Step.UpperBound); + queryRecord.setDifficulty(Step.UPPER_BOUND); } @Override diff --git a/src/uk/ac/ox/cs/pagoda/summary/HermitSummaryFilter.java b/src/uk/ac/ox/cs/pagoda/summary/HermitSummaryFilter.java index a0ecce8..663c716 100644 --- a/src/uk/ac/ox/cs/pagoda/summary/HermitSummaryFilter.java +++ b/src/uk/ac/ox/cs/pagoda/summary/HermitSummaryFilter.java @@ -1,16 +1,6 @@ package uk.ac.ox.cs.pagoda.summary; -import java.util.HashSet; -import java.util.Set; - -import org.semanticweb.owlapi.model.IRI; -import org.semanticweb.owlapi.model.OWLAxiom; -import org.semanticweb.owlapi.model.OWLClass; -import org.semanticweb.owlapi.model.OWLDataFactory; -import org.semanticweb.owlapi.model.OWLOntology; -import org.semanticweb.owlapi.model.OWLOntologyCreationException; -import org.semanticweb.owlapi.model.OWLOntologyManager; - +import org.semanticweb.owlapi.model.*; import uk.ac.ox.cs.JRDFox.model.Individual; import uk.ac.ox.cs.pagoda.endomorph.Endomorph; import uk.ac.ox.cs.pagoda.owl.OWLHelper; @@ -25,166 +15,166 @@ import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoder; import uk.ac.ox.cs.pagoda.util.Timer; import uk.ac.ox.cs.pagoda.util.Utility; +import java.util.HashSet; +import java.util.Set; + public class HermitSummaryFilter implements Checker { - QueryRecord m_record; + public static final String QueryAnswerTermPrefix = TrackingRuleEncoder.QueryPredicate + "_term"; + QueryRecord m_record; Summary summary = null; - HermitChecker summarisedHermiT = null; + HermitChecker summarisedHermiT = null; boolean summarisedConsistency; - Endomorph endomorphismChecker = null; public HermitSummaryFilter(QueryRecord record, boolean toCallHermiT) { - m_record = record; - HermitChecker hermitChecker = new HermitChecker(record.getRelevantOntology(), record, toCallHermiT); + m_record = record; + HermitChecker hermitChecker = new HermitChecker(record.getRelevantOntology(), record, toCallHermiT); endomorphismChecker = new Endomorph(record, hermitChecker); - hermitChecker.setDependencyGraph(endomorphismChecker.getDependencyGraph()); + hermitChecker.setDependencyGraph(endomorphismChecker.getDependencyGraph()); + } + + public static OWLOntology addOntologyWithQueryPreciate(OWLOntology ontology, QueryRecord record, AnswerTuples answers) { + OWLOntology newOntology = null; + OWLOntologyManager manager = ontology.getOWLOntologyManager(); + OWLDataFactory factory = manager.getOWLDataFactory(); + try { + newOntology = manager.createOntology(); + manager.addAxioms(newOntology, ontology.getAxioms()); + + OWLClass[] queryClass = new OWLClass[answers.getArity()]; + int arity = answers.getArity(); + for(int i = 0; i < arity; ++i) + queryClass[i] = factory.getOWLClass(IRI.create(QueryAnswerTermPrefix + i)); + AnswerTuple answer; + for(; answers.isValid(); answers.moveNext()) { + answer = answers.getTuple(); + for(int i = 0; i < arity; ++i) + if(answer.getGroundTerm(i) instanceof Individual) { + String iri = ((Individual) answer.getGroundTerm(i)).getIRI(); + if(!record.isPredicate(answer, i)) { + manager.addAxiom(newOntology, + factory.getOWLClassAssertionAxiom( + queryClass[i], + factory.getOWLNamedIndividual(IRI.create(iri)))); + } + } + } + answers.reset(); + } catch(OWLOntologyCreationException e) { + e.printStackTrace(); + } + + return newOntology; + } + + public static void printRelatedABoxAxioms(OWLOntology onto, String str) { + if(!str.startsWith("<")) str = OWLHelper.addAngles(str); + + System.out.println("Axioms in " + onto.getOntologyID().getOntologyIRI() + " related to " + str); + + for(OWLAxiom axiom : onto.getABoxAxioms(true)) + if(axiom.toString().contains(str)) + System.out.println(axiom); + + System.out.println("-----------------------------"); + } + + public static void printRelatedTBoxAxioms(OWLOntology onto, String str) { + + System.out.println("Axioms in " + onto.getOntologyID().getOntologyIRI() + " related to " + str); + + for(OWLAxiom axiom : onto.getTBoxAxioms(true)) + if(axiom.toString().contains(str)) + System.out.println(axiom); + + for(OWLAxiom axiom : onto.getRBoxAxioms(true)) + if(axiom.toString().contains(str)) + System.out.println(axiom); + + System.out.println("-----------------------------"); } @Override public boolean isConsistent() { if (summary == null) - summary = new Summary(endomorphismChecker.getOntology(), endomorphismChecker.getGraph()); - - if (summarisedHermiT == null) + summary = new Summary(endomorphismChecker.getOntology(), endomorphismChecker.getGraph()); + + if(summarisedHermiT == null) initialiseSummarisedReasoner(); - if (summarisedConsistency) return true; - return endomorphismChecker.isConsistent(); + if(summarisedConsistency) return true; + return endomorphismChecker.isConsistent(); } - + private void initialiseSummarisedReasoner() { - Timer t = new Timer(); + Timer t = new Timer(); summarisedHermiT = new HermitChecker(summary.getSummary(), summary.getSummary(m_record)); // summary.save("summarised_query" + m_record.getQueryID() + ".owl"); - if (summarisedConsistency = summarisedHermiT.isConsistent()) + if(summarisedConsistency = summarisedHermiT.isConsistent()) Utility.logDebug("The summary of ABox is consistent with the TBox."); - else + else Utility.logDebug("The summary of ABox is NOT consistent with the TBox."); - m_record.addProcessingTime(Step.Summarisation, t.duration()); + m_record.addProcessingTime(Step.SUMMARISATION, t.duration()); } - + @Override public int check(AnswerTuples answers) { - Timer t = new Timer(); + Timer t = new Timer(); OWLOntology newOntology = addOntologyWithQueryPreciate(endomorphismChecker.getOntology(), m_record, answers); - summary = new Summary(newOntology); - initialiseSummarisedReasoner(); - + summary = new Summary(newOntology); + initialiseSummarisedReasoner(); + if (summarisedConsistency) { Set passed = new HashSet(), succ = new HashSet(); - Set falsified = new HashSet(), fail = new HashSet(); - - int counter = 0; + Set falsified = new HashSet(), fail = new HashSet(); + + int counter = 0; AnswerTuple representative; for (AnswerTuple answer; answers.isValid(); answers.moveNext()) { - ++counter; + ++counter; answer = answers.getTuple(); - representative = summary.getSummary(answer); - if (fail.contains(representative)) + representative = summary.getSummary(answer); + if(fail.contains(representative)) falsified.add(answer); - else if (succ.contains(representative)) + else if(succ.contains(representative)) passed.add(answer); - else - if (summarisedHermiT.check(representative)) { + else if(summarisedHermiT.check(representative)) { succ.add(representative); passed.add(answer); } else { fail.add(representative); - falsified.add(answer); + falsified.add(answer); } } answers.dispose(); - + Utility.logDebug("@TIME to filter out non-answers by summarisation: " + t.duration()); - + m_record.removeUpperBoundAnswers(falsified); - + if (m_record.processed()) { - m_record.setDifficulty(Step.Summarisation); - m_record.addProcessingTime(Step.Summarisation, t.duration()); - return 0; + m_record.setDifficulty(Step.SUMMARISATION); + m_record.addProcessingTime(Step.SUMMARISATION, t.duration()); + return 0; } - + Utility.logDebug("The number of answers to be checked with HermiT: " + passed.size() + "/" + counter); - - m_record.setDifficulty(Step.FullReasoning); - m_record.addProcessingTime(Step.Summarisation, t.duration()); - + + m_record.setDifficulty(Step.FULL_REASONING); + m_record.addProcessingTime(Step.SUMMARISATION, t.duration()); + return endomorphismChecker.check(new AnswerTuplesImp(m_record.getAnswerVariables(), passed)); } else { - m_record.addProcessingTime(Step.Summarisation, t.duration()); + m_record.addProcessingTime(Step.SUMMARISATION, t.duration()); // m_record.saveRelevantOntology("fragment.owl"); - m_record.setDifficulty(Step.FullReasoning); + m_record.setDifficulty(Step.FULL_REASONING); return endomorphismChecker.check(answers); } } - public static final String QueryAnswerTermPrefix = TrackingRuleEncoder.QueryPredicate + "_term"; - - public static OWLOntology addOntologyWithQueryPreciate(OWLOntology ontology, QueryRecord record, AnswerTuples answers) { - OWLOntology newOntology = null; - OWLOntologyManager manager = ontology.getOWLOntologyManager(); - OWLDataFactory factory = manager.getOWLDataFactory(); - try { - newOntology = manager.createOntology(); - manager.addAxioms(newOntology, ontology.getAxioms()); - - OWLClass[] queryClass = new OWLClass[answers.getArity()]; - int arity = answers.getArity(); - for (int i = 0; i < arity; ++i) - queryClass[i] = factory.getOWLClass(IRI.create(QueryAnswerTermPrefix + i)); - AnswerTuple answer; - for (; answers.isValid(); answers.moveNext()) { - answer = answers.getTuple(); - for (int i = 0; i < arity; ++i) - if (answer.getGroundTerm(i) instanceof Individual) { - String iri = ((Individual) answer.getGroundTerm(i)).getIRI(); - if (!record.isPredicate(answer, i)) { - manager.addAxiom(newOntology, - factory.getOWLClassAssertionAxiom( - queryClass[i], - factory.getOWLNamedIndividual(IRI.create(iri)))); - } - } - } - answers.reset(); - } catch (OWLOntologyCreationException e) { - e.printStackTrace(); - } - - return newOntology; - } - - public static void printRelatedABoxAxioms(OWLOntology onto, String str) { - if (!str.startsWith("<")) str = OWLHelper.addAngles(str); - - System.out.println("Axioms in " + onto.getOntologyID().getOntologyIRI() + " related to " + str); - - for (OWLAxiom axiom: onto.getABoxAxioms(true)) - if (axiom.toString().contains(str)) - System.out.println(axiom); - - System.out.println("-----------------------------"); - } - - public static void printRelatedTBoxAxioms(OWLOntology onto, String str) { - - System.out.println("Axioms in " + onto.getOntologyID().getOntologyIRI() + " related to " + str); - - for (OWLAxiom axiom: onto.getTBoxAxioms(true)) - if (axiom.toString().contains(str)) - System.out.println(axiom); - - for (OWLAxiom axiom: onto.getRBoxAxioms(true)) - if (axiom.toString().contains(str)) - System.out.println(axiom); - - System.out.println("-----------------------------"); - } - @Override public boolean check(AnswerTuple answer) { AnswerTuple representative = summary.getSummary(answer); diff --git a/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java b/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java new file mode 100644 index 0000000..be6627a --- /dev/null +++ b/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java @@ -0,0 +1,126 @@ +package uk.ac.ox.cs.pagoda.util; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public class PagodaProperties { + + public static final String CONFIG_FILE = "pagoda.properties"; + + public static final boolean DEFAULT_DEBUG = false; + public static boolean shellModeDefault = false; + private static boolean debug = DEFAULT_DEBUG; + + static { + try(InputStream in = PagodaProperties.class.getClassLoader().getResourceAsStream(CONFIG_FILE)) { + Properties config = new Properties(); + config.load(in); + in.close(); + if(config.containsKey("debug")) { + debug = Boolean.parseBoolean(config.getProperty("debug")); + } + } catch(IOException e) { + e.printStackTrace(); + } + } + + String dataPath = null; + String ontologyPath; + String queryPath = null; + String answerPath = null; + boolean toClassify = true; + boolean toCallHermiT = true; + boolean shellMode = shellModeDefault; + + public PagodaProperties(String path) { + java.util.Properties m_properties = new java.util.Properties(); + InputStream inputStream = null; + try { + inputStream = new FileInputStream(path); + m_properties.load(inputStream); + + setOntologyPath(m_properties.getProperty("ONTOLOGY")); + setDataPath(m_properties.getProperty("DATA")); + setQueryPath(m_properties.getProperty("QUERY")); + setAnswerPath(m_properties.getProperty("ANSWER")); + setToClassify(Boolean.parseBoolean(m_properties.getProperty("TO_CLASSIFY"))); + setToCallHermiT(Boolean.parseBoolean(m_properties.getProperty("CALL_HERMIT"))); + + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (inputStream != null) + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public PagodaProperties() { + } + + public static boolean isDebuggingMode() { + return debug; + } + + public String getDataPath() { + return dataPath; + } + + public void setDataPath(String path) { + dataPath = path; + } + + public String getOntologyPath() { + return ontologyPath; + } + + public void setOntologyPath(String path) { + ontologyPath = path; + } + + public String getQueryPath() { + return queryPath; + } + + public void setQueryPath(String path) { + queryPath = path; + } + + public String getAnswerPath() { + return answerPath; + } + + public void setAnswerPath(String path) { + answerPath = path; + } + + public boolean getToClassify() { + return toClassify; + } + + public void setToClassify(boolean flag) { + toClassify = flag; + } + + public boolean getToCallHermiT() { + return toCallHermiT; + } + + public void setToCallHermiT(boolean flag) { + toCallHermiT = flag; + } + + public boolean getShellMode() { + return shellMode; + } + + public void setShellMode(boolean flag) { + shellMode = flag; + } + +} diff --git a/src/uk/ac/ox/cs/pagoda/util/Properties.java b/src/uk/ac/ox/cs/pagoda/util/Properties.java deleted file mode 100644 index 9ebebb6..0000000 --- a/src/uk/ac/ox/cs/pagoda/util/Properties.java +++ /dev/null @@ -1,66 +0,0 @@ -package uk.ac.ox.cs.pagoda.util; - -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; - -public class Properties { - - String dataPath = null; - public String getDataPath() { return dataPath; } - public void setDataPath(String path) { dataPath = path; } - - String ontologyPath; - public String getOntologyPath() { return ontologyPath; } - public void setOntologyPath(String path) { ontologyPath = path; } - - String queryPath = null; - public String getQueryPath() { return queryPath; } - public void setQueryPath(String path) { queryPath = path; } - - String answerPath = null; - public String getAnswerPath() { return answerPath; } - public void setAnswerPath(String path) { answerPath = path; } - - boolean toClassify = true; - public boolean getToClassify() { return toClassify; } - public void setToClassify(boolean flag) { toClassify = flag; } - - boolean toCallHermiT = true; - public boolean getToCallHermiT() { return toCallHermiT; } - public void setToCallHermiT(boolean flag) { toCallHermiT = flag; } - - public static boolean shellModeDefault = false; - - boolean shellMode = shellModeDefault; - public boolean getShellMode() { return shellMode; } - public void setShellMode(boolean flag) { shellMode = flag; } - - public Properties(String path) { - java.util.Properties m_properties = new java.util.Properties(); - InputStream inputStream = null; - try { - inputStream = new FileInputStream(path); - m_properties.load(inputStream); - - setOntologyPath(m_properties.getProperty("ONTOLOGY")); - setDataPath(m_properties.getProperty("DATA")); - setQueryPath(m_properties.getProperty("QUERY")); - setAnswerPath(m_properties.getProperty("ANSWER")); - setToClassify(Boolean.parseBoolean(m_properties.getProperty("TO_CLASSIFY"))); - setToCallHermiT(Boolean.parseBoolean(m_properties.getProperty("CALL_HERMIT"))); - - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (inputStream != null) - try { - inputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - public Properties() { } - -} -- cgit v1.2.3