diff options
| author | RncLsn <rnc.lsn@gmail.com> | 2015-06-03 19:24:50 +0100 |
|---|---|---|
| committer | RncLsn <rnc.lsn@gmail.com> | 2015-06-03 19:24:50 +0100 |
| commit | a840a197549ced185f212b2aa74abed8774c8b5c (patch) | |
| tree | 91168e111df7245b0cc1bf52c2738597a1a4a2e4 /src/uk/ac/ox/cs | |
| parent | b3b822d187a6402a39d30e471fe90a5dfad64312 (diff) | |
| download | ACQuA-a840a197549ced185f212b2aa74abed8774c8b5c.tar.gz ACQuA-a840a197549ced185f212b2aa74abed8774c8b5c.zip | |
Reintroduced extended queries. Successfully tested on LightTests and GapAnswers.
Diffstat (limited to 'src/uk/ac/ox/cs')
| -rw-r--r-- | src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java | 6 | ||||
| -rw-r--r-- | src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java | 2 | ||||
| -rw-r--r-- | src/uk/ac/ox/cs/pagoda/query/QueryRecord.java | 116 | ||||
| -rw-r--r-- | src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java | 54 | ||||
| -rw-r--r-- | src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java | 50 |
5 files changed, 111 insertions, 117 deletions
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 4022c1d..73a27bf 100644 --- a/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java +++ b/src/uk/ac/ox/cs/pagoda/endomorph/plan/OpenEndPlan.java | |||
| @@ -94,14 +94,14 @@ public class OpenEndPlan implements CheckPlan { | |||
| 94 | 94 | ||
| 95 | private boolean redundant(Clique clique) { | 95 | private boolean redundant(Clique clique) { |
| 96 | for (NodeTuple nodeTuple: clique.getNodeTuples()) | 96 | for (NodeTuple nodeTuple: clique.getNodeTuples()) |
| 97 | if (!passedAnswers.contains(AnswerTuple.getInstance(nodeTuple.getAnswerTuple(), m_answerArity))) | 97 | if(!passedAnswers.contains(AnswerTuple.create(nodeTuple.getAnswerTuple(), m_answerArity))) |
| 98 | return false; | 98 | return false; |
| 99 | return true; | 99 | return true; |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | private void addProjections(Clique clique) { | 102 | private void addProjections(Clique clique) { |
| 103 | for (NodeTuple nodeTuple: clique.getNodeTuples()) | 103 | for (NodeTuple nodeTuple: clique.getNodeTuples()) |
| 104 | passedAnswers.add(AnswerTuple.getInstance(nodeTuple.getAnswerTuple(), m_answerArity)); | 104 | passedAnswers.add(AnswerTuple.create(nodeTuple.getAnswerTuple(), m_answerArity)); |
| 105 | } | 105 | } |
| 106 | 106 | ||
| 107 | private void setMarkCascadelyValidated(Clique clique) { | 107 | private void setMarkCascadelyValidated(Clique clique) { |
diff --git a/src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java b/src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java index 9a9d0de..1e5fbd4 100644 --- a/src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java +++ b/src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java | |||
| @@ -49,7 +49,7 @@ public class AnswerTuple { | |||
| 49 | /** | 49 | /** |
| 50 | * It returns the first argument if its arity equals length, a new AnswerTuple otherwise. | 50 | * It returns the first argument if its arity equals length, a new AnswerTuple otherwise. |
| 51 | */ | 51 | */ |
| 52 | public static AnswerTuple getInstance(AnswerTuple extendedTuple, int length) { | 52 | public static AnswerTuple create(AnswerTuple extendedTuple, int length) { |
| 53 | if(length == extendedTuple.getArity()) return extendedTuple; | 53 | if(length == extendedTuple.getArity()) return extendedTuple; |
| 54 | else return new AnswerTuple(extendedTuple, length); | 54 | else return new AnswerTuple(extendedTuple, length); |
| 55 | } | 55 | } |
diff --git a/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java b/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java index 3edb2c3..dee2966 100644 --- a/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java +++ b/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java | |||
| @@ -9,7 +9,6 @@ import uk.ac.ox.cs.pagoda.reasoner.light.RDFoxAnswerTuples; | |||
| 9 | import uk.ac.ox.cs.pagoda.rules.GeneralProgram; | 9 | import uk.ac.ox.cs.pagoda.rules.GeneralProgram; |
| 10 | import uk.ac.ox.cs.pagoda.util.ConjunctiveQueryHelper; | 10 | import uk.ac.ox.cs.pagoda.util.ConjunctiveQueryHelper; |
| 11 | import uk.ac.ox.cs.pagoda.util.Namespace; | 11 | import uk.ac.ox.cs.pagoda.util.Namespace; |
| 12 | import uk.ac.ox.cs.pagoda.util.PagodaProperties; | ||
| 13 | import uk.ac.ox.cs.pagoda.util.Utility; | 12 | import uk.ac.ox.cs.pagoda.util.Utility; |
| 14 | import uk.ac.ox.cs.pagoda.util.disposable.Disposable; | 13 | import uk.ac.ox.cs.pagoda.util.disposable.Disposable; |
| 15 | import uk.ac.ox.cs.pagoda.util.disposable.DisposedException; | 14 | import uk.ac.ox.cs.pagoda.util.disposable.DisposedException; |
| @@ -135,18 +134,6 @@ public class QueryRecord extends Disposable { | |||
| 135 | return updateUpperBoundAnswers(answerTuples, false); | 134 | return updateUpperBoundAnswers(answerTuples, false); |
| 136 | } | 135 | } |
| 137 | 136 | ||
| 138 | public boolean checkUpperBoundAnswers(AnswerTuples answerTuples) { | ||
| 139 | if(isDisposed()) throw new DisposedException(); | ||
| 140 | |||
| 141 | return updateUpperBoundAnswers(answerTuples, true, false); | ||
| 142 | } | ||
| 143 | |||
| 144 | public boolean updateUpperBoundAnswers(AnswerTuples answerTuples, boolean toCheckAux) { | ||
| 145 | if(isDisposed()) throw new DisposedException(); | ||
| 146 | |||
| 147 | return updateUpperBoundAnswers(answerTuples, toCheckAux, true); | ||
| 148 | } | ||
| 149 | |||
| 150 | public int getNumberOfAnswers() { | 137 | public int getNumberOfAnswers() { |
| 151 | if(isDisposed()) throw new DisposedException(); | 138 | if(isDisposed()) throw new DisposedException(); |
| 152 | 139 | ||
| @@ -377,7 +364,7 @@ public class QueryRecord extends Disposable { | |||
| 377 | Utility.logError("The answer (" + answer + ") cannot be added, because it is not in the upper bound."); | 364 | Utility.logError("The answer (" + answer + ") cannot be added, because it is not in the upper bound."); |
| 378 | gapAnswerTuples.remove(answer); | 365 | gapAnswerTuples.remove(answer); |
| 379 | 366 | ||
| 380 | answer = AnswerTuple.getInstance(answer, answerVariables[0].length); | 367 | answer = AnswerTuple.create(answer, answerVariables[0].length); |
| 381 | // if (soundAnswerTuples.contains(answer)) | 368 | // if (soundAnswerTuples.contains(answer)) |
| 382 | // Utility.logError("The answer (" + answer + ") cannot be added, because it is in the lower bound."); | 369 | // Utility.logError("The answer (" + answer + ") cannot be added, because it is in the lower bound."); |
| 383 | soundAnswerTuples.add(answer); | 370 | soundAnswerTuples.add(answer); |
| @@ -556,7 +543,6 @@ public class QueryRecord extends Disposable { | |||
| 556 | return false; | 543 | return false; |
| 557 | } | 544 | } |
| 558 | 545 | ||
| 559 | // TODO remove fully extended query | ||
| 560 | public Tuple<String> getExtendedQueryText() { | 546 | public Tuple<String> getExtendedQueryText() { |
| 561 | if(isDisposed()) throw new DisposedException(); | 547 | if(isDisposed()) throw new DisposedException(); |
| 562 | 548 | ||
| @@ -655,75 +641,65 @@ public class QueryRecord extends Disposable { | |||
| 655 | return Objects.hash(queryText, soundAnswerTuples); | 641 | return Objects.hash(queryText, soundAnswerTuples); |
| 656 | } | 642 | } |
| 657 | 643 | ||
| 658 | private boolean updateUpperBoundAnswers(AnswerTuples answerTuples, boolean toCheckAux, boolean _check_containment) { | 644 | public boolean updateUpperBoundAnswers(AnswerTuples answerTuples, boolean toCheckAux) { |
| 659 | if(!(answerTuples instanceof RDFoxAnswerTuples)) { | 645 | RDFoxAnswerTuples rdfAnswerTuples; |
| 660 | String msg = "The upper bound must be computed by RDFox!"; | 646 | if(answerTuples instanceof RDFoxAnswerTuples) |
| 661 | Utility.logError(msg); | 647 | rdfAnswerTuples = (RDFoxAnswerTuples) answerTuples; |
| 662 | throw new IllegalArgumentException(msg); | 648 | else { |
| 649 | Utility.logError("The upper bound must be computed by RDFox!"); | ||
| 650 | return false; | ||
| 663 | } | 651 | } |
| 664 | 652 | ||
| 665 | RDFoxAnswerTuples rdfoxAnswerTuples = (RDFoxAnswerTuples) answerTuples; | 653 | if(soundAnswerTuples.size() > 0) { |
| 654 | int number = 0; | ||
| 655 | for(; answerTuples.isValid(); answerTuples.moveNext()) { | ||
| 656 | ++number; | ||
| 657 | } | ||
| 658 | Utility.logDebug("The number of answers returned by an upper bound: " + number); | ||
| 659 | if(number <= soundAnswerTuples.size()) { | ||
| 660 | if(gapAnswerTuples != null) gapAnswerTuples.clear(); | ||
| 661 | else gapAnswerTuples = new HashSet<AnswerTuple>(); | ||
| 666 | 662 | ||
| 667 | Set<AnswerTuple> candidateGapAnswerTuples = new HashSet<AnswerTuple>(); | 663 | Utility.logInfo("Upper bound answers updated: " + (soundAnswerTuples.size() + gapAnswerTuples.size())); |
| 668 | AnswerTuple tuple; | 664 | return false; |
| 669 | for(; rdfoxAnswerTuples.isValid(); rdfoxAnswerTuples.moveNext()) { | 665 | } |
| 670 | tuple = rdfoxAnswerTuples.getTuple(); | 666 | answerTuples.reset(); |
| 671 | if(isBottom() || !tuple.hasAnonymousIndividual()) | ||
| 672 | if((!toCheckAux || !tuple.hasAuxPredicate()) && !soundAnswerTuples.contains(tuple)) | ||
| 673 | candidateGapAnswerTuples.add(tuple); | ||
| 674 | } | 667 | } |
| 675 | 668 | ||
| 676 | /*** START: debugging ***/ | 669 | boolean justCheck = (answerTuples.getArity() != answerVariables[1].length); |
| 677 | if(PagodaProperties.isDebuggingMode() && _check_containment) { | 670 | |
| 678 | if(rdfoxAnswerTuples.getArity() != getAnswerVariables().length) | 671 | Set<AnswerTuple> tupleSet = new HashSet<AnswerTuple>(); |
| 679 | throw new IllegalArgumentException( | 672 | AnswerTuple tuple, extendedTuple; |
| 680 | "The arity of answers (" + rdfoxAnswerTuples.getArity() + ") " + | 673 | for(; answerTuples.isValid(); answerTuples.moveNext()) { |
| 681 | "is different from the number of answer variables (" + | 674 | extendedTuple = rdfAnswerTuples.getTuple(); |
| 682 | getAnswerVariables().length + ")"); | 675 | if(isBottom() || !extendedTuple.hasAnonymousIndividual()) { |
| 683 | 676 | tuple = AnswerTuple.create(extendedTuple, answerVariables[0].length); | |
| 684 | Set<AnswerTuple> namedAnswerTuples = new HashSet<>(); | 677 | if((!toCheckAux || !tuple.hasAuxPredicate()) && !soundAnswerTuples.contains(tuple)) { |
| 685 | rdfoxAnswerTuples.reset(); | 678 | if(!toCheckAux && justCheck) return false; |
| 686 | int numberOfAnswers = 0; | 679 | tupleSet.add(extendedTuple); |
| 687 | for(; rdfoxAnswerTuples.isValid(); rdfoxAnswerTuples.moveNext()) { | 680 | } |
| 688 | tuple = rdfoxAnswerTuples.getTuple(); | ||
| 689 | // if(isBottom() || !tuple.hasAnonymousIndividual()) { | ||
| 690 | namedAnswerTuples.add(tuple); | ||
| 691 | // } | ||
| 692 | numberOfAnswers++; | ||
| 693 | } | 681 | } |
| 694 | Utility.logDebug("The number of answers returned by an upper bound: " + numberOfAnswers); | ||
| 695 | HashSet<AnswerTuple> difference = new HashSet<>(soundAnswerTuples); | ||
| 696 | difference.removeAll(namedAnswerTuples); | ||
| 697 | if(!difference.isEmpty()) | ||
| 698 | throw new IllegalArgumentException("The upper bound does not contain the lower bound! Missing answers: " + difference | ||
| 699 | .size()); | ||
| 700 | } | 682 | } |
| 701 | /*** END: debugging ***/ | ||
| 702 | 683 | ||
| 703 | boolean update; | ||
| 704 | if(gapAnswerTuples == null) { | 684 | if(gapAnswerTuples == null) { |
| 705 | gapAnswerTuples = candidateGapAnswerTuples; | 685 | gapAnswerTuples = tupleSet; |
| 706 | update = true; | 686 | |
| 687 | Utility.logInfo("Upper bound answers updated: " + (soundAnswerTuples.size() + gapAnswerTuples.size())); | ||
| 688 | return true; | ||
| 707 | } | 689 | } |
| 708 | else { | 690 | |
| 709 | update = gapAnswerTuples.retainAll(candidateGapAnswerTuples); | 691 | boolean update = false; |
| 692 | for(Iterator<AnswerTuple> iter = gapAnswerTuples.iterator(); iter.hasNext(); ) { | ||
| 693 | tuple = iter.next(); | ||
| 694 | if(!tupleSet.contains(tuple)) { | ||
| 695 | iter.remove(); | ||
| 696 | update = true; | ||
| 697 | } | ||
| 710 | } | 698 | } |
| 711 | 699 | ||
| 712 | if(update) | 700 | Utility.logInfo("Upper bound answers updated: " + (soundAnswerTuples.size() + gapAnswerTuples.size())); |
| 713 | Utility.logInfo("Upper bound answers updated: " + getNumberOfAnswers()); | ||
| 714 | else | ||
| 715 | Utility.logInfo("Upper bound answers unchanged"); | ||
| 716 | 701 | ||
| 717 | return update; | 702 | return update; |
| 718 | |||
| 719 | // boolean update = false; | ||
| 720 | // for(Iterator<AnswerTuple> iter = gapAnswerTuples.iterator(); iter.hasNext(); ) { | ||
| 721 | // tuple = iter.next(); | ||
| 722 | // if(!candidateGapAnswerTuples.contains(tuple)) { | ||
| 723 | // iter.remove(); | ||
| 724 | // update = true; | ||
| 725 | // } | ||
| 726 | // } | ||
| 727 | } | 703 | } |
| 728 | 704 | ||
| 729 | public enum Step { | 705 | public enum Step { |
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java index b4e2f5a..3027a73 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java | |||
| @@ -19,6 +19,7 @@ import uk.ac.ox.cs.pagoda.tracking.QueryTracker; | |||
| 19 | import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoder; | 19 | import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoder; |
| 20 | import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoderDisjVar1; | 20 | import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoderDisjVar1; |
| 21 | import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoderWithGap; | 21 | import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoderWithGap; |
| 22 | import uk.ac.ox.cs.pagoda.util.PagodaProperties; | ||
| 22 | import uk.ac.ox.cs.pagoda.util.Timer; | 23 | import uk.ac.ox.cs.pagoda.util.Timer; |
| 23 | import uk.ac.ox.cs.pagoda.util.Utility; | 24 | import uk.ac.ox.cs.pagoda.util.Utility; |
| 24 | import uk.ac.ox.cs.pagoda.util.disposable.DisposedException; | 25 | import uk.ac.ox.cs.pagoda.util.disposable.DisposedException; |
| @@ -44,7 +45,6 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 44 | private Collection<String> predicatesWithGap = null; | 45 | private Collection<String> predicatesWithGap = null; |
| 45 | private ConsistencyStatus isConsistent; | 46 | private ConsistencyStatus isConsistent; |
| 46 | private ConsistencyManager consistency = new ConsistencyManager(this); | 47 | private ConsistencyManager consistency = new ConsistencyManager(this); |
| 47 | private boolean useSkolemisation = false; // now only debugging | ||
| 48 | 48 | ||
| 49 | public MyQueryReasoner() { | 49 | public MyQueryReasoner() { |
| 50 | setup(true); | 50 | setup(true); |
| @@ -192,7 +192,8 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 192 | OWLOntology relevantOntologySubset = extractRelevantOntologySubset(queryRecord); | 192 | OWLOntology relevantOntologySubset = extractRelevantOntologySubset(queryRecord); |
| 193 | queryRecord.saveRelevantOntology("/home/alessandro/Desktop/fragment_query" + queryRecord.getQueryID() + ".owl"); | 193 | queryRecord.saveRelevantOntology("/home/alessandro/Desktop/fragment_query" + queryRecord.getQueryID() + ".owl"); |
| 194 | 194 | ||
| 195 | if(useSkolemisation && querySkolemisedRelevantSubset(relevantOntologySubset, queryRecord)) | 195 | if(PagodaProperties.getDefaultUseSkolemUpperBound() && |
| 196 | querySkolemisedRelevantSubset(relevantOntologySubset, queryRecord)) | ||
| 196 | return; | 197 | return; |
| 197 | 198 | ||
| 198 | Timer t = new Timer(); | 199 | Timer t = new Timer(); |
| @@ -263,10 +264,12 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 263 | private boolean queryUpperStore(BasicQueryEngine upperStore, QueryRecord queryRecord, | 264 | private boolean queryUpperStore(BasicQueryEngine upperStore, QueryRecord queryRecord, |
| 264 | Tuple<String> extendedQuery, Step step) { | 265 | Tuple<String> extendedQuery, Step step) { |
| 265 | t.reset(); | 266 | t.reset(); |
| 266 | if(queryRecord.hasNonAnsDistinguishedVariables()) | 267 | |
| 268 | queryUpperBound(upperStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables()); | ||
| 269 | if(!queryRecord.isProcessed() && !queryRecord.getQueryText().equals(extendedQuery.get(0))) | ||
| 267 | queryUpperBound(upperStore, queryRecord, extendedQuery.get(0), queryRecord.getAnswerVariables()); | 270 | queryUpperBound(upperStore, queryRecord, extendedQuery.get(0), queryRecord.getAnswerVariables()); |
| 268 | else | 271 | if(!queryRecord.isProcessed() && queryRecord.hasNonAnsDistinguishedVariables()) |
| 269 | queryUpperBound(upperStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables()); | 272 | queryUpperBound(upperStore, queryRecord, extendedQuery.get(1), queryRecord.getDistinguishedVariables()); |
| 270 | 273 | ||
| 271 | queryRecord.addProcessingTime(step, t.duration()); | 274 | queryRecord.addProcessingTime(step, t.duration()); |
| 272 | if(queryRecord.isProcessed()) { | 275 | if(queryRecord.isProcessed()) { |
| @@ -276,34 +279,6 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 276 | return false; | 279 | return false; |
| 277 | } | 280 | } |
| 278 | 281 | ||
| 279 | private boolean checkGapAnswers(BasicQueryEngine relevantStore, QueryRecord queryRecord) { | ||
| 280 | t.reset(); | ||
| 281 | Tuple<String> extendedQueries = queryRecord.getExtendedQueryText(); | ||
| 282 | if(queryRecord.hasNonAnsDistinguishedVariables()) | ||
| 283 | checkGapAnswers(relevantStore, queryRecord, extendedQueries.get(0), queryRecord.getAnswerVariables()); | ||
| 284 | else | ||
| 285 | checkGapAnswers(relevantStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables()); | ||
| 286 | |||
| 287 | queryRecord.addProcessingTime(Step.L_SKOLEM_UPPER_BOUND, t.duration()); | ||
| 288 | if(queryRecord.isProcessed()) { | ||
| 289 | queryRecord.setDifficulty(Step.L_SKOLEM_UPPER_BOUND); | ||
| 290 | return true; | ||
| 291 | } | ||
| 292 | return false; | ||
| 293 | } | ||
| 294 | |||
| 295 | private void checkGapAnswers(BasicQueryEngine relevantStore, QueryRecord queryRecord, String queryText, String[] answerVariables) { | ||
| 296 | AnswerTuples rlAnswer = null; | ||
| 297 | try { | ||
| 298 | Utility.logDebug(queryText); | ||
| 299 | rlAnswer = relevantStore.evaluate(queryText, answerVariables); | ||
| 300 | Utility.logDebug(t.duration()); | ||
| 301 | queryRecord.checkUpperBoundAnswers(rlAnswer); | ||
| 302 | } finally { | ||
| 303 | if(rlAnswer != null) rlAnswer.dispose(); | ||
| 304 | } | ||
| 305 | } | ||
| 306 | |||
| 307 | /** | 282 | /** |
| 308 | * Returns the part of the ontology relevant for Hermit, while computing the bound answers. | 283 | * Returns the part of the ontology relevant for Hermit, while computing the bound answers. |
| 309 | */ | 284 | */ |
| @@ -322,9 +297,11 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 322 | 297 | ||
| 323 | Tuple<String> extendedQueryTexts = queryRecord.getExtendedQueryText(); | 298 | Tuple<String> extendedQueryTexts = queryRecord.getExtendedQueryText(); |
| 324 | 299 | ||
| 325 | Utility.logDebug("Tracking store"); | 300 | if(PagodaProperties.getDefaultUseAlwaysSimpleUpperBound() || lazyUpperStore == null) { |
| 326 | if(queryUpperStore(trackingStore, queryRecord, extendedQueryTexts, Step.SIMPLE_UPPER_BOUND)) | 301 | Utility.logDebug("Tracking store"); |
| 327 | return true; | 302 | if(queryUpperStore(trackingStore, queryRecord, extendedQueryTexts, Step.SIMPLE_UPPER_BOUND)) |
| 303 | return true; | ||
| 304 | } | ||
| 328 | 305 | ||
| 329 | if(!queryRecord.isBottom()) { | 306 | if(!queryRecord.isBottom()) { |
| 330 | Utility.logDebug("Lazy store"); | 307 | Utility.logDebug("Lazy store"); |
| @@ -362,7 +339,6 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 362 | 339 | ||
| 363 | queryRecord.addProcessingTime(Step.FRAGMENT, t.duration()); | 340 | queryRecord.addProcessingTime(Step.FRAGMENT, t.duration()); |
| 364 | 341 | ||
| 365 | // just statistics | ||
| 366 | int numOfABoxAxioms = relevantOntologySubset.getABoxAxioms(true).size(); | 342 | int numOfABoxAxioms = relevantOntologySubset.getABoxAxioms(true).size(); |
| 367 | int numOfTBoxAxioms = relevantOntologySubset.getAxiomCount() - numOfABoxAxioms; | 343 | int numOfTBoxAxioms = relevantOntologySubset.getAxiomCount() - numOfABoxAxioms; |
| 368 | Utility.logInfo("Relevant ontology-subset has been extracted: |ABox|=" | 344 | Utility.logInfo("Relevant ontology-subset has been extracted: |ABox|=" |
| @@ -407,7 +383,9 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 407 | return false; | 383 | return false; |
| 408 | } | 384 | } |
| 409 | 385 | ||
| 410 | boolean isFullyProcessed = checkGapAnswers(relevantStore, queryRecord); | 386 | boolean isFullyProcessed = queryUpperStore(relevantStore, queryRecord, |
| 387 | queryRecord.getExtendedQueryText(), | ||
| 388 | Step.L_SKOLEM_UPPER_BOUND); | ||
| 411 | Utility.logInfo("Semi-Skolemised relevant upper store has been evaluated"); | 389 | Utility.logInfo("Semi-Skolemised relevant upper store has been evaluated"); |
| 412 | return isFullyProcessed; | 390 | return isFullyProcessed; |
| 413 | } | 391 | } |
diff --git a/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java b/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java index 7b7d48d..e07d54f 100644 --- a/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java +++ b/src/uk/ac/ox/cs/pagoda/util/PagodaProperties.java | |||
| @@ -10,24 +10,41 @@ import java.util.Properties; | |||
| 10 | public class PagodaProperties { | 10 | public class PagodaProperties { |
| 11 | 11 | ||
| 12 | public static final String CONFIG_FILE = "pagoda.properties"; | 12 | public static final String CONFIG_FILE = "pagoda.properties"; |
| 13 | |||
| 14 | public static final boolean DEFAULT_DEBUG = false; | 13 | public static final boolean DEFAULT_DEBUG = false; |
| 14 | private static final boolean DEFAULT_USE_ALWAYS_SIMPLE_UPPER_BOUND; | ||
| 15 | private static final boolean DEFAULT_USE_SKOLEM_UPPER_BOUND; | ||
| 16 | |||
| 15 | public static boolean shellModeDefault = false; | 17 | public static boolean shellModeDefault = false; |
| 16 | private static boolean debug = DEFAULT_DEBUG; | 18 | private static boolean debug = DEFAULT_DEBUG; |
| 17 | 19 | ||
| 18 | static { | 20 | static { |
| 21 | boolean defaultUseAlwaysSimpleUpperBound = false; | ||
| 22 | boolean defaultUseSkolemUpperBound = true; | ||
| 23 | |||
| 19 | try(InputStream in = PagodaProperties.class.getClassLoader().getResourceAsStream(CONFIG_FILE)) { | 24 | try(InputStream in = PagodaProperties.class.getClassLoader().getResourceAsStream(CONFIG_FILE)) { |
| 20 | Properties config = new Properties(); | 25 | Properties config = new Properties(); |
| 21 | config.load(in); | 26 | config.load(in); |
| 22 | in.close(); | 27 | in.close(); |
| 28 | Logger logger = Logger.getLogger("PagodaProperties"); | ||
| 23 | if(config.containsKey("debug")) { | 29 | if(config.containsKey("debug")) { |
| 24 | debug = Boolean.parseBoolean(config.getProperty("debug")); | 30 | debug = Boolean.parseBoolean(config.getProperty("debug")); |
| 25 | Logger.getLogger("PagodaProperties") | 31 | // logger.info("Debugging mode is enabled (you can disable it from file \"pagoda.properties\")"); |
| 26 | .info("Debugging mode is enabled (you can disable it from file \"pagoda.properties\")"); | 32 | logger.info("Debugging mode is enabled"); |
| 33 | } | ||
| 34 | if(config.containsKey("useAlwaysSimpleUpperBound")) { | ||
| 35 | defaultUseAlwaysSimpleUpperBound = | ||
| 36 | Boolean.parseBoolean(config.getProperty("useAlwaysSimpleUpperBound")); | ||
| 37 | logger.info("The simple upper bound is always used"); | ||
| 38 | } | ||
| 39 | if(config.containsKey("useSkolemUpperBound")) { | ||
| 40 | defaultUseSkolemUpperBound = Boolean.parseBoolean(config.getProperty("useSkolemUpperBound")); | ||
| 41 | logger.info("The Skolem upper bound is enabled"); | ||
| 27 | } | 42 | } |
| 28 | } catch(IOException e) { | 43 | } catch(IOException e) { |
| 29 | e.printStackTrace(); | 44 | e.printStackTrace(); |
| 30 | } | 45 | } |
| 46 | DEFAULT_USE_ALWAYS_SIMPLE_UPPER_BOUND = defaultUseAlwaysSimpleUpperBound; | ||
| 47 | DEFAULT_USE_SKOLEM_UPPER_BOUND = defaultUseSkolemUpperBound; | ||
| 31 | } | 48 | } |
| 32 | 49 | ||
| 33 | String dataPath = null; | 50 | String dataPath = null; |
| @@ -37,7 +54,8 @@ public class PagodaProperties { | |||
| 37 | boolean toClassify = true; | 54 | boolean toClassify = true; |
| 38 | boolean toCallHermiT = true; | 55 | boolean toCallHermiT = true; |
| 39 | boolean shellMode = shellModeDefault; | 56 | boolean shellMode = shellModeDefault; |
| 40 | 57 | private boolean useAlwaysSimpleUpperBound = DEFAULT_USE_ALWAYS_SIMPLE_UPPER_BOUND; | |
| 58 | private boolean useSkolemUpperBound = DEFAULT_USE_SKOLEM_UPPER_BOUND; | ||
| 41 | public PagodaProperties(String path) { | 59 | public PagodaProperties(String path) { |
| 42 | java.util.Properties m_properties = new java.util.Properties(); | 60 | java.util.Properties m_properties = new java.util.Properties(); |
| 43 | InputStream inputStream = null; | 61 | InputStream inputStream = null; |
| @@ -63,7 +81,6 @@ public class PagodaProperties { | |||
| 63 | } | 81 | } |
| 64 | } | 82 | } |
| 65 | } | 83 | } |
| 66 | |||
| 67 | public PagodaProperties() { | 84 | public PagodaProperties() { |
| 68 | } | 85 | } |
| 69 | 86 | ||
| @@ -71,6 +88,14 @@ public class PagodaProperties { | |||
| 71 | return debug; | 88 | return debug; |
| 72 | } | 89 | } |
| 73 | 90 | ||
| 91 | public static boolean getDefaultUseAlwaysSimpleUpperBound() { | ||
| 92 | return DEFAULT_USE_ALWAYS_SIMPLE_UPPER_BOUND; | ||
| 93 | } | ||
| 94 | |||
| 95 | public static boolean getDefaultUseSkolemUpperBound() { | ||
| 96 | return DEFAULT_USE_SKOLEM_UPPER_BOUND; | ||
| 97 | } | ||
| 98 | |||
| 74 | public String getDataPath() { | 99 | public String getDataPath() { |
| 75 | return dataPath; | 100 | return dataPath; |
| 76 | } | 101 | } |
| @@ -127,4 +152,19 @@ public class PagodaProperties { | |||
| 127 | shellMode = flag; | 152 | shellMode = flag; |
| 128 | } | 153 | } |
| 129 | 154 | ||
| 155 | public boolean getUseAlwaysSimpleUpperBound() { | ||
| 156 | return useAlwaysSimpleUpperBound; | ||
| 157 | } | ||
| 158 | |||
| 159 | public void setUseAlwaysSimpleUpperBound(boolean flag) { | ||
| 160 | useAlwaysSimpleUpperBound = flag; | ||
| 161 | } | ||
| 162 | |||
| 163 | public boolean getUseSkolemUpperBound() { | ||
| 164 | return useSkolemUpperBound; | ||
| 165 | } | ||
| 166 | |||
| 167 | public void setUseSkolemUpperBound(boolean flag) { | ||
| 168 | useSkolemUpperBound = flag; | ||
| 169 | } | ||
| 130 | } | 170 | } |
