aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java199
1 files changed, 0 insertions, 199 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java
deleted file mode 100644
index 15dfa03..0000000
--- a/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java
+++ /dev/null
@@ -1,199 +0,0 @@
1package uk.ac.ox.cs.pagoda.reasoner;
2
3import org.semanticweb.karma2.profile.ELHOProfile;
4import org.semanticweb.owlapi.model.OWLOntology;
5import uk.ac.ox.cs.pagoda.multistage.MultiStageQueryEngine;
6import uk.ac.ox.cs.pagoda.owl.EqualitiesEliminator;
7import uk.ac.ox.cs.pagoda.owl.OWLHelper;
8import uk.ac.ox.cs.pagoda.query.AnswerTuples;
9import uk.ac.ox.cs.pagoda.query.QueryRecord;
10import uk.ac.ox.cs.pagoda.query.QueryRecord.Step;
11import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine;
12import uk.ac.ox.cs.pagoda.reasoner.light.KarmaQueryEngine;
13import uk.ac.ox.cs.pagoda.rules.DatalogProgram;
14import uk.ac.ox.cs.pagoda.util.Timer;
15import uk.ac.ox.cs.pagoda.util.Utility;
16import uk.ac.ox.cs.pagoda.util.disposable.DisposedException;
17
18class ELHOUQueryReasoner extends QueryReasoner {
19
20 DatalogProgram program;
21
22 BasicQueryEngine rlLowerStore;
23 BasicQueryEngine rlUpperStore;
24
25 OWLOntology elho_ontology;
26 KarmaQueryEngine elLowerStore = null;
27
28 boolean multiStageTag, equalityTag;
29 String originalMarkProgram;
30 private Timer t = new Timer();
31
32 public ELHOUQueryReasoner(boolean multiStageTag, boolean considerEqualities) {
33 this.multiStageTag = multiStageTag;
34 this.equalityTag = considerEqualities;
35 rlLowerStore = new BasicQueryEngine("rl-lower-bound");
36 elLowerStore = new KarmaQueryEngine("el-lower-bound");
37
38 if(!multiStageTag)
39 rlUpperStore = new BasicQueryEngine("rl-upper-bound");
40 else
41 rlUpperStore = new MultiStageQueryEngine("rl-upper-bound", false);
42 }
43
44 @Override
45 public void evaluate(QueryRecord queryRecord) {
46 if(isDisposed()) throw new DisposedException();
47 AnswerTuples rlAnswer = null;
48 t.reset();
49 try {
50 rlAnswer = rlLowerStore.evaluate(queryRecord.getQueryText(), queryRecord.getAnswerVariables());
51 queryRecord.updateLowerBoundAnswers(rlAnswer);
52 } finally {
53 if(rlAnswer != null) rlAnswer.dispose();
54 }
55 queryRecord.addProcessingTime(Step.LOWER_BOUND, t.duration());
56
57 String extendedQueryText = queryRecord.getExtendedQueryText().get(0);
58 String[] toQuery = queryRecord.getQueryText().equals(extendedQueryText) ?
59 new String[]{queryRecord.getQueryText()} :
60 new String[]{queryRecord.getQueryText(), extendedQueryText};
61
62 for(String queryText : toQuery) {
63 rlAnswer = null;
64 t.reset();
65 try {
66 rlAnswer = rlUpperStore.evaluate(queryText, queryRecord.getAnswerVariables());
67 queryRecord.updateUpperBoundAnswers(rlAnswer);
68 } finally {
69 if(rlAnswer != null) rlAnswer.dispose();
70 }
71 queryRecord.addProcessingTime(Step.UPPER_BOUND, t.duration());
72
73 if(queryRecord.isProcessed()) {
74 queryRecord.setDifficulty(Step.UPPER_BOUND);
75 return;
76 }
77 }
78
79 AnswerTuples elAnswer = null;
80 t.reset();
81 try {
82 elAnswer =
83 elLowerStore.evaluate(extendedQueryText, queryRecord.getAnswerVariables(), queryRecord.getLowerBoundAnswers());
84 queryRecord.updateLowerBoundAnswers(elAnswer);
85 } finally {
86 if(elAnswer != null) elAnswer.dispose();
87 }
88 queryRecord.addProcessingTime(Step.EL_LOWER_BOUND, t.duration());
89 }
90
91 @Override
92 public void evaluateUpper(QueryRecord queryRecord) {
93 if(isDisposed()) throw new DisposedException();
94 AnswerTuples rlAnswer = null;
95 try {
96 rlAnswer = rlUpperStore.evaluate(queryRecord.getQueryText(), queryRecord.getAnswerVariables());
97 queryRecord.updateUpperBoundAnswers(rlAnswer, true);
98 } finally {
99 if(rlAnswer != null) rlAnswer.dispose();
100 }
101 }
102
103 @Override
104 public void dispose() {
105 super.dispose();
106 if(elLowerStore != null) elLowerStore.dispose();
107 if(rlUpperStore != null) rlUpperStore.dispose();
108 }
109
110 @Override
111 public void loadOntology(OWLOntology o) {
112 if(isDisposed()) throw new DisposedException();
113 if(!equalityTag) {
114 EqualitiesEliminator eliminator = new EqualitiesEliminator(o);
115 o = eliminator.getOutputOntology();
116 eliminator.save();
117 }
118
119 OWLOntology ontology = o;
120 program = new DatalogProgram(ontology);
121
122 importData(program.getAdditionalDataFile());
123
124 elho_ontology = new ELHOProfile().getFragment(ontology);
125 elLowerStore.processOntology(elho_ontology);
126 originalMarkProgram = OWLHelper.getOriginalMarkProgram(ontology);
127 }
128
129 @Override
130 public boolean preprocess() {
131 if(isDisposed()) throw new DisposedException();
132 String name = "data", datafile = getImportedData();
133
134 String lowername = "lower program";
135 String rlLowerProgramText = program.getLower().toString();
136
137 rlUpperStore.importRDFData(name, datafile);
138 rlUpperStore.materialise("saturate named individuals", originalMarkProgram);
139
140 int flag = rlUpperStore.materialiseRestrictedly(program, null);
141 if(flag != 1) {
142 if(flag == -1) return false;
143 rlUpperStore.dispose();
144
145 if(!multiStageTag)
146 rlUpperStore = new BasicQueryEngine("rl-upper-bound");
147 else
148 rlUpperStore = new MultiStageQueryEngine("rl-upper-bound", false);
149 rlUpperStore.importRDFData(name, datafile);
150 rlUpperStore.materialise("saturate named individuals", originalMarkProgram);
151 rlUpperStore.materialiseFoldedly(program, null);
152 }
153 Utility.logInfo("upper store ready.");
154
155 rlLowerStore.importRDFData(name, datafile);
156 rlLowerStore.materialise(lowername, rlLowerProgramText);
157 Utility.logInfo("lower store ready.");
158
159 elLowerStore.importRDFData(name, datafile);
160 elLowerStore.materialise("saturate named individuals", originalMarkProgram);
161 elLowerStore.materialise(lowername, rlLowerProgramText);
162
163 elLowerStore.initialiseKarma();
164 Utility.logInfo("EL lower store ready.");
165
166 if(!isConsistent()) {
167 Utility.logInfo("The dataset is not consistent with the ontology.");
168 return false;
169 }
170 Utility.logInfo("The dataset is consistent.");
171 return true;
172 }
173
174 @Override
175 public boolean isConsistent() {
176 if(isDisposed()) throw new DisposedException();
177 Utility.logInfo("Start checking consistency... ");
178 String[] X = new String[]{"X"};
179 AnswerTuples ans = null;
180 try {
181 ans = rlUpperStore.evaluate(QueryRecord.botQueryText, X);
182 if(!ans.isValid()) return true;
183 } finally {
184 if(ans != null) ans.dispose();
185 }
186
187 ans = null;
188 try {
189 ans = elLowerStore.evaluate(QueryRecord.botQueryText, X);
190 if(ans.isValid()) return false;
191 } finally {
192 if(ans != null) ans.dispose();
193 }
194
195 Utility.logDebug("The consistency of the data has not been determined yet.");
196 return true;
197 }
198
199}