aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java93
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;
29class MyQueryReasoner extends QueryReasoner { 29class 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}