diff options
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java')
| -rw-r--r-- | src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java | 102 |
1 files changed, 59 insertions, 43 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java index dfbcb4d..b10e2d1 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java | |||
| @@ -20,28 +20,25 @@ import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoderDisjVar1; | |||
| 20 | import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoderWithGap; | 20 | import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoderWithGap; |
| 21 | import uk.ac.ox.cs.pagoda.util.Timer; | 21 | import uk.ac.ox.cs.pagoda.util.Timer; |
| 22 | import uk.ac.ox.cs.pagoda.util.Utility; | 22 | import uk.ac.ox.cs.pagoda.util.Utility; |
| 23 | import uk.ac.ox.cs.pagoda.util.tuples.Tuple; | ||
| 23 | 24 | ||
| 24 | import java.util.Collection; | 25 | import java.util.Collection; |
| 25 | import java.util.HashMap; | 26 | import java.util.HashMap; |
| 26 | 27 | ||
| 27 | public class MyQueryReasoner extends QueryReasoner { | 28 | public class MyQueryReasoner extends QueryReasoner { |
| 28 | 29 | ||
| 29 | OWLOntology ontology; | 30 | OWLOntology ontology; |
| 31 | DatalogProgram program; | ||
| 30 | 32 | ||
| 31 | // String additonalDataFile; | 33 | // String additonalDataFile; |
| 32 | |||
| 33 | DatalogProgram program; | ||
| 34 | |||
| 35 | BasicQueryEngine rlLowerStore = null; | 34 | BasicQueryEngine rlLowerStore = null; |
| 36 | BasicQueryEngine lazyUpperStore = null; | 35 | BasicQueryEngine lazyUpperStore = null; |
| 37 | BasicQueryEngine limitedSkolemUpperStore; | 36 | BasicQueryEngine limitedSkolemUpperStore; |
| 38 | // boolean[] namedIndividuals_lazyUpper; | ||
| 39 | |||
| 40 | OWLOntology elho_ontology; | 37 | OWLOntology elho_ontology; |
| 38 | // boolean[] namedIndividuals_lazyUpper; | ||
| 41 | KarmaQueryEngine elLowerStore = null; | 39 | KarmaQueryEngine elLowerStore = null; |
| 42 | |||
| 43 | BasicQueryEngine trackingStore = null; | 40 | BasicQueryEngine trackingStore = null; |
| 44 | // boolean[] namedIndividuals_tracking; | 41 | // boolean[] namedIndividuals_tracking; |
| 45 | TrackingRuleEncoder encoder; | 42 | TrackingRuleEncoder encoder; |
| 46 | private boolean equalityTag; | 43 | private boolean equalityTag; |
| 47 | private boolean multiStageTag; | 44 | private boolean multiStageTag; |
| @@ -53,7 +50,6 @@ public class MyQueryReasoner extends QueryReasoner { | |||
| 53 | public MyQueryReasoner() { | 50 | public MyQueryReasoner() { |
| 54 | setup(true, true); | 51 | setup(true, true); |
| 55 | } | 52 | } |
| 56 | |||
| 57 | public MyQueryReasoner(boolean multiStageTag, boolean considerEqualities) { | 53 | public MyQueryReasoner(boolean multiStageTag, boolean considerEqualities) { |
| 58 | setup(multiStageTag, considerEqualities); | 54 | setup(multiStageTag, considerEqualities); |
| 59 | } | 55 | } |
| @@ -65,7 +61,7 @@ public class MyQueryReasoner extends QueryReasoner { | |||
| 65 | else | 61 | else |
| 66 | return new BasicQueryEngine(name); | 62 | return new BasicQueryEngine(name); |
| 67 | } | 63 | } |
| 68 | 64 | ||
| 69 | public void setup(boolean multiStageTag, boolean considerEqualities) { | 65 | public void setup(boolean multiStageTag, boolean considerEqualities) { |
| 70 | satisfiable = SatisfiabilityStatus.UNCHECKED; | 66 | satisfiable = SatisfiabilityStatus.UNCHECKED; |
| 71 | this.multiStageTag = multiStageTag; | 67 | this.multiStageTag = multiStageTag; |
| @@ -115,7 +111,7 @@ public class MyQueryReasoner extends QueryReasoner { | |||
| 115 | public Collection<String> getPredicatesWithGap() { | 111 | public Collection<String> getPredicatesWithGap() { |
| 116 | return predicatesWithGap; | 112 | return predicatesWithGap; |
| 117 | } | 113 | } |
| 118 | 114 | ||
| 119 | @Override | 115 | @Override |
| 120 | public boolean preprocess() { | 116 | public boolean preprocess() { |
| 121 | t.reset(); | 117 | t.reset(); |
| @@ -192,18 +188,40 @@ public class MyQueryReasoner extends QueryReasoner { | |||
| 192 | 188 | ||
| 193 | return true; | 189 | return true; |
| 194 | } | 190 | } |
| 195 | 191 | ||
| 196 | @Override | 192 | @Override |
| 197 | public boolean isConsistent() { | 193 | public boolean isConsistent() { |
| 198 | if(satisfiable == SatisfiabilityStatus.UNCHECKED) { | 194 | if(satisfiable == SatisfiabilityStatus.UNCHECKED) { |
| 199 | satisfiable = consistency.check() ? SatisfiabilityStatus.SATISFIABLE : SatisfiabilityStatus.UNSATISFIABLE; | 195 | satisfiable = consistency.check() ? SatisfiabilityStatus.SATISFIABLE : SatisfiabilityStatus.UNSATISFIABLE; |
| 200 | Utility.logInfo("time for satisfiability checking: " + t.duration()); | 196 | Utility.logInfo("time for satisfiability checking: " + t.duration()); |
| 201 | } | 197 | } |
| 202 | return satisfiable == SatisfiabilityStatus.SATISFIABLE ? true : false; | 198 | return satisfiable == SatisfiabilityStatus.SATISFIABLE; |
| 199 | } | ||
| 200 | |||
| 201 | // TODO why the following??? | ||
| 202 | private void queryUpperStore(BasicQueryEngine upperStore, QueryRecord queryRecord, Tuple<String> extendedQuery) { | ||
| 203 | |||
| 204 | // Utility.logInfo("1"); | ||
| 205 | // queryUpperBound(upperStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables()); | ||
| 206 | // | ||
| 207 | // boolean conditionA = !queryRecord.processed() && !queryRecord.getQueryText().equals(extendedQuery.get(0)); | ||
| 208 | // boolean conditionB = !queryRecord.processed() && queryRecord.hasNonAnsDistinguishedVariables(); | ||
| 209 | // | ||
| 210 | // if(conditionA ^ conditionB) | ||
| 211 | // throw new Error("It really happened! I thought it was impossible"); | ||
| 212 | // | ||
| 213 | // if (conditionA) { | ||
| 214 | // Utility.logInfo("2"); | ||
| 215 | queryUpperBound(upperStore, queryRecord, extendedQuery.get(0), queryRecord.getAnswerVariables()); | ||
| 216 | // } | ||
| 217 | // if (conditionB) { | ||
| 218 | // Utility.logInfo("3"); | ||
| 219 | // queryUpperBound(upperStore, queryRecord, extendedQuery.get(1), queryRecord.getDistinguishedVariables()); | ||
| 220 | // } | ||
| 203 | } | 221 | } |
| 204 | 222 | ||
| 205 | /** | 223 | /** |
| 206 | * Returns the relevant part of the ontology, while computing the bound answers. | 224 | * Returns the part of the ontology relevant for Hermit, while computing the bound answers. |
| 207 | * */ | 225 | * */ |
| 208 | private OWLOntology relevantPart(QueryRecord queryRecord) { | 226 | private OWLOntology relevantPart(QueryRecord queryRecord) { |
| 209 | AnswerTuples rlAnswer = null, elAnswer = null; | 227 | AnswerTuples rlAnswer = null, elAnswer = null; |
| @@ -219,28 +237,23 @@ public class MyQueryReasoner extends QueryReasoner { | |||
| 219 | queryRecord.addProcessingTime(Step.LowerBound, t.duration()); | 237 | queryRecord.addProcessingTime(Step.LowerBound, t.duration()); |
| 220 | 238 | ||
| 221 | t.reset(); | 239 | t.reset(); |
| 222 | BasicQueryEngine upperStore = queryRecord.isBottom() || lazyUpperStore == null ? trackingStore : lazyUpperStore; | ||
| 223 | 240 | ||
| 224 | String[] extendedQuery = queryRecord.getExtendedQueryText(); | 241 | Tuple<String> extendedQueryTexts = queryRecord.getExtendedQueryText(); |
| 225 | 242 | ||
| 226 | // TODO why the following??? | 243 | // BasicQueryEngine upperStore; |
| 227 | queryUpperBound(upperStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables()); | 244 | // if(queryRecord.isBottom()) upperStore = trackingStore; |
| 245 | // upperStore = queryRecord.isBottom() || lazyUpperStore == null ? trackingStore : lazyUpperStore; | ||
| 228 | 246 | ||
| 229 | if (!queryRecord.processed() && !queryRecord.getQueryText().equals(extendedQuery[0])) { | 247 | // TODO |
| 230 | queryUpperBound(upperStore, queryRecord, extendedQuery[0], queryRecord.getAnswerVariables()); | 248 | // if(queryRecord.isBottom() || (lazyUpperStore == null && limitedSkolemUpperStore == null)) |
| 231 | } | 249 | // queryUpperStore(trackingStore, queryRecord, extendedQueryTexts); |
| 232 | if (!queryRecord.processed() && queryRecord.hasNonAnsDistinguishedVariables()) { | 250 | // else { |
| 233 | queryUpperBound(upperStore, queryRecord, extendedQuery[1], queryRecord.getDistinguishedVariables()); | ||
| 234 | } | ||
| 235 | |||
| 236 | // Utility.logDebug(toJsonKeyValuePair("upperBound", queryRecord)); | ||
| 237 | 251 | ||
| 238 | // TODO test intersection and new upper bound | 252 | queryUpperStore(trackingStore, queryRecord, extendedQueryTexts); |
| 239 | if (!queryRecord.isBottom() && lazyUpperStore != null) { | 253 | if(!(queryRecord.isBottom() || (lazyUpperStore == null && limitedSkolemUpperStore == null))) { |
| 240 | queryUpperBound(trackingStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables()); | 254 | if(lazyUpperStore != null) queryUpperStore(lazyUpperStore, queryRecord, extendedQueryTexts); |
| 241 | } | 255 | if(limitedSkolemUpperStore != null) |
| 242 | if (!queryRecord.isBottom() && limitedSkolemUpperStore != null) { | 256 | queryUpperStore(limitedSkolemUpperStore, queryRecord, extendedQueryTexts); |
| 243 | queryUpperBound(limitedSkolemUpperStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables()); | ||
| 244 | } | 257 | } |
| 245 | 258 | ||
| 246 | queryRecord.addProcessingTime(Step.UpperBound, t.duration()); | 259 | queryRecord.addProcessingTime(Step.UpperBound, t.duration()); |
| @@ -251,7 +264,8 @@ public class MyQueryReasoner extends QueryReasoner { | |||
| 251 | 264 | ||
| 252 | t.reset(); | 265 | t.reset(); |
| 253 | try { | 266 | try { |
| 254 | elAnswer = elLowerStore.evaluate(extendedQuery[0], queryRecord.getAnswerVariables(), queryRecord.getLowerBoundAnswers()); | 267 | elAnswer = elLowerStore.evaluate(extendedQueryTexts.get(0), queryRecord.getAnswerVariables(), |
| 268 | queryRecord.getLowerBoundAnswers()); | ||
| 255 | Utility.logDebug(t.duration()); | 269 | Utility.logDebug(t.duration()); |
| 256 | queryRecord.updateLowerBoundAnswers(elAnswer); | 270 | queryRecord.updateLowerBoundAnswers(elAnswer); |
| 257 | } finally { | 271 | } finally { |
| @@ -268,7 +282,7 @@ public class MyQueryReasoner extends QueryReasoner { | |||
| 268 | 282 | ||
| 269 | QueryTracker tracker = new QueryTracker(encoder, rlLowerStore, queryRecord); | 283 | QueryTracker tracker = new QueryTracker(encoder, rlLowerStore, queryRecord); |
| 270 | 284 | ||
| 271 | OWLOntology knowledgebase; | 285 | OWLOntology knowledgeBase; |
| 272 | t.reset(); | 286 | t.reset(); |
| 273 | // if (program.getGeneral().isHorn()) { | 287 | // if (program.getGeneral().isHorn()) { |
| 274 | // knowledgebase = tracker.extract(lazyUpperStore, consistency.getQueryRecords(), true); | 288 | // knowledgebase = tracker.extract(lazyUpperStore, consistency.getQueryRecords(), true); |
| @@ -276,14 +290,14 @@ public class MyQueryReasoner extends QueryReasoner { | |||
| 276 | // return knowledgebase; | 290 | // return knowledgebase; |
| 277 | // } | 291 | // } |
| 278 | // else { | 292 | // else { |
| 279 | knowledgebase = tracker.extract(trackingStore, consistency.getQueryRecords(), true); | 293 | knowledgeBase = tracker.extract(trackingStore, consistency.getQueryRecords(), true); |
| 280 | queryRecord.addProcessingTime(Step.Fragment, t.duration()); | 294 | queryRecord.addProcessingTime(Step.Fragment, t.duration()); |
| 281 | // } | 295 | // } |
| 282 | 296 | ||
| 283 | if(knowledgebase.isEmpty() || queryRecord.isBottom()) | 297 | if(knowledgeBase.isEmpty() || queryRecord.isBottom()) |
| 284 | return knowledgebase; | 298 | return knowledgeBase; |
| 285 | 299 | ||
| 286 | if(program.getGeneral().isHorn()) return knowledgebase; | 300 | if(program.getGeneral().isHorn()) return knowledgeBase; |
| 287 | 301 | ||
| 288 | // t.reset(); | 302 | // t.reset(); |
| 289 | // if (queryRecord.isHorn() && lazyUpperStore != null) { | 303 | // if (queryRecord.isHorn() && lazyUpperStore != null) { |
| @@ -298,7 +312,7 @@ public class MyQueryReasoner extends QueryReasoner { | |||
| 298 | // if (knowledgebase == null) | 312 | // if (knowledgebase == null) |
| 299 | // queryRecord.setDifficulty(Step.FragmentRefinement); | 313 | // queryRecord.setDifficulty(Step.FragmentRefinement); |
| 300 | 314 | ||
| 301 | return knowledgebase; | 315 | return knowledgeBase; |
| 302 | } | 316 | } |
| 303 | 317 | ||
| 304 | private String toJsonKeyValuePair(String key, Object value) { | 318 | private String toJsonKeyValuePair(String key, Object value) { |
| @@ -307,8 +321,6 @@ public class MyQueryReasoner extends QueryReasoner { | |||
| 307 | return QueryRecord.GsonCreator.getInstance().toJson(map); | 321 | return QueryRecord.GsonCreator.getInstance().toJson(map); |
| 308 | } | 322 | } |
| 309 | 323 | ||
| 310 | // int counter = 0; | ||
| 311 | |||
| 312 | private void queryUpperBound(BasicQueryEngine upperStore, QueryRecord queryRecord, String queryText, String[] answerVariables) { | 324 | private void queryUpperBound(BasicQueryEngine upperStore, QueryRecord queryRecord, String queryText, String[] answerVariables) { |
| 313 | AnswerTuples rlAnswer = null; | 325 | AnswerTuples rlAnswer = null; |
| 314 | try { | 326 | try { |
| @@ -317,11 +329,13 @@ public class MyQueryReasoner extends QueryReasoner { | |||
| 317 | Utility.logDebug(t.duration()); | 329 | Utility.logDebug(t.duration()); |
| 318 | queryRecord.updateUpperBoundAnswers(rlAnswer); | 330 | queryRecord.updateUpperBoundAnswers(rlAnswer); |
| 319 | } finally { | 331 | } finally { |
| 320 | if (rlAnswer != null) rlAnswer.dispose(); | 332 | if(rlAnswer != null) rlAnswer.dispose(); |
| 321 | rlAnswer = null; | 333 | rlAnswer = null; |
| 322 | } | 334 | } |
| 323 | } | 335 | } |
| 324 | 336 | ||
| 337 | // int counter = 0; | ||
| 338 | |||
| 325 | @Override | 339 | @Override |
| 326 | public void evaluate(QueryRecord queryRecord) { | 340 | public void evaluate(QueryRecord queryRecord) { |
| 327 | OWLOntology knowledgeBase = relevantPart(queryRecord); | 341 | OWLOntology knowledgeBase = relevantPart(queryRecord); |
| @@ -349,6 +363,7 @@ public class MyQueryReasoner extends QueryReasoner { | |||
| 349 | 363 | ||
| 350 | @Override | 364 | @Override |
| 351 | public void evaluateUpper(QueryRecord queryRecord) { | 365 | public void evaluateUpper(QueryRecord queryRecord) { |
| 366 | // TODO add new upper store | ||
| 352 | AnswerTuples rlAnswer = null; | 367 | AnswerTuples rlAnswer = null; |
| 353 | boolean useFull = queryRecord.isBottom() || lazyUpperStore == null; | 368 | boolean useFull = queryRecord.isBottom() || lazyUpperStore == null; |
| 354 | try { | 369 | try { |
| @@ -359,7 +374,7 @@ public class MyQueryReasoner extends QueryReasoner { | |||
| 359 | if(rlAnswer != null) rlAnswer.dispose(); | 374 | if(rlAnswer != null) rlAnswer.dispose(); |
| 360 | } | 375 | } |
| 361 | } | 376 | } |
| 362 | 377 | ||
| 363 | @Override | 378 | @Override |
| 364 | public void dispose() { | 379 | public void dispose() { |
| 365 | if (encoder != null) encoder.dispose(); | 380 | if (encoder != null) encoder.dispose(); |
| @@ -367,6 +382,7 @@ public class MyQueryReasoner extends QueryReasoner { | |||
| 367 | if (lazyUpperStore != null) lazyUpperStore.dispose(); | 382 | if (lazyUpperStore != null) lazyUpperStore.dispose(); |
| 368 | if (elLowerStore != null) elLowerStore.dispose(); | 383 | if (elLowerStore != null) elLowerStore.dispose(); |
| 369 | if (trackingStore != null) trackingStore.dispose(); | 384 | if (trackingStore != null) trackingStore.dispose(); |
| 385 | if(limitedSkolemUpperStore != null) limitedSkolemUpperStore.dispose(); | ||
| 370 | super.dispose(); | 386 | super.dispose(); |
| 371 | } | 387 | } |
| 372 | 388 | ||
