aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/reasoner/light/BasicQueryEngine.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/reasoner/light/BasicQueryEngine.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/reasoner/light/BasicQueryEngine.java181
1 files changed, 95 insertions, 86 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/light/BasicQueryEngine.java b/src/uk/ac/ox/cs/pagoda/reasoner/light/BasicQueryEngine.java
index 9aa6235..79be8aa 100644
--- a/src/uk/ac/ox/cs/pagoda/reasoner/light/BasicQueryEngine.java
+++ b/src/uk/ac/ox/cs/pagoda/reasoner/light/BasicQueryEngine.java
@@ -1,36 +1,42 @@
1package uk.ac.ox.cs.pagoda.reasoner.light; 1package uk.ac.ox.cs.pagoda.reasoner.light;
2 2
3import java.util.Arrays;
4import java.util.Collection;
5import java.util.HashSet;
6import java.util.Iterator;
7import java.util.Set;
8
3import org.semanticweb.HermiT.model.DLClause; 9import org.semanticweb.HermiT.model.DLClause;
4import uk.ac.ox.cs.JRDFox.JRDFStoreException; 10
5import uk.ac.ox.cs.JRDFox.store.DataStore;
6import uk.ac.ox.cs.JRDFox.store.DataStore.UpdateType;
7import uk.ac.ox.cs.JRDFox.store.Parameters;
8import uk.ac.ox.cs.JRDFox.store.TripleStatus;
9import uk.ac.ox.cs.JRDFox.store.TupleIterator;
10import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; 11import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper;
11import uk.ac.ox.cs.pagoda.query.AnswerTuples; 12import uk.ac.ox.cs.pagoda.query.AnswerTuples;
12import uk.ac.ox.cs.pagoda.query.GapByStore4ID; 13import uk.ac.ox.cs.pagoda.query.GapByStore4ID;
13import uk.ac.ox.cs.pagoda.rules.DatalogProgram; 14import uk.ac.ox.cs.pagoda.rules.DatalogProgram;
14import uk.ac.ox.cs.pagoda.rules.Program; 15import uk.ac.ox.cs.pagoda.rules.Program;
15import uk.ac.ox.cs.pagoda.util.*; 16import uk.ac.ox.cs.pagoda.util.ConjunctiveQueryHelper;
17import uk.ac.ox.cs.pagoda.util.Namespace;
16import uk.ac.ox.cs.pagoda.util.Timer; 18import uk.ac.ox.cs.pagoda.util.Timer;
17 19import uk.ac.ox.cs.pagoda.util.UFS;
18import java.util.*; 20import uk.ac.ox.cs.pagoda.util.Utility;
21import uk.ac.ox.cs.JRDFox.JRDFStoreException;
22import uk.ac.ox.cs.JRDFox.store.DataStore;
23import uk.ac.ox.cs.JRDFox.store.Parameters;
24import uk.ac.ox.cs.JRDFox.store.TripleStatus;
25import uk.ac.ox.cs.JRDFox.store.TupleIterator;
26import uk.ac.ox.cs.JRDFox.store.DataStore.UpdateType;
19 27
20public class BasicQueryEngine extends RDFoxQueryEngine { 28public class BasicQueryEngine extends RDFoxQueryEngine {
21 29
22 protected DataStore store; 30 protected DataStore store;
23 protected Parameters parameters = new Parameters(); 31 protected Parameters parameters = new Parameters();
24 Set<DLClause> materialisedRules = new HashSet<DLClause>();
25 private UFS<String> equalityGroups = null;
26 32
27 public BasicQueryEngine(String name) { 33 public BasicQueryEngine(String name) {
28 super(name); 34 super(name);
29 store = RDFoxQueryEngine.createDataStore(); 35 store = RDFoxQueryEngine.createDataStore();
30 parameters.m_allAnswersInRoot = true; 36 parameters.m_allAnswersInRoot = true;
31 parameters.m_useBushy = true; 37 parameters.m_useBushy = true;
32 } 38 }
33 39
34 public void materialiseFoldedly(DatalogProgram dProgram, GapByStore4ID gap) { 40 public void materialiseFoldedly(DatalogProgram dProgram, GapByStore4ID gap) {
35 if (gap != null) { 41 if (gap != null) {
36 materialise("lower program", dProgram.getLower().toString()); 42 materialise("lower program", dProgram.getLower().toString());
@@ -42,9 +48,10 @@ public class BasicQueryEngine extends RDFoxQueryEngine {
42 } catch (JRDFStoreException e) { 48 } catch (JRDFStoreException e) {
43 e.printStackTrace(); 49 e.printStackTrace();
44 } finally { 50 } finally {
45 gap.clear(); 51 gap.clear();
46 } 52 }
47 } else 53 }
54 else
48 materialise("upper program", dProgram.getUpper().toString()); 55 materialise("upper program", dProgram.getUpper().toString());
49 } 56 }
50 57
@@ -59,23 +66,20 @@ public class BasicQueryEngine extends RDFoxQueryEngine {
59 } catch (JRDFStoreException e) { 66 } catch (JRDFStoreException e) {
60 e.printStackTrace(); 67 e.printStackTrace();
61 } finally { 68 } finally {
62 gap.clear(); 69 gap.clear();
63 } 70 }
64 } else 71 }
72 else
65 materialise("upper program", dProgram.getUpper().toString()); 73 materialise("upper program", dProgram.getUpper().toString());
66 74
67 return 1; 75 return 1;
68 } 76 }
69 77
70 public int materialiseSkolemly(DatalogProgram dProgram, GapByStore4ID gap) {
71 throw new UnsupportedOperationException();
72 }
73
74 @Override 78 @Override
75 public AnswerTuples evaluate(String queryText) { 79 public AnswerTuples evaluate(String queryText) {
76 return evaluate(queryText, ConjunctiveQueryHelper.getAnswerVariables(queryText)[0]); 80 return evaluate(queryText, ConjunctiveQueryHelper.getAnswerVariables(queryText)[0]);
77 } 81 }
78 82
79 @Override 83 @Override
80 public AnswerTuples evaluate(String queryText, String[] answerVars) { 84 public AnswerTuples evaluate(String queryText, String[] answerVars) {
81 TupleIterator tupleIterator; 85 TupleIterator tupleIterator;
@@ -83,9 +87,9 @@ public class BasicQueryEngine extends RDFoxQueryEngine {
83 tupleIterator = store.compileQuery(queryText.replace("_:", "?"), prefixes, parameters); 87 tupleIterator = store.compileQuery(queryText.replace("_:", "?"), prefixes, parameters);
84 } catch (JRDFStoreException e) { 88 } catch (JRDFStoreException e) {
85 e.printStackTrace(); 89 e.printStackTrace();
86 return null; 90 return null;
87 } 91 }
88 return new RDFoxAnswerTuples(answerVars, tupleIterator); 92 return new RDFoxAnswerTuples(answerVars, tupleIterator);
89 } 93 }
90 94
91 @Override 95 @Override
@@ -95,18 +99,17 @@ public class BasicQueryEngine extends RDFoxQueryEngine {
95 99
96 @Override 100 @Override
97 public void dispose() { 101 public void dispose() {
98 store.dispose(); 102 store.dispose();
99 } 103 }
100 104
101 protected void outputClassAssertions(String filename) { 105 protected void outputClassAssertions(String filename) {
102 TupleIterator allTuples = null; 106 TupleIterator allTuples = null;
103 boolean redirect = false; 107 boolean redirect = false;
104 try { 108 try {
105 allTuples = getDataStore().compileQuery("SELECT ?X ?Z WHERE { ?X <" + Namespace.RDF_TYPE + "> ?Z }", prefixes, parameters); 109 allTuples = getDataStore().compileQuery("SELECT ?X ?Z WHERE { ?X <" + Namespace.RDF_TYPE + "> ?Z }", prefixes, parameters);
106 redirect = Utility.redirectCurrentOut(filename); 110 redirect = Utility.redirectCurrentOut(filename);
107 for(long multi = allTuples.open(); multi != 0; multi = allTuples.getNext()) 111 for (long multi = allTuples.open(); multi != 0; multi = allTuples.getNext())
108 System.out.println(RDFoxTripleManager.getQuotedTerm(allTuples.getResource(0)) + " " + RDFoxTripleManager 112 System.out.println(RDFoxTripleManager.getQuotedTerm(allTuples.getResource(0)) + " " + RDFoxTripleManager.getQuotedTerm(allTuples.getResource(1)));
109 .getQuotedTerm(allTuples.getResource(1)));
110 } catch (JRDFStoreException e) { 113 } catch (JRDFStoreException e) {
111 e.printStackTrace(); 114 e.printStackTrace();
112 } finally { 115 } finally {
@@ -124,134 +127,138 @@ public class BasicQueryEngine extends RDFoxQueryEngine {
124 public void outputInstance4BinaryPredicate(String iri) { 127 public void outputInstance4BinaryPredicate(String iri) {
125 outputAnswers("select ?x ?y where { ?x <" + iri + "> ?y . }"); 128 outputAnswers("select ?x ?y where { ?x <" + iri + "> ?y . }");
126 } 129 }
127 130
128 public void outputInstanceNumbers(String filename) { 131 public void outputInstanceNumbers(String filename) {
129 TupleIterator predicateTuples = null; 132 TupleIterator predicateTuples = null;
130 TupleIterator instanceTuples; 133 TupleIterator instanceTuples;
131 Set<String> number = new HashSet<String>(); 134 Set<String> number = new HashSet<String>();
132 String predicate; 135 String predicate;
133 try { 136 try {
134 predicateTuples = getDataStore().compileQuery("SELECT DISTINCT ?Y WHERE { ?X <" + Namespace.RDF_TYPE + "> ?Y }", prefixes, parameters); 137 predicateTuples = getDataStore().compileQuery("SELECT DISTINCT ?Y WHERE { ?X <" + Namespace.RDF_TYPE + "> ?Y }", prefixes, parameters);
135 for (long multi = predicateTuples.open(); multi != 0; multi = predicateTuples.getNext()) { 138 for (long multi = predicateTuples.open(); multi != 0; multi = predicateTuples.getNext()) {
136 predicate = RDFoxTripleManager.getQuotedTerm(predicateTuples.getResource(0)); 139 predicate = RDFoxTripleManager.getQuotedTerm(predicateTuples.getResource(0));
137 instanceTuples = null; 140 instanceTuples = null;
138 try { 141 try {
139 instanceTuples = getDataStore().compileQuery("SELECT ?X WHERE { ?X <" + Namespace.RDF_TYPE + "> " + predicate + " }", prefixes, parameters); 142 instanceTuples = getDataStore().compileQuery("SELECT ?X WHERE { ?X <" + Namespace.RDF_TYPE + "> " + predicate + " }", prefixes, parameters);
140 long totalCount = 0; 143 long totalCount = 0;
141 for (long multi1 = instanceTuples.open(); multi1 != 0; multi1 = instanceTuples.getNext()) { 144 for (long multi1 = instanceTuples.open(); multi1 != 0; multi1 = instanceTuples.getNext()) {
142 totalCount += instanceTuples.getMultiplicity(); 145 totalCount += instanceTuples.getMultiplicity();
143 } 146 }
144 number.add(predicate + " * " + totalCount); 147 number.add(predicate + " * " + totalCount);
145 } finally { 148 } finally {
146 if(instanceTuples != null) instanceTuples.dispose(); 149 if (instanceTuples != null) instanceTuples.dispose();
147 } 150 }
148 } 151 }
149 } catch (JRDFStoreException e) { 152 } catch (JRDFStoreException e) {
150 e.printStackTrace(); 153 e.printStackTrace();
151 } finally { 154 } finally {
152 if (predicateTuples != null) predicateTuples.dispose(); 155 if (predicateTuples != null) predicateTuples.dispose();
153 predicateTuples = null; 156 predicateTuples = null;
154 } 157 }
155 158
156 try { 159 try {
157 predicateTuples = getDataStore().compileQuery("SELECT DISTINCT ?Y WHERE { ?X ?Y ?Z }", prefixes, parameters); 160 predicateTuples = getDataStore().compileQuery("SELECT DISTINCT ?Y WHERE { ?X ?Y ?Z }", prefixes, parameters);
158 for (long multi = predicateTuples.open(); multi != 0; multi = predicateTuples.getNext()) { 161 for (long multi = predicateTuples.open(); multi != 0; multi = predicateTuples.getNext()) {
159 predicate = RDFoxTripleManager.getQuotedTerm(predicateTuples.getResource(0)); 162 predicate = RDFoxTripleManager.getQuotedTerm(predicateTuples.getResource(0));
160 instanceTuples = null; 163 instanceTuples = null;
161 try { 164 try {
162 instanceTuples = getDataStore().compileQuery("SELECT ?X ?Z WHERE { ?X " + predicate + " ?Z }", prefixes, parameters); 165 instanceTuples = getDataStore().compileQuery("SELECT ?X ?Z WHERE { ?X " + predicate + " ?Z }", prefixes, parameters);
163 long totalCount = 0; 166 ;
167 long totalCount = 0;
164 for (long multi1 = instanceTuples.open(); multi1 != 0; multi1 = instanceTuples.getNext()) 168 for (long multi1 = instanceTuples.open(); multi1 != 0; multi1 = instanceTuples.getNext())
165 totalCount += instanceTuples.getMultiplicity(); 169 totalCount += instanceTuples.getMultiplicity();
166 number.add(predicate + " * " + totalCount); 170 number.add(predicate + " * " + totalCount);
167 } finally { 171 } finally {
168 if(instanceTuples != null) instanceTuples.dispose(); 172 if (instanceTuples != null) instanceTuples.dispose();
169 } 173 }
170 } 174 }
171 175
172 } catch (JRDFStoreException e) { 176 } catch (JRDFStoreException e) {
173 e.printStackTrace(); 177 e.printStackTrace();
174 } finally { 178 } finally {
175 if (predicateTuples != null) predicateTuples.dispose(); 179 if (predicateTuples != null) predicateTuples.dispose();
176 predicateTuples = null; 180 predicateTuples = null;
177 } 181 }
178 182
179 Utility.redirectCurrentOut(filename); 183 Utility.redirectCurrentOut(filename);
180 String[] ordered = number.toArray(new String[0]); 184 String[] ordered = number.toArray(new String[0]);
181 Arrays.sort(ordered, new DLPredicateComparator()); 185 Arrays.sort(ordered, new DLPredicateComparator());
182 for(String line : ordered) System.out.println(line); 186 for (String line: ordered) System.out.println(line);
183 Utility.closeCurrentOut(); 187 Utility.closeCurrentOut();
184 188
185 } 189 }
186 190
187 public TupleIterator internal_evaluateAgainstIDBs(String queryText) throws JRDFStoreException { 191 public TupleIterator internal_evaluateAgainstIDBs(String queryText) throws JRDFStoreException {
188 TupleIterator iter = store.compileQuery(queryText, prefixes, parameters, TripleStatus.TUPLE_STATUS_IDB.union(TripleStatus.TUPLE_STATUS_EDB), TripleStatus.TUPLE_STATUS_IDB); 192 TupleIterator iter = store.compileQuery(queryText, prefixes, parameters, TripleStatus.TUPLE_STATUS_IDB.union(TripleStatus.TUPLE_STATUS_EDB), TripleStatus.TUPLE_STATUS_IDB);
189// iter.open(); 193// iter.open();
190 return iter; 194 return iter;
191 } 195 }
192 196
193 public TupleIterator internal_evaluate(String queryText) throws JRDFStoreException { 197 public TupleIterator internal_evaluate(String queryText) throws JRDFStoreException {
194 TupleIterator iter = store.compileQuery(queryText, prefixes, parameters); 198 TupleIterator iter = store.compileQuery(queryText, prefixes, parameters);
195// iter.open(); 199// iter.open();
196 return iter; 200 return iter;
197 } 201 }
198 202
199 public void setExpandEquality(boolean flag) { 203 public void setExpandEquality(boolean flag) {
200 parameters.m_expandEquality = flag; 204 parameters.m_expandEquality = flag;
201 } 205 }
202 206
203 public TupleIterator internal_evaluateNotExpanded(String queryText) throws JRDFStoreException { 207 public TupleIterator internal_evaluateNotExpanded(String queryText) throws JRDFStoreException {
204 parameters.m_expandEquality = false; 208 parameters.m_expandEquality = false;
205 TupleIterator iter = store.compileQuery(queryText, prefixes, parameters); 209 TupleIterator iter = store.compileQuery(queryText, prefixes, parameters);
206// iter.open(); 210// iter.open();
207 parameters.m_expandEquality = true; 211 parameters.m_expandEquality = true;
208 return iter; 212 return iter;
209 } 213 }
214
210 215
211 public TupleIterator internal_evaluate(String queryText, boolean incrementally) throws JRDFStoreException { 216 public TupleIterator internal_evaluate(String queryText, boolean incrementally) throws JRDFStoreException {
212 return incrementally ? internal_evaluateAgainstIDBs(queryText) : internal_evaluate(queryText); 217 return incrementally ? internal_evaluateAgainstIDBs(queryText) : internal_evaluate(queryText);
213 } 218 }
214 219
220 Set<DLClause> materialisedRules = new HashSet<DLClause>();
221
215 public String getUnusedRules(Collection<DLClause> clauses, boolean toUpdate) { 222 public String getUnusedRules(Collection<DLClause> clauses, boolean toUpdate) {
216 DLClause clause; 223 DLClause clause;
217 for (Iterator<DLClause> iter = clauses.iterator(); iter.hasNext(); ) { 224 for (Iterator<DLClause> iter = clauses.iterator(); iter.hasNext(); ) {
218 if (materialisedRules.contains(clause = iter.next())) 225 if (materialisedRules.contains(clause = iter.next()))
219 iter.remove(); 226 iter.remove();
220 else if(toUpdate) materialisedRules.add(clause); 227 else if (toUpdate) materialisedRules.add(clause);
221 } 228 }
222 229
223 if (clauses.isEmpty()) return null; 230 if (clauses.isEmpty()) return null;
224 231
225 return Program.toString(clauses); 232 return Program.toString(clauses);
226 } 233 }
227 234
228 public void outputMaterialisedRules() { 235 public void outputMaterialisedRules() {
229 System.out.println(DLClauseHelper.toString(materialisedRules)); 236 System.out.println(DLClauseHelper.toString(materialisedRules));
230 } 237 }
231 238
232 public void outputAnswers(String query) { 239 public void outputAnswers(String query) {
233 TupleIterator iter = null; 240 TupleIterator iter = null;
234 try { 241 try {
235 iter = internal_evaluate(query); 242 iter = internal_evaluate(query);
236 System.out.println(query); 243 System.out.println(query);
237 int arity = iter.getArity(); 244 int arity = iter.getArity();
238 for (long multi = iter.open(); multi != 0; multi = iter.getNext()) { 245 for (long multi = iter.open(); multi != 0; multi = iter.getNext()) {
239 for (int i = 0; i < arity; ++i) 246 for (int i = 0; i < arity; ++i)
240 System.out.print(RDFoxTripleManager.getQuotedTerm(iter.getResource(i)) + "\t"); 247 System.out.print(RDFoxTripleManager.getQuotedTerm(iter.getResource(i)) + "\t");
241 System.out.println(); 248 System.out.println();
242 } 249 }
243 } catch (JRDFStoreException e) { 250 } catch (JRDFStoreException e) {
244 e.printStackTrace(); 251 e.printStackTrace();
245 } finally { 252 } finally {
246 if(iter != null) iter.dispose(); 253 if (iter != null) iter.dispose();
247 } 254 }
248 } 255 }
249 256
250 public void outputInstance4UnaryPredicate(String iri) { 257 public void outputInstance4UnaryPredicate(String iri) {
251 outputAnswers("select ?x where { ?x " 258 outputAnswers("select ?x where { ?x "
252 + "<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <" 259 + "<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <"
253 + iri 260 + iri
254 + "> .}"); 261 + "> .}");
255 } 262 }
256 263
257 public void outputSubjects(String p, String o) { 264 public void outputSubjects(String p, String o) {
@@ -263,13 +270,13 @@ public class BasicQueryEngine extends RDFoxQueryEngine {
263 } 270 }
264 271
265 public void outputIDBFacts() { 272 public void outputIDBFacts() {
266 TupleIterator iter = null; 273 TupleIterator iter = null;
267 try { 274 try {
268 iter = internal_evaluateAgainstIDBs("select distict ?x ?y ?z where { ?x ?y ?z }"); 275 iter = internal_evaluateAgainstIDBs("select distict ?x ?y ?z where { ?x ?y ?z }");
269 for (long multi = iter.open(); multi != 0; multi = iter.getNext()) { 276 for (long multi = iter.open(); multi != 0; multi = iter.getNext()) {
270 for (int i = 0; i < 3; ++i) 277 for (int i = 0; i < 3; ++i)
271 System.out.print(RDFoxTripleManager.getQuotedTerm(iter.getResource(i)) + "\t"); 278 System.out.print(RDFoxTripleManager.getQuotedTerm(iter.getResource(i)) + "\t");
272 System.out.println(); 279 System.out.println();
273 } 280 }
274 } catch (JRDFStoreException e) { 281 } catch (JRDFStoreException e) {
275 // TODO Auto-generated catch block 282 // TODO Auto-generated catch block
@@ -277,7 +284,7 @@ public class BasicQueryEngine extends RDFoxQueryEngine {
277 } finally { 284 } finally {
278 if (iter != null) iter.dispose(); 285 if (iter != null) iter.dispose();
279 } 286 }
280 287
281 } 288 }
282 289
283 public void outputType4Individual(String iri) { 290 public void outputType4Individual(String iri) {
@@ -285,23 +292,25 @@ public class BasicQueryEngine extends RDFoxQueryEngine {
285 } 292 }
286 293
287 public int getSameAsNumber() { 294 public int getSameAsNumber() {
288 TupleIterator iter = null; 295 TupleIterator iter = null;
289 int counter = 0; 296 int counter = 0;
290 try { 297 try {
291 iter = internal_evaluate("select ?x ?y where {?x " + Namespace.EQUALITY_QUOTED + " ?y . }"); 298 iter = internal_evaluate("select ?x ?y where {?x " + Namespace.EQUALITY_QUOTED + " ?y . }");
292 for(long multi = iter.open(); multi != 0; multi = iter.getNext()) 299 for (long multi = iter.open(); multi != 0; multi = iter.getNext())
293 if (iter.getResourceID(0) != iter.getResourceID(1)) 300 if (iter.getResourceID(0) != iter.getResourceID(1))
294 ++counter; 301 ++counter;
295 } catch (JRDFStoreException e) { 302 } catch (JRDFStoreException e) {
296 e.printStackTrace(); 303 e.printStackTrace();
297 } finally { 304 } finally {
298 if (iter != null) iter.dispose(); 305 if (iter != null) iter.dispose();
299 } 306 }
300 return counter; 307 return counter;
301 } 308 }
302 309
310 private UFS<String> equalityGroups = null;
311
303 public UFS<String> getEqualityGroups(boolean reuse) { 312 public UFS<String> getEqualityGroups(boolean reuse) {
304 if(reuse && equalityGroups != null) return equalityGroups; 313 if (reuse && equalityGroups != null) return equalityGroups;
305 314
306 equalityGroups = new UFS<String>(); 315 equalityGroups = new UFS<String>();
307 316