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 | 93 |
1 files changed, 61 insertions, 32 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java index acdb8a3..b4e2f5a 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java | |||
| @@ -29,20 +29,22 @@ import java.util.Collection; | |||
| 29 | class MyQueryReasoner extends QueryReasoner { | 29 | class MyQueryReasoner extends QueryReasoner { |
| 30 | 30 | ||
| 31 | OWLOntology ontology; | 31 | OWLOntology ontology; |
| 32 | OWLOntology elho_ontology; | ||
| 32 | DatalogProgram program; | 33 | DatalogProgram program; |
| 33 | 34 | ||
| 34 | BasicQueryEngine rlLowerStore = null; | 35 | BasicQueryEngine rlLowerStore = null; |
| 35 | BasicQueryEngine lazyUpperStore = null; | ||
| 36 | // MultiStageQueryEngine limitedSkolemUpperStore; | ||
| 37 | OWLOntology elho_ontology; | ||
| 38 | KarmaQueryEngine elLowerStore = null; | 36 | KarmaQueryEngine elLowerStore = null; |
| 39 | BasicQueryEngine trackingStore = null; | 37 | MultiStageQueryEngine lazyUpperStore = null; |
| 38 | MultiStageQueryEngine trackingStore = null; | ||
| 40 | TrackingRuleEncoder encoder; | 39 | TrackingRuleEncoder encoder; |
| 40 | |||
| 41 | private boolean equalityTag; | 41 | private boolean equalityTag; |
| 42 | private Timer t = new Timer(); | 42 | private Timer t = new Timer(); |
| 43 | |||
| 43 | private Collection<String> predicatesWithGap = null; | 44 | private Collection<String> predicatesWithGap = null; |
| 44 | private SatisfiabilityStatus satisfiable; | 45 | private ConsistencyStatus isConsistent; |
| 45 | private ConsistencyManager consistency = new ConsistencyManager(this); | 46 | private ConsistencyManager consistency = new ConsistencyManager(this); |
| 47 | private boolean useSkolemisation = false; // now only debugging | ||
| 46 | 48 | ||
| 47 | public MyQueryReasoner() { | 49 | public MyQueryReasoner() { |
| 48 | setup(true); | 50 | setup(true); |
| @@ -92,11 +94,15 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 92 | t.reset(); | 94 | t.reset(); |
| 93 | Utility.logInfo("Preprocessing (and checking satisfiability)..."); | 95 | Utility.logInfo("Preprocessing (and checking satisfiability)..."); |
| 94 | 96 | ||
| 95 | String name = "data", datafile = importedData.toString(); | 97 | String name = "data", datafile = getImportedData(); |
| 96 | rlLowerStore.importRDFData(name, datafile); | 98 | rlLowerStore.importRDFData(name, datafile); |
| 97 | rlLowerStore.materialise("lower program", program.getLower().toString()); | 99 | rlLowerStore.materialise("lower program", program.getLower().toString()); |
| 98 | // program.getLower().save(); | 100 | // program.getLower().save(); |
| 99 | if(!consistency.checkRLLowerBound()) return false; | 101 | if(!consistency.checkRLLowerBound()) { |
| 102 | Utility.logDebug("time for satisfiability checking: " + t.duration()); | ||
| 103 | isConsistent = ConsistencyStatus.INCONSISTENT; | ||
| 104 | return false; | ||
| 105 | } | ||
| 100 | Utility.logDebug("The number of sameAs assertions in RL lower store: " + rlLowerStore.getSameAsNumber()); | 106 | Utility.logDebug("The number of sameAs assertions in RL lower store: " + rlLowerStore.getSameAsNumber()); |
| 101 | 107 | ||
| 102 | String originalMarkProgram = OWLHelper.getOriginalMarkProgram(ontology); | 108 | String originalMarkProgram = OWLHelper.getOriginalMarkProgram(ontology); |
| @@ -105,20 +111,28 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 105 | elLowerStore.materialise("saturate named individuals", originalMarkProgram); | 111 | elLowerStore.materialise("saturate named individuals", originalMarkProgram); |
| 106 | elLowerStore.materialise("lower program", program.getLower().toString()); | 112 | elLowerStore.materialise("lower program", program.getLower().toString()); |
| 107 | elLowerStore.initialiseKarma(); | 113 | elLowerStore.initialiseKarma(); |
| 108 | if(!consistency.checkELLowerBound()) return false; | 114 | if(!consistency.checkELLowerBound()) { |
| 115 | Utility.logDebug("time for satisfiability checking: " + t.duration()); | ||
| 116 | isConsistent = ConsistencyStatus.INCONSISTENT; | ||
| 117 | return false; | ||
| 118 | } | ||
| 109 | 119 | ||
| 110 | if(lazyUpperStore != null) { | 120 | if(lazyUpperStore != null) { |
| 111 | lazyUpperStore.importRDFData(name, datafile); | 121 | lazyUpperStore.importRDFData(name, datafile); |
| 112 | lazyUpperStore.materialise("saturate named individuals", originalMarkProgram); | 122 | lazyUpperStore.materialise("saturate named individuals", originalMarkProgram); |
| 113 | int tag = lazyUpperStore.materialiseRestrictedly(program, null); | 123 | int tag = lazyUpperStore.materialiseRestrictedly(program, null); |
| 114 | if(tag != 1) { | 124 | if(tag == -1) { |
| 125 | Utility.logDebug("time for satisfiability checking: " + t.duration()); | ||
| 126 | isConsistent = ConsistencyStatus.INCONSISTENT; | ||
| 127 | return false; | ||
| 128 | } | ||
| 129 | else if(tag != 1) { | ||
| 115 | lazyUpperStore.dispose(); | 130 | lazyUpperStore.dispose(); |
| 116 | lazyUpperStore = null; | 131 | lazyUpperStore = null; |
| 117 | } | 132 | } |
| 118 | if(tag == -1) return false; | ||
| 119 | } | 133 | } |
| 120 | if(consistency.checkUpper(lazyUpperStore)) { | 134 | if(consistency.checkUpper(lazyUpperStore)) { |
| 121 | satisfiable = SatisfiabilityStatus.SATISFIABLE; | 135 | isConsistent = ConsistencyStatus.CONSISTENT; |
| 122 | Utility.logDebug("time for satisfiability checking: " + t.duration()); | 136 | Utility.logDebug("time for satisfiability checking: " + t.duration()); |
| 123 | } | 137 | } |
| 124 | 138 | ||
| @@ -140,13 +154,12 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 140 | // encoder = new TrackingRuleEncoderDisjVar2(program.getUpper(), trackingStore); | 154 | // encoder = new TrackingRuleEncoderDisjVar2(program.getUpper(), trackingStore); |
| 141 | // encoder = new TrackingRuleEncoderDisj2(program.getUpper(), trackingStore); | 155 | // encoder = new TrackingRuleEncoderDisj2(program.getUpper(), trackingStore); |
| 142 | 156 | ||
| 157 | // TODO add consistency check by Skolem-upper-bound | ||
| 158 | |||
| 143 | if(!isConsistent()) | 159 | if(!isConsistent()) |
| 144 | return false; | 160 | return false; |
| 145 | 161 | ||
| 146 | consistency.extractBottomFragment(); | 162 | consistency.extractBottomFragment(); |
| 147 | consistency.dispose(); | ||
| 148 | |||
| 149 | program.dispose(); | ||
| 150 | 163 | ||
| 151 | return true; | 164 | return true; |
| 152 | } | 165 | } |
| @@ -154,11 +167,19 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 154 | @Override | 167 | @Override |
| 155 | public boolean isConsistent() { | 168 | public boolean isConsistent() { |
| 156 | if(isDisposed()) throw new DisposedException(); | 169 | if(isDisposed()) throw new DisposedException(); |
| 157 | if(satisfiable == SatisfiabilityStatus.UNCHECKED) { | 170 | |
| 158 | satisfiable = consistency.check() ? SatisfiabilityStatus.SATISFIABLE : SatisfiabilityStatus.UNSATISFIABLE; | 171 | if(isConsistent == ConsistencyStatus.UNCHECKED) { |
| 159 | Utility.logInfo("time for satisfiability checking: " + t.duration()); | 172 | isConsistent = consistency.check() ? ConsistencyStatus.CONSISTENT : ConsistencyStatus.INCONSISTENT; |
| 173 | Utility.logDebug("time for satisfiability checking: " + t.duration()); | ||
| 174 | } | ||
| 175 | if(isConsistent == ConsistencyStatus.CONSISTENT) { | ||
| 176 | Utility.logInfo("The ontology is consistent!"); | ||
| 177 | return true; | ||
| 178 | } | ||
| 179 | else { | ||
| 180 | Utility.logInfo("The ontology is inconsistent!"); | ||
| 181 | return false; | ||
| 160 | } | 182 | } |
| 161 | return satisfiable == SatisfiabilityStatus.SATISFIABLE; | ||
| 162 | } | 183 | } |
| 163 | 184 | ||
| 164 | @Override | 185 | @Override |
| @@ -169,9 +190,9 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 169 | return; | 190 | return; |
| 170 | 191 | ||
| 171 | OWLOntology relevantOntologySubset = extractRelevantOntologySubset(queryRecord); | 192 | OWLOntology relevantOntologySubset = extractRelevantOntologySubset(queryRecord); |
| 172 | // queryRecord.saveRelevantOntology("fragment_query" + queryRecord.getQueryID() + ".owl"); | 193 | queryRecord.saveRelevantOntology("/home/alessandro/Desktop/fragment_query" + queryRecord.getQueryID() + ".owl"); |
| 173 | 194 | ||
| 174 | if(querySkolemisedRelevantSubset(relevantOntologySubset, queryRecord)) | 195 | if(useSkolemisation && querySkolemisedRelevantSubset(relevantOntologySubset, queryRecord)) |
| 175 | return; | 196 | return; |
| 176 | 197 | ||
| 177 | Timer t = new Timer(); | 198 | Timer t = new Timer(); |
| @@ -207,12 +228,14 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 207 | if(lazyUpperStore != null) lazyUpperStore.dispose(); | 228 | if(lazyUpperStore != null) lazyUpperStore.dispose(); |
| 208 | if(elLowerStore != null) elLowerStore.dispose(); | 229 | if(elLowerStore != null) elLowerStore.dispose(); |
| 209 | if(trackingStore != null) trackingStore.dispose(); | 230 | if(trackingStore != null) trackingStore.dispose(); |
| 210 | // if(limitedSkolemUpperStore != null) limitedSkolemUpperStore.dispose(); | 231 | if(consistency != null) consistency.dispose(); |
| 232 | if(program != null) program.dispose(); | ||
| 211 | } | 233 | } |
| 212 | 234 | ||
| 213 | private void setup(boolean considerEqualities) { | 235 | private void setup(boolean considerEqualities) { |
| 214 | if(isDisposed()) throw new DisposedException(); | 236 | if(isDisposed()) throw new DisposedException(); |
| 215 | satisfiable = SatisfiabilityStatus.UNCHECKED; | 237 | |
| 238 | isConsistent = ConsistencyStatus.UNCHECKED; | ||
| 216 | this.equalityTag = considerEqualities; | 239 | this.equalityTag = considerEqualities; |
| 217 | 240 | ||
| 218 | rlLowerStore = new BasicQueryEngine("rl-lower-bound"); | 241 | rlLowerStore = new BasicQueryEngine("rl-lower-bound"); |
| @@ -239,7 +262,7 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 239 | */ | 262 | */ |
| 240 | private boolean queryUpperStore(BasicQueryEngine upperStore, QueryRecord queryRecord, | 263 | private boolean queryUpperStore(BasicQueryEngine upperStore, QueryRecord queryRecord, |
| 241 | Tuple<String> extendedQuery, Step step) { | 264 | Tuple<String> extendedQuery, Step step) { |
| 242 | 265 | t.reset(); | |
| 243 | if(queryRecord.hasNonAnsDistinguishedVariables()) | 266 | if(queryRecord.hasNonAnsDistinguishedVariables()) |
| 244 | queryUpperBound(upperStore, queryRecord, extendedQuery.get(0), queryRecord.getAnswerVariables()); | 267 | queryUpperBound(upperStore, queryRecord, extendedQuery.get(0), queryRecord.getAnswerVariables()); |
| 245 | else | 268 | else |
| @@ -254,6 +277,7 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 254 | } | 277 | } |
| 255 | 278 | ||
| 256 | private boolean checkGapAnswers(BasicQueryEngine relevantStore, QueryRecord queryRecord) { | 279 | private boolean checkGapAnswers(BasicQueryEngine relevantStore, QueryRecord queryRecord) { |
| 280 | t.reset(); | ||
| 257 | Tuple<String> extendedQueries = queryRecord.getExtendedQueryText(); | 281 | Tuple<String> extendedQueries = queryRecord.getExtendedQueryText(); |
| 258 | if(queryRecord.hasNonAnsDistinguishedVariables()) | 282 | if(queryRecord.hasNonAnsDistinguishedVariables()) |
| 259 | checkGapAnswers(relevantStore, queryRecord, extendedQueries.get(0), queryRecord.getAnswerVariables()); | 283 | checkGapAnswers(relevantStore, queryRecord, extendedQueries.get(0), queryRecord.getAnswerVariables()); |
| @@ -296,8 +320,6 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 296 | } | 320 | } |
| 297 | queryRecord.addProcessingTime(Step.LOWER_BOUND, t.duration()); | 321 | queryRecord.addProcessingTime(Step.LOWER_BOUND, t.duration()); |
| 298 | 322 | ||
| 299 | t.reset(); | ||
| 300 | |||
| 301 | Tuple<String> extendedQueryTexts = queryRecord.getExtendedQueryText(); | 323 | Tuple<String> extendedQueryTexts = queryRecord.getExtendedQueryText(); |
| 302 | 324 | ||
| 303 | Utility.logDebug("Tracking store"); | 325 | Utility.logDebug("Tracking store"); |
| @@ -343,8 +365,6 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 343 | // just statistics | 365 | // just statistics |
| 344 | int numOfABoxAxioms = relevantOntologySubset.getABoxAxioms(true).size(); | 366 | int numOfABoxAxioms = relevantOntologySubset.getABoxAxioms(true).size(); |
| 345 | int numOfTBoxAxioms = relevantOntologySubset.getAxiomCount() - numOfABoxAxioms; | 367 | int numOfTBoxAxioms = relevantOntologySubset.getAxiomCount() - numOfABoxAxioms; |
| 346 | int originalNumOfABoxAxioms = ontology.getABoxAxioms(true).size(); | ||
| 347 | int originalNumOfTBoxAxioms = ontology.getAxiomCount() - originalNumOfABoxAxioms; | ||
| 348 | Utility.logInfo("Relevant ontology-subset has been extracted: |ABox|=" | 368 | Utility.logInfo("Relevant ontology-subset has been extracted: |ABox|=" |
| 349 | + numOfABoxAxioms + ", |TBox|=" + numOfTBoxAxioms); | 369 | + numOfABoxAxioms + ", |TBox|=" + numOfTBoxAxioms); |
| 350 | 370 | ||
| @@ -365,6 +385,7 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 365 | 385 | ||
| 366 | private boolean querySkolemisedRelevantSubset(OWLOntology relevantSubset, QueryRecord queryRecord) { | 386 | private boolean querySkolemisedRelevantSubset(OWLOntology relevantSubset, QueryRecord queryRecord) { |
| 367 | Utility.logInfo("Evaluating semi-Skolemised relevant upper store..."); | 387 | Utility.logInfo("Evaluating semi-Skolemised relevant upper store..."); |
| 388 | t.reset(); | ||
| 368 | 389 | ||
| 369 | DatalogProgram relevantProgram = new DatalogProgram(relevantSubset, false); // toClassify is false | 390 | DatalogProgram relevantProgram = new DatalogProgram(relevantSubset, false); // toClassify is false |
| 370 | 391 | ||
| @@ -373,16 +394,24 @@ class MyQueryReasoner extends QueryReasoner { | |||
| 373 | 394 | ||
| 374 | relevantStore.importDataFromABoxOf(relevantSubset); | 395 | relevantStore.importDataFromABoxOf(relevantSubset); |
| 375 | 396 | ||
| 376 | int materialisationResult = relevantStore.materialiseSkolemly(relevantProgram, null); | 397 | int queryDependentMaxTermDepth = 1; // TODO make it dynamic |
| 377 | if(materialisationResult != 1) | 398 | int materialisationTag = relevantStore.materialiseSkolemly(relevantProgram, null, |
| 378 | throw new RuntimeException("Skolemised materialisation error"); // TODO check consistency | 399 | queryDependentMaxTermDepth); |
| 400 | queryRecord.addProcessingTime(Step.L_SKOLEM_UPPER_BOUND, t.duration()); | ||
| 401 | if(materialisationTag == -1) { | ||
| 402 | throw new Error("A consistent ontology has turned out to be " + | ||
| 403 | "inconsistent in the Skolemises-relevant-upper-store"); | ||
| 404 | } | ||
| 405 | else if(materialisationTag != 1) { | ||
| 406 | Utility.logInfo("Semi-Skolemised relevant upper store cannot be employed"); | ||
| 407 | return false; | ||
| 408 | } | ||
| 379 | 409 | ||
| 380 | boolean isFullyProcessed = checkGapAnswers(relevantStore, queryRecord); | 410 | boolean isFullyProcessed = checkGapAnswers(relevantStore, queryRecord); |
| 381 | |||
| 382 | Utility.logInfo("Semi-Skolemised relevant upper store has been evaluated"); | 411 | Utility.logInfo("Semi-Skolemised relevant upper store has been evaluated"); |
| 383 | return isFullyProcessed; | 412 | return isFullyProcessed; |
| 384 | } | 413 | } |
| 385 | 414 | ||
| 386 | enum SatisfiabilityStatus {SATISFIABLE, UNSATISFIABLE, UNCHECKED} | 415 | private enum ConsistencyStatus {CONSISTENT, INCONSISTENT, UNCHECKED} |
| 387 | 416 | ||
| 388 | } | 417 | } |
