aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
diff options
context:
space:
mode:
authoryzhou <yujiao.zhou@gmail.com>2015-04-21 10:34:27 +0100
committeryzhou <yujiao.zhou@gmail.com>2015-04-21 10:34:27 +0100
commit9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8 (patch)
tree47511c0fb89dccff0db4b5990522e04f294d795b /src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
parentb1ac207612ee8b045244253fb94b866104bc34f2 (diff)
downloadACQuA-9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8.tar.gz
ACQuA-9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8.zip
initial version
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java331
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 @@
1package uk.ac.ox.cs.pagoda.reasoner;
2
3import java.util.Collection;
4
5import org.semanticweb.karma2.profile.ELHOProfile;
6import org.semanticweb.owlapi.model.OWLOntology;
7
8import uk.ac.ox.cs.pagoda.multistage.*;
9import uk.ac.ox.cs.pagoda.owl.EqualitiesEliminator;
10import uk.ac.ox.cs.pagoda.owl.OWLHelper;
11import uk.ac.ox.cs.pagoda.query.*;
12import uk.ac.ox.cs.pagoda.query.QueryRecord.Step;
13import uk.ac.ox.cs.pagoda.reasoner.full.Checker;
14import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine;
15import uk.ac.ox.cs.pagoda.reasoner.light.KarmaQueryEngine;
16import uk.ac.ox.cs.pagoda.rules.DatalogProgram;
17import uk.ac.ox.cs.pagoda.summary.HermitSummaryFilter;
18import uk.ac.ox.cs.pagoda.tracking.*;
19import uk.ac.ox.cs.pagoda.util.Timer;
20import uk.ac.ox.cs.pagoda.util.Utility;
21
22public 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}