diff options
| author | RncLsn <rnc.lsn@gmail.com> | 2015-05-21 14:46:44 +0100 |
|---|---|---|
| committer | RncLsn <rnc.lsn@gmail.com> | 2015-05-21 14:46:44 +0100 |
| commit | c9c8d03e957fa56df5dc1304f7a81dfa61b7b70e (patch) | |
| tree | 216b255980cbdf3d0cfca0d67b38641adb15bbdd /src/uk/ac/ox/cs | |
| parent | d81b086fe329fa69891eba0a4b1f73e44183620d (diff) | |
| download | ACQuA-c9c8d03e957fa56df5dc1304f7a81dfa61b7b70e.tar.gz ACQuA-c9c8d03e957fa56df5dc1304f7a81dfa61b7b70e.zip | |
Removed extended queries (involving classes MyQueryReasoner and QueryRecord). Executed LightTests successfully.
Diffstat (limited to 'src/uk/ac/ox/cs')
| -rw-r--r-- | src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java | 5 | ||||
| -rw-r--r-- | src/uk/ac/ox/cs/pagoda/query/QueryRecord.java | 101 | ||||
| -rw-r--r-- | src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java | 27 |
3 files changed, 57 insertions, 76 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java b/src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java index 7220533..54e4837 100644 --- a/src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java +++ b/src/uk/ac/ox/cs/pagoda/query/AnswerTuple.java | |||
| @@ -50,7 +50,10 @@ public class AnswerTuple { | |||
| 50 | for(int i = 0; i < arity; ++i) m_tuple[i] = sup.m_tuple[i]; | 50 | for(int i = 0; i < arity; ++i) m_tuple[i] = sup.m_tuple[i]; |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | public static AnswerTuple create(AnswerTuple extendedTuple, int length) { | 53 | /** |
| 54 | * It returns the first argument if its arity equals length, a new AnswerTuple otherwise. | ||
| 55 | */ | ||
| 56 | public static AnswerTuple getInstance(AnswerTuple extendedTuple, int length) { | ||
| 54 | if(length == extendedTuple.getArity()) return extendedTuple; | 57 | if(length == extendedTuple.getArity()) return extendedTuple; |
| 55 | else return new AnswerTuple(extendedTuple, length); | 58 | else return new AnswerTuple(extendedTuple, length); |
| 56 | } | 59 | } |
diff --git a/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java b/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java index 1ecd867..8b73abb 100644 --- a/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java +++ b/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java | |||
| @@ -22,6 +22,7 @@ public class QueryRecord { | |||
| 22 | 22 | ||
| 23 | public static final String botQueryText = "SELECT ?X WHERE { ?X <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Nothing> }"; | 23 | public static final String botQueryText = "SELECT ?X WHERE { ?X <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Nothing> }"; |
| 24 | public static final String SEPARATOR = "----------------------------------------"; | 24 | public static final String SEPARATOR = "----------------------------------------"; |
| 25 | private static final String RDF_TYPE = "a"; //"rdf:type"; //RDF.type.toString(); | ||
| 25 | boolean processed = false; | 26 | boolean processed = false; |
| 26 | String stringQueryID = null; | 27 | String stringQueryID = null; |
| 27 | OWLOntology relevantOntology = null; | 28 | OWLOntology relevantOntology = null; |
| @@ -39,18 +40,18 @@ public class QueryRecord { | |||
| 39 | 40 | ||
| 40 | private QueryRecord() { | 41 | private QueryRecord() { |
| 41 | } | 42 | } |
| 42 | |||
| 43 | public QueryRecord(QueryManager manager, String text, int id, int subID) { | ||
| 44 | m_manager = manager; | ||
| 45 | resetInfo(text, id, subID); | ||
| 46 | resetTimer(); | ||
| 47 | } | ||
| 48 | 43 | ||
| 49 | // private boolean containsAuxPredicate(String str) { | 44 | // private boolean containsAuxPredicate(String str) { |
| 50 | // return str.contains(Namespace.PAGODA_AUX) || str.contains("_AUX") || str.contains("owl#Nothing") || | 45 | // return str.contains(Namespace.PAGODA_AUX) || str.contains("_AUX") || str.contains("owl#Nothing") || |
| 51 | // str.contains("internal:def"); | 46 | // str.contains("internal:def"); |
| 52 | // } | 47 | // } |
| 53 | 48 | ||
| 49 | public QueryRecord(QueryManager manager, String text, int id, int subID) { | ||
| 50 | m_manager = manager; | ||
| 51 | resetInfo(text, id, subID); | ||
| 52 | resetTimer(); | ||
| 53 | } | ||
| 54 | |||
| 54 | public static Collection<String> collectQueryTexts(Collection<QueryRecord> queryRecords) { | 55 | public static Collection<String> collectQueryTexts(Collection<QueryRecord> queryRecords) { |
| 55 | Collection<String> texts = new LinkedList<String>(); | 56 | Collection<String> texts = new LinkedList<String>(); |
| 56 | for(QueryRecord record : queryRecords) | 57 | for(QueryRecord record : queryRecords) |
| @@ -126,56 +127,33 @@ public class QueryRecord { | |||
| 126 | 127 | ||
| 127 | RDFoxAnswerTuples rdfoxAnswerTuples = (RDFoxAnswerTuples) answerTuples; | 128 | RDFoxAnswerTuples rdfoxAnswerTuples = (RDFoxAnswerTuples) answerTuples; |
| 128 | 129 | ||
| 129 | // if(soundAnswerTuples.size() > 0) { | ||
| 130 | // int number = 0; | ||
| 131 | // for(; rdfoxAnswerTuples.isValid(); rdfoxAnswerTuples.moveNext()) { | ||
| 132 | // ++number; | ||
| 133 | // } | ||
| 134 | // Utility.logInfo("The number of answers returned by an upper bound: " + number); | ||
| 135 | // if(number == soundAnswerTuples.size()) { | ||
| 136 | // if(gapAnswerTuples != null) gapAnswerTuples.clear(); | ||
| 137 | // else gapAnswerTuples = new HashSet<AnswerTuple>(); | ||
| 138 | // | ||
| 139 | // Utility.logInfo("The number of upper bound answers: " + (soundAnswerTuples.size() + gapAnswerTuples.size())); | ||
| 140 | // return false; | ||
| 141 | // } else if(number < soundAnswerTuples.size()) | ||
| 142 | // throw new IllegalArgumentException("The upper bound answers must contain all the lower bound ones!"); | ||
| 143 | // rdfoxAnswerTuples.reset(); | ||
| 144 | // } | ||
| 145 | |||
| 146 | // boolean justCheck = (rdfoxAnswerTuples.getArity() < getDistinguishedVariables().length); | ||
| 147 | // boolean justCheck = (rdfoxAnswerTuples.getArity() != getDistinguishedVariables().length); | ||
| 148 | // if(justCheck) throw new Error("justCheck!"); | ||
| 149 | boolean justCheck = false; | ||
| 150 | |||
| 151 | Set<AnswerTuple> candidateGapAnswerTuples = new HashSet<AnswerTuple>(); | 130 | Set<AnswerTuple> candidateGapAnswerTuples = new HashSet<AnswerTuple>(); |
| 152 | AnswerTuple tuple, extendedTuple; | 131 | AnswerTuple tuple; |
| 153 | for(; rdfoxAnswerTuples.isValid(); rdfoxAnswerTuples.moveNext()) { | 132 | for(; rdfoxAnswerTuples.isValid(); rdfoxAnswerTuples.moveNext()) { |
| 154 | extendedTuple = rdfoxAnswerTuples.getTuple(); | 133 | tuple = rdfoxAnswerTuples.getTuple(); |
| 155 | if(isBottom() || !extendedTuple.hasAnonymousIndividual()) { | 134 | if(isBottom() || !tuple.hasAnonymousIndividual()) |
| 156 | tuple = AnswerTuple.create(extendedTuple, getAnswerVariables().length); | 135 | if((!toCheckAux || !tuple.hasAuxPredicate()) && !soundAnswerTuples.contains(tuple)) |
| 157 | if((!toCheckAux || !tuple.hasAuxPredicate()) && !soundAnswerTuples.contains(tuple)) { | 136 | candidateGapAnswerTuples.add(tuple); |
| 158 | if(!toCheckAux && justCheck) return false; | ||
| 159 | // TODO check | ||
| 160 | candidateGapAnswerTuples.add(extendedTuple); | ||
| 161 | // candidateGapAnswerTuples.add(tuple); | ||
| 162 | } | ||
| 163 | } | ||
| 164 | } | 137 | } |
| 165 | 138 | ||
| 166 | /*** START: debugging ***/ | 139 | /*** START: debugging ***/ |
| 167 | if(PagodaProperties.isDebuggingMode()) { | 140 | if(PagodaProperties.isDebuggingMode()) { |
| 168 | Set<AnswerTuple> projectedAnswerTuples = new HashSet<>(); | 141 | if(rdfoxAnswerTuples.getArity() != getAnswerVariables().length) |
| 142 | throw new IllegalArgumentException( | ||
| 143 | "The arity of answers (" + rdfoxAnswerTuples.getArity() + ") " + | ||
| 144 | "is different from the number of answer variables (" + | ||
| 145 | getAnswerVariables().length + ")"); | ||
| 146 | |||
| 147 | Set<AnswerTuple> namedAnswerTuples = new HashSet<>(); | ||
| 169 | rdfoxAnswerTuples.reset(); | 148 | rdfoxAnswerTuples.reset(); |
| 170 | for(; rdfoxAnswerTuples.isValid(); rdfoxAnswerTuples.moveNext()) { | 149 | for(; rdfoxAnswerTuples.isValid(); rdfoxAnswerTuples.moveNext()) { |
| 171 | extendedTuple = rdfoxAnswerTuples.getTuple(); | 150 | tuple = rdfoxAnswerTuples.getTuple(); |
| 172 | if(isBottom() || !extendedTuple.hasAnonymousIndividual()) { | 151 | // if(isBottom() || !tuple.hasAnonymousIndividual()) { |
| 173 | tuple = AnswerTuple.create(extendedTuple, getAnswerVariables().length); | 152 | namedAnswerTuples.add(tuple); |
| 174 | projectedAnswerTuples.add(tuple); | 153 | // } |
| 175 | } | ||
| 176 | } | 154 | } |
| 177 | HashSet<AnswerTuple> difference = new HashSet<>(soundAnswerTuples); | 155 | HashSet<AnswerTuple> difference = new HashSet<>(soundAnswerTuples); |
| 178 | difference.removeAll(projectedAnswerTuples); | 156 | difference.removeAll(namedAnswerTuples); |
| 179 | if(!difference.isEmpty()) | 157 | if(!difference.isEmpty()) |
| 180 | throw new IllegalArgumentException("The upper bound does not contain the lower bound!"); | 158 | throw new IllegalArgumentException("The upper bound does not contain the lower bound!"); |
| 181 | } | 159 | } |
| @@ -218,7 +196,7 @@ public class QueryRecord { | |||
| 218 | if(gapAnswerTuples != null && gapAnswerTuples.isEmpty()) processed = true; | 196 | if(gapAnswerTuples != null && gapAnswerTuples.isEmpty()) processed = true; |
| 219 | return processed; | 197 | return processed; |
| 220 | } | 198 | } |
| 221 | 199 | ||
| 222 | public String[] getDistinguishedVariables() { | 200 | public String[] getDistinguishedVariables() { |
| 223 | return answerVariables[1]; | 201 | return answerVariables[1]; |
| 224 | } | 202 | } |
| @@ -238,7 +216,7 @@ public class QueryRecord { | |||
| 238 | public String getQueryID() { | 216 | public String getQueryID() { |
| 239 | return stringQueryID; | 217 | return stringQueryID; |
| 240 | } | 218 | } |
| 241 | 219 | ||
| 242 | public AnswerTuples getGapAnswers() { | 220 | public AnswerTuples getGapAnswers() { |
| 243 | return new AnswerTuplesImp(answerVariables[0], gapAnswerTuples); | 221 | return new AnswerTuplesImp(answerVariables[0], gapAnswerTuples); |
| 244 | } | 222 | } |
| @@ -355,7 +333,7 @@ public class QueryRecord { | |||
| 355 | public void setRelevantOntology(OWLOntology knowledgebase) { | 333 | public void setRelevantOntology(OWLOntology knowledgebase) { |
| 356 | relevantOntology = knowledgebase; | 334 | relevantOntology = knowledgebase; |
| 357 | } | 335 | } |
| 358 | 336 | ||
| 359 | public void saveRelevantOntology(String filename) { | 337 | public void saveRelevantOntology(String filename) { |
| 360 | if(relevantOntology == null) return; | 338 | if(relevantOntology == null) return; |
| 361 | OWLOntologyManager manager = relevantOntology.getOWLOntologyManager(); | 339 | OWLOntologyManager manager = relevantOntology.getOWLOntologyManager(); |
| @@ -394,7 +372,7 @@ public class QueryRecord { | |||
| 394 | Utility.logError("The answer (" + answer + ") cannot be added, because it is not in the upper bound."); | 372 | Utility.logError("The answer (" + answer + ") cannot be added, because it is not in the upper bound."); |
| 395 | gapAnswerTuples.remove(answer); | 373 | gapAnswerTuples.remove(answer); |
| 396 | 374 | ||
| 397 | answer = AnswerTuple.create(answer, answerVariables[0].length); | 375 | answer = AnswerTuple.getInstance(answer, answerVariables[0].length); |
| 398 | // if (soundAnswerTuples.contains(answer)) | 376 | // if (soundAnswerTuples.contains(answer)) |
| 399 | // Utility.logError("The answer (" + answer + ") cannot be added, because it is in the lower bound."); | 377 | // Utility.logError("The answer (" + answer + ") cannot be added, because it is in the lower bound."); |
| 400 | soundAnswerTuples.add(answer); | 378 | soundAnswerTuples.add(answer); |
| @@ -412,7 +390,7 @@ public class QueryRecord { | |||
| 412 | public int getArity() { | 390 | public int getArity() { |
| 413 | return answerVariables[0].length; | 391 | return answerVariables[0].length; |
| 414 | } | 392 | } |
| 415 | 393 | ||
| 416 | public void addRelevantClauses(DLClause clause) { | 394 | public void addRelevantClauses(DLClause clause) { |
| 417 | relevantClauses.add(clause); | 395 | relevantClauses.add(clause); |
| 418 | } | 396 | } |
| @@ -477,10 +455,10 @@ public class QueryRecord { | |||
| 477 | } | 455 | } |
| 478 | 456 | ||
| 479 | public void updateSubID() { | 457 | public void updateSubID() { |
| 480 | ++subID; | 458 | ++subID; |
| 481 | stringQueryID = String.valueOf(queryID) + "_" + subID; | 459 | stringQueryID = String.valueOf(queryID) + "_" + subID; |
| 482 | } | 460 | } |
| 483 | 461 | ||
| 484 | public DLClause getClause() { | 462 | public DLClause getClause() { |
| 485 | if (queryClause != null) | 463 | if (queryClause != null) |
| 486 | return queryClause; | 464 | return queryClause; |
| @@ -498,7 +476,7 @@ public class QueryRecord { | |||
| 498 | public int getSubID() { | 476 | public int getSubID() { |
| 499 | return subID; | 477 | return subID; |
| 500 | } | 478 | } |
| 501 | 479 | ||
| 502 | public boolean hasSameGapAnswers(QueryRecord that) { | 480 | public boolean hasSameGapAnswers(QueryRecord that) { |
| 503 | return gapAnswerTuples.containsAll(that.gapAnswerTuples) && that.gapAnswerTuples.containsAll(gapAnswerTuples); | 481 | return gapAnswerTuples.containsAll(that.gapAnswerTuples) && that.gapAnswerTuples.containsAll(gapAnswerTuples); |
| 504 | } | 482 | } |
| @@ -539,8 +517,9 @@ public class QueryRecord { | |||
| 539 | return false; | 517 | return false; |
| 540 | } | 518 | } |
| 541 | 519 | ||
| 520 | // TODO remove fully extended query | ||
| 542 | public Tuple<String> getExtendedQueryText() { | 521 | public Tuple<String> getExtendedQueryText() { |
| 543 | // String[] ret = new String[2]; | 522 | // String[] ret = new String[2];s |
| 544 | int index = queryText.toUpperCase().indexOf(" WHERE"); | 523 | int index = queryText.toUpperCase().indexOf(" WHERE"); |
| 545 | String extendedSelect = queryText.substring(0, index); | 524 | String extendedSelect = queryText.substring(0, index); |
| 546 | String extendedWhere= queryText.substring(index + 1), fullyExtendedWhere = queryText.substring(index + 1); | 525 | String extendedWhere= queryText.substring(index + 1), fullyExtendedWhere = queryText.substring(index + 1); |
| @@ -564,10 +543,18 @@ public class QueryRecord { | |||
| 564 | // if (answerVariables[0] != answerVariables[1]) { | 543 | // if (answerVariables[0] != answerVariables[1]) { |
| 565 | for (int i = answerVariables[0].length; i < answerVariables[1].length; ++i) { | 544 | for (int i = answerVariables[0].length; i < answerVariables[1].length; ++i) { |
| 566 | // for (int i = 0; i < answerVariables[1].length; ++i) { | 545 | // for (int i = 0; i < answerVariables[1].length; ++i) { |
| 567 | fullyExtra.append(" . ?").append(answerVariables[1][i]).append(" a <").append(Namespace.PAGODA_ORIGINAL).append(">"); | 546 | fullyExtra.append(" . ?") |
| 547 | .append(answerVariables[1][i]) | ||
| 548 | .append(" " + RDF_TYPE + " <") | ||
| 549 | .append(Namespace.PAGODA_ORIGINAL) | ||
| 550 | .append(">"); | ||
| 568 | if ((list = links.get(answerVariables[1][i])) == null || list.size() < 2) ; | 551 | if ((list = links.get(answerVariables[1][i])) == null || list.size() < 2) ; |
| 569 | else { | 552 | else { |
| 570 | extra.append(" . ?").append(answerVariables[1][i]).append(" a <").append(Namespace.PAGODA_ORIGINAL).append(">"); | 553 | extra.append(" . ?") |
| 554 | .append(answerVariables[1][i]) | ||
| 555 | .append(" " + RDF_TYPE + " <") | ||
| 556 | .append(Namespace.PAGODA_ORIGINAL) | ||
| 557 | .append(">"); | ||
| 571 | } | 558 | } |
| 572 | } | 559 | } |
| 573 | 560 | ||
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java index 2a49e24..cc0e647 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java | |||
| @@ -208,14 +208,10 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 208 | private boolean queryUpperStore(BasicQueryEngine upperStore, QueryRecord queryRecord, | 208 | private boolean queryUpperStore(BasicQueryEngine upperStore, QueryRecord queryRecord, |
| 209 | Tuple<String> extendedQuery, Step step) { | 209 | Tuple<String> extendedQuery, Step step) { |
| 210 | 210 | ||
| 211 | queryUpperBound(upperStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables()); | 211 | if(queryRecord.hasNonAnsDistinguishedVariables()) |
| 212 | 212 | queryUpperBound(upperStore, queryRecord, extendedQuery.get(0), queryRecord.getAnswerVariables()); | |
| 213 | if(queryRecord.hasNonAnsDistinguishedVariables()) { | 213 | else |
| 214 | if(!queryRecord.processed()) | 214 | queryUpperBound(upperStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables()); |
| 215 | queryUpperBound(upperStore, queryRecord, extendedQuery.get(0), queryRecord.getAnswerVariables()); | ||
| 216 | if(!queryRecord.processed()) | ||
| 217 | queryUpperBound(upperStore, queryRecord, extendedQuery.get(1), queryRecord.getDistinguishedVariables()); | ||
| 218 | } | ||
| 219 | 215 | ||
| 220 | queryRecord.addProcessingTime(step, t.duration()); | 216 | queryRecord.addProcessingTime(step, t.duration()); |
| 221 | if(queryRecord.processed()) { | 217 | if(queryRecord.processed()) { |
| @@ -245,28 +241,23 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 245 | 241 | ||
| 246 | Tuple<String> extendedQueryTexts = queryRecord.getExtendedQueryText(); | 242 | Tuple<String> extendedQueryTexts = queryRecord.getExtendedQueryText(); |
| 247 | 243 | ||
| 248 | // BasicQueryEngine upperStore; | 244 | Utility.logDebug("Tracking store"); |
| 249 | // if(queryRecord.isBottom()) upperStore = trackingStore; | ||
| 250 | // upperStore = queryRecord.isBottom() || lazyUpperStore == null ? trackingStore : lazyUpperStore; | ||
| 251 | |||
| 252 | // TODO | ||
| 253 | // if(queryRecord.isBottom() || (lazyUpperStore == null && limitedSkolemUpperStore == null)) | ||
| 254 | // queryUpperStore(trackingStore, queryRecord, extendedQueryTexts); | ||
| 255 | // else { | ||
| 256 | |||
| 257 | if(queryUpperStore(trackingStore, queryRecord, extendedQueryTexts, Step.SIMPLE_UPPER_BOUND)) | 245 | if(queryUpperStore(trackingStore, queryRecord, extendedQueryTexts, Step.SIMPLE_UPPER_BOUND)) |
| 258 | return null; | 246 | return null; |
| 259 | 247 | ||
| 260 | if(!queryRecord.isBottom()) { | 248 | if(!queryRecord.isBottom()) { |
| 249 | Utility.logDebug("Lazy store"); | ||
| 261 | if(lazyUpperStore != null && queryUpperStore(lazyUpperStore, queryRecord, extendedQueryTexts, Step.LAZY_UPPER_BOUND)) | 250 | if(lazyUpperStore != null && queryUpperStore(lazyUpperStore, queryRecord, extendedQueryTexts, Step.LAZY_UPPER_BOUND)) |
| 262 | return null; | 251 | return null; |
| 252 | Utility.logDebug("Skolem store"); | ||
| 263 | if(limitedSkolemUpperStore != null && queryUpperStore(limitedSkolemUpperStore, queryRecord, extendedQueryTexts, Step.L_SKOLEM_UPPER_BOUND)) | 253 | if(limitedSkolemUpperStore != null && queryUpperStore(limitedSkolemUpperStore, queryRecord, extendedQueryTexts, Step.L_SKOLEM_UPPER_BOUND)) |
| 264 | return null; | 254 | return null; |
| 265 | } | 255 | } |
| 266 | 256 | ||
| 267 | t.reset(); | 257 | t.reset(); |
| 268 | try { | 258 | try { |
| 269 | elAnswer = elLowerStore.evaluate(extendedQueryTexts.get(0), queryRecord.getAnswerVariables(), | 259 | elAnswer = elLowerStore.evaluate(extendedQueryTexts.get(0), |
| 260 | queryRecord.getAnswerVariables(), | ||
| 270 | queryRecord.getLowerBoundAnswers()); | 261 | queryRecord.getLowerBoundAnswers()); |
| 271 | Utility.logDebug(t.duration()); | 262 | Utility.logDebug(t.duration()); |
| 272 | queryRecord.updateLowerBoundAnswers(elAnswer); | 263 | queryRecord.updateLowerBoundAnswers(elAnswer); |
