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 | 331 |
1 files changed, 331 insertions, 0 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java new file mode 100644 index 0000000..2c2feae --- /dev/null +++ b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java | |||
| @@ -0,0 +1,331 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.reasoner; | ||
| 2 | |||
| 3 | import java.util.Collection; | ||
| 4 | |||
| 5 | import org.semanticweb.karma2.profile.ELHOProfile; | ||
| 6 | import org.semanticweb.owlapi.model.OWLOntology; | ||
| 7 | |||
| 8 | import uk.ac.ox.cs.pagoda.multistage.*; | ||
| 9 | import uk.ac.ox.cs.pagoda.owl.EqualitiesEliminator; | ||
| 10 | import uk.ac.ox.cs.pagoda.owl.OWLHelper; | ||
| 11 | import uk.ac.ox.cs.pagoda.query.*; | ||
| 12 | import uk.ac.ox.cs.pagoda.query.QueryRecord.Step; | ||
| 13 | import uk.ac.ox.cs.pagoda.reasoner.full.Checker; | ||
| 14 | import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine; | ||
| 15 | import uk.ac.ox.cs.pagoda.reasoner.light.KarmaQueryEngine; | ||
| 16 | import uk.ac.ox.cs.pagoda.rules.DatalogProgram; | ||
| 17 | import uk.ac.ox.cs.pagoda.summary.HermitSummaryFilter; | ||
| 18 | import uk.ac.ox.cs.pagoda.tracking.*; | ||
| 19 | import uk.ac.ox.cs.pagoda.util.Timer; | ||
| 20 | import uk.ac.ox.cs.pagoda.util.Utility; | ||
| 21 | |||
| 22 | public class MyQueryReasoner extends QueryReasoner { | ||
| 23 | |||
| 24 | OWLOntology ontology; | ||
| 25 | |||
| 26 | // String additonalDataFile; | ||
| 27 | |||
| 28 | DatalogProgram program; | ||
| 29 | |||
| 30 | BasicQueryEngine rlLowerStore = null; | ||
| 31 | BasicQueryEngine lazyUpperStore = null; | ||
| 32 | // boolean[] namedIndividuals_lazyUpper; | ||
| 33 | |||
| 34 | OWLOntology elho_ontology; | ||
| 35 | KarmaQueryEngine elLowerStore = null; | ||
| 36 | |||
| 37 | BasicQueryEngine trackingStore = null; | ||
| 38 | // boolean[] namedIndividuals_tracking; | ||
| 39 | |||
| 40 | boolean equalityTag; | ||
| 41 | boolean multiStageTag; | ||
| 42 | |||
| 43 | public MyQueryReasoner() { | ||
| 44 | setup(true, true); | ||
| 45 | } | ||
| 46 | |||
| 47 | public MyQueryReasoner(boolean multiStageTag, boolean considerEqualities) { | ||
| 48 | setup(multiStageTag, considerEqualities); | ||
| 49 | } | ||
| 50 | |||
| 51 | private BasicQueryEngine getUpperStore(String name, boolean checkValidity) { | ||
| 52 | if (multiStageTag) | ||
| 53 | return new MultiStageQueryEngine(name, checkValidity); | ||
| 54 | // return new TwoStageQueryEngine(name, checkValidity); | ||
| 55 | else | ||
| 56 | return new BasicQueryEngine(name); | ||
| 57 | } | ||
| 58 | |||
| 59 | public void setup(boolean multiStageTag, boolean considerEqualities) { | ||
| 60 | satisfiable = null; | ||
| 61 | this.multiStageTag = multiStageTag; | ||
| 62 | this.equalityTag = considerEqualities; | ||
| 63 | |||
| 64 | rlLowerStore = new BasicQueryEngine("rl-lower-bound"); | ||
| 65 | elLowerStore = new KarmaQueryEngine("elho-lower-bound"); | ||
| 66 | |||
| 67 | trackingStore = getUpperStore("tracking", false); | ||
| 68 | } | ||
| 69 | |||
| 70 | protected void internal_importDataFile(String name, String datafile) { | ||
| 71 | // addDataFile(datafile); | ||
| 72 | rlLowerStore.importRDFData(name, datafile); | ||
| 73 | if (lazyUpperStore != null) | ||
| 74 | lazyUpperStore.importRDFData(name, datafile); | ||
| 75 | elLowerStore.importRDFData(name, datafile); | ||
| 76 | trackingStore.importRDFData(name, datafile); | ||
| 77 | } | ||
| 78 | |||
| 79 | @Override | ||
| 80 | public void loadOntology(OWLOntology o) { | ||
| 81 | if (!equalityTag) { | ||
| 82 | EqualitiesEliminator eliminator = new EqualitiesEliminator(o); | ||
| 83 | o = eliminator.getOutputOntology(); | ||
| 84 | eliminator.save(); | ||
| 85 | } | ||
| 86 | |||
| 87 | ontology = o; | ||
| 88 | program = new DatalogProgram(ontology, !forSemFacet); | ||
| 89 | // program.getLower().save(); | ||
| 90 | // program.getUpper().save(); | ||
| 91 | // program.getGeneral().save(); | ||
| 92 | |||
| 93 | if (multiStageTag && !program.getGeneral().isHorn()) { | ||
| 94 | lazyUpperStore = getUpperStore("lazy-upper-bound", true); // new MultiStageQueryEngine("lazy-upper-bound", true); // | ||
| 95 | } | ||
| 96 | |||
| 97 | importData(program.getAdditionalDataFile()); | ||
| 98 | |||
| 99 | elho_ontology = new ELHOProfile().getFragment(ontology); | ||
| 100 | elLowerStore.processOntology(elho_ontology); | ||
| 101 | } | ||
| 102 | |||
| 103 | private Collection<String> predicatesWithGap = null; | ||
| 104 | |||
| 105 | public Collection<String> getPredicatesWithGap() { | ||
| 106 | return predicatesWithGap; | ||
| 107 | } | ||
| 108 | |||
| 109 | @Override | ||
| 110 | public boolean preprocess() { | ||
| 111 | t.reset(); | ||
| 112 | Utility.logInfo("Preprocessing ... checking satisfiability ... "); | ||
| 113 | |||
| 114 | String name = "data", datafile = importedData.toString(); | ||
| 115 | rlLowerStore.importRDFData(name, datafile); | ||
| 116 | rlLowerStore.materialise("lower program", program.getLower().toString()); | ||
| 117 | // program.getLower().save(); | ||
| 118 | if (!consistency.checkRLLowerBound()) return false; | ||
| 119 | Utility.logInfo("The number of sameAs assertions in RL lower store: " + rlLowerStore.getSameAsNumber()); | ||
| 120 | |||
| 121 | String originalMarkProgram = OWLHelper.getOriginalMarkProgram(ontology); | ||
| 122 | |||
| 123 | elLowerStore.importRDFData(name, datafile); | ||
| 124 | elLowerStore.materialise("saturate named individuals", originalMarkProgram); | ||
| 125 | elLowerStore.materialise("lower program", program.getLower().toString()); | ||
| 126 | elLowerStore.initialiseKarma(); | ||
| 127 | if (!consistency.checkELLowerBound()) return false; | ||
| 128 | |||
| 129 | if (lazyUpperStore != null) { | ||
| 130 | lazyUpperStore.importRDFData(name, datafile); | ||
| 131 | lazyUpperStore.materialise("saturate named individuals", originalMarkProgram); | ||
| 132 | int tag = lazyUpperStore.materialiseRestrictedly(program, null); | ||
| 133 | if (tag != 1) { | ||
| 134 | lazyUpperStore.dispose(); | ||
| 135 | lazyUpperStore = null; | ||
| 136 | } | ||
| 137 | if (tag == -1) return false; | ||
| 138 | } | ||
| 139 | if (consistency.checkLazyUpper()) { | ||
| 140 | satisfiable = true; | ||
| 141 | Utility.logInfo("time for satisfiability checking: " + t.duration()); | ||
| 142 | } | ||
| 143 | |||
| 144 | trackingStore.importRDFData(name, datafile); | ||
| 145 | trackingStore.materialise("saturate named individuals", originalMarkProgram); | ||
| 146 | |||
| 147 | // materialiseFullUpper(); | ||
| 148 | GapByStore4ID gap = new GapByStore4ID(trackingStore); | ||
| 149 | trackingStore.materialiseFoldedly(program, gap); | ||
| 150 | predicatesWithGap = gap.getPredicatesWithGap(); | ||
| 151 | gap.clear(); | ||
| 152 | |||
| 153 | if (program.getGeneral().isHorn()) | ||
| 154 | encoder = new TrackingRuleEncoderWithGap(program.getUpper(), trackingStore); | ||
| 155 | else | ||
| 156 | encoder = new TrackingRuleEncoderDisjVar1(program.getUpper(), trackingStore); | ||
| 157 | // encoder = new TrackingRuleEncoderDisj1(program.getUpper(), trackingStore); | ||
| 158 | // encoder = new TrackingRuleEncoderDisjVar2(program.getUpper(), trackingStore); | ||
| 159 | // encoder = new TrackingRuleEncoderDisj2(program.getUpper(), trackingStore); | ||
| 160 | |||
| 161 | program.deleteABoxTurtleFile(); | ||
| 162 | |||
| 163 | if (!isConsistent()) | ||
| 164 | return false; | ||
| 165 | |||
| 166 | consistency.extractBottomFragment(); | ||
| 167 | return true; | ||
| 168 | } | ||
| 169 | |||
| 170 | private Boolean satisfiable; | ||
| 171 | private ConsistencyManager consistency = new ConsistencyManager(this); | ||
| 172 | |||
| 173 | TrackingRuleEncoder encoder; | ||
| 174 | |||
| 175 | @Override | ||
| 176 | public boolean isConsistent() { | ||
| 177 | if (satisfiable == null) { | ||
| 178 | satisfiable = consistency.check(); | ||
| 179 | Utility.logInfo("time for satisfiability checking: " + t.duration()); | ||
| 180 | } | ||
| 181 | return satisfiable; | ||
| 182 | } | ||
| 183 | |||
| 184 | Timer t = new Timer(); | ||
| 185 | |||
| 186 | private OWLOntology relevantPart(QueryRecord queryRecord) { | ||
| 187 | AnswerTuples rlAnswer = null, elAnswer = null; | ||
| 188 | |||
| 189 | t.reset(); | ||
| 190 | try { | ||
| 191 | rlAnswer = rlLowerStore.evaluate(queryRecord.getQueryText(), queryRecord.getAnswerVariables()); | ||
| 192 | Utility.logDebug(t.duration()); | ||
| 193 | queryRecord.updateLowerBoundAnswers(rlAnswer); | ||
| 194 | } finally { | ||
| 195 | if (rlAnswer != null) rlAnswer.dispose(); | ||
| 196 | } | ||
| 197 | queryRecord.addProcessingTime(Step.LowerBound, t.duration()); | ||
| 198 | rlAnswer = null; | ||
| 199 | |||
| 200 | t.reset(); | ||
| 201 | BasicQueryEngine upperStore = queryRecord.isBottom() || lazyUpperStore == null ? trackingStore : lazyUpperStore; | ||
| 202 | |||
| 203 | String[] extendedQuery = queryRecord.getExtendedQueryText(); | ||
| 204 | |||
| 205 | queryUpperBound(upperStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables()); | ||
| 206 | if (!queryRecord.processed() && !queryRecord.getQueryText().equals(extendedQuery[0])) | ||
| 207 | queryUpperBound(upperStore, queryRecord, extendedQuery[0], queryRecord.getAnswerVariables()); | ||
| 208 | if (!queryRecord.processed() && queryRecord.hasNonAnsDistinguishedVariables()) | ||
| 209 | queryUpperBound(upperStore, queryRecord, extendedQuery[1], queryRecord.getDistinguishedVariables()); | ||
| 210 | |||
| 211 | queryRecord.addProcessingTime(Step.UpperBound, t.duration()); | ||
| 212 | if (queryRecord.processed()) { | ||
| 213 | queryRecord.setDifficulty(Step.UpperBound); | ||
| 214 | return null; | ||
| 215 | } | ||
| 216 | |||
| 217 | t.reset(); | ||
| 218 | try { | ||
| 219 | elAnswer = elLowerStore.evaluate(extendedQuery[0], queryRecord.getAnswerVariables(), queryRecord.getLowerBoundAnswers()); | ||
| 220 | Utility.logDebug(t.duration()); | ||
| 221 | queryRecord.updateLowerBoundAnswers(elAnswer); | ||
| 222 | } finally { | ||
| 223 | if (elAnswer != null) elAnswer.dispose(); | ||
| 224 | } | ||
| 225 | queryRecord.addProcessingTime(Step.ELLowerBound, t.duration()); | ||
| 226 | |||
| 227 | if (queryRecord.processed()) { | ||
| 228 | queryRecord.setDifficulty(Step.ELLowerBound); | ||
| 229 | return null; | ||
| 230 | } | ||
| 231 | |||
| 232 | t.reset(); | ||
| 233 | |||
| 234 | QueryTracker tracker = new QueryTracker(encoder, rlLowerStore, queryRecord); | ||
| 235 | |||
| 236 | OWLOntology knowledgebase; | ||
| 237 | t.reset(); | ||
| 238 | // if (program.getGeneral().isHorn()) { | ||
| 239 | // knowledgebase = tracker.extract(lazyUpperStore, consistency.getQueryRecords(), true); | ||
| 240 | // queryRecord.addProcessingTime(Step.Fragment, t.duration()); | ||
| 241 | // return knowledgebase; | ||
| 242 | // } | ||
| 243 | // else { | ||
| 244 | knowledgebase = tracker.extract(trackingStore, consistency.getQueryRecords(), true); | ||
| 245 | queryRecord.addProcessingTime(Step.Fragment, t.duration()); | ||
| 246 | // } | ||
| 247 | |||
| 248 | if (knowledgebase.isEmpty() || queryRecord.isBottom()) | ||
| 249 | return knowledgebase; | ||
| 250 | |||
| 251 | if (program.getGeneral().isHorn()) return knowledgebase; | ||
| 252 | |||
| 253 | // t.reset(); | ||
| 254 | // if (queryRecord.isHorn() && lazyUpperStore != null) { | ||
| 255 | //// knowledgebase = tracker.extract(lazyUpperStore, consistency.getQueryRecords(), true); | ||
| 256 | // } else if (queryRecord.getArity() < 3) { | ||
| 257 | // IterativeRefinement iterativeRefinement = new IterativeRefinement(queryRecord, tracker, trackingStore, consistency.getQueryRecords()); | ||
| 258 | // knowledgebase = iterativeRefinement.extractWithFullABox(importedData.toString(), program.getUpperBottomStrategy()); | ||
| 259 | // } | ||
| 260 | // | ||
| 261 | // queryRecord.addProcessingTime(Step.FragmentRefinement, t.duration()); | ||
| 262 | // | ||
| 263 | // if (knowledgebase == null) | ||
| 264 | // queryRecord.setDifficulty(Step.FragmentRefinement); | ||
| 265 | |||
| 266 | return knowledgebase; | ||
| 267 | } | ||
| 268 | |||
| 269 | // int counter = 0; | ||
| 270 | |||
| 271 | private void queryUpperBound(BasicQueryEngine upperStore, QueryRecord queryRecord, String queryText, String[] answerVariables) { | ||
| 272 | AnswerTuples rlAnswer = null; | ||
| 273 | try { | ||
| 274 | Utility.logDebug(queryText); | ||
| 275 | rlAnswer = upperStore.evaluate(queryText, answerVariables); | ||
| 276 | Utility.logDebug(t.duration()); | ||
| 277 | queryRecord.updateUpperBoundAnswers(rlAnswer); | ||
| 278 | rlAnswer.dispose(); | ||
| 279 | } finally { | ||
| 280 | if (rlAnswer != null) rlAnswer.dispose(); | ||
| 281 | } | ||
| 282 | rlAnswer = null; | ||
| 283 | } | ||
| 284 | |||
| 285 | @Override | ||
| 286 | public void evaluate(QueryRecord queryRecord) { | ||
| 287 | OWLOntology knowledgebase = relevantPart(queryRecord); | ||
| 288 | |||
| 289 | if (knowledgebase == null) { | ||
| 290 | Utility.logDebug("Difficulty of this query: " + queryRecord.getDifficulty()); | ||
| 291 | return ; | ||
| 292 | } | ||
| 293 | |||
| 294 | int aboxcount = knowledgebase.getABoxAxioms(true).size(); | ||
| 295 | Utility.logDebug("ABox axioms: " + aboxcount + " TBox axioms: " + (knowledgebase.getAxiomCount() - aboxcount)); | ||
| 296 | // queryRecord.saveRelevantOntology("fragment_query" + queryRecord.getQueryID() + ".owl"); | ||
| 297 | |||
| 298 | Timer t = new Timer(); | ||
| 299 | Checker summarisedChecker = new HermitSummaryFilter(queryRecord); | ||
| 300 | int validNumber = summarisedChecker.check(queryRecord.getGapAnswers()); | ||
| 301 | summarisedChecker.dispose(); | ||
| 302 | Utility.logDebug("Total time for full reasoner: " + t.duration()); | ||
| 303 | if (!forSemFacet || validNumber == 0) { | ||
| 304 | queryRecord.markAsProcessed(); | ||
| 305 | Utility.logDebug("Difficulty of this query: " + queryRecord.getDifficulty()); | ||
| 306 | } | ||
| 307 | } | ||
| 308 | |||
| 309 | @Override | ||
| 310 | public void evaluateUpper(QueryRecord queryRecord) { | ||
| 311 | AnswerTuples rlAnswer = null; | ||
| 312 | boolean useFull = queryRecord.isBottom() || lazyUpperStore == null; | ||
| 313 | try { | ||
| 314 | rlAnswer = (useFull ? trackingStore: lazyUpperStore).evaluate(queryRecord.getQueryText(), queryRecord.getAnswerVariables()); | ||
| 315 | queryRecord.updateUpperBoundAnswers(rlAnswer, true); | ||
| 316 | } finally { | ||
| 317 | if (rlAnswer != null) rlAnswer.dispose(); | ||
| 318 | } | ||
| 319 | } | ||
| 320 | |||
| 321 | @Override | ||
| 322 | public void dispose() { | ||
| 323 | if (encoder != null) encoder.dispose(); | ||
| 324 | if (rlLowerStore != null) rlLowerStore.dispose(); | ||
| 325 | if (lazyUpperStore != null) lazyUpperStore.dispose(); | ||
| 326 | if (elLowerStore != null) elLowerStore.dispose(); | ||
| 327 | if (trackingStore != null) trackingStore.dispose(); | ||
| 328 | super.dispose(); | ||
| 329 | } | ||
| 330 | |||
| 331 | } | ||
