aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoder.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/tracking/TrackingRuleEncoder.java
parentb1ac207612ee8b045244253fb94b866104bc34f2 (diff)
downloadACQuA-9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8.tar.gz
ACQuA-9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8.zip
initial version
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoder.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoder.java385
1 files changed, 385 insertions, 0 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoder.java b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoder.java
new file mode 100644
index 0000000..3a01e19
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoder.java
@@ -0,0 +1,385 @@
1package uk.ac.ox.cs.pagoda.tracking;
2
3import java.io.BufferedWriter;
4import java.io.FileOutputStream;
5import java.io.IOException;
6import java.io.OutputStreamWriter;
7import java.util.Collection;
8import java.util.HashMap;
9import java.util.HashSet;
10import java.util.LinkedList;
11import java.util.Map;
12import java.util.Set;
13
14import org.semanticweb.HermiT.model.AnnotatedEquality;
15import org.semanticweb.HermiT.model.Atom;
16import org.semanticweb.HermiT.model.AtomicConcept;
17import org.semanticweb.HermiT.model.AtomicRole;
18import org.semanticweb.HermiT.model.Constant;
19import org.semanticweb.HermiT.model.DLClause;
20import org.semanticweb.HermiT.model.DLPredicate;
21import org.semanticweb.HermiT.model.DatatypeRestriction;
22import org.semanticweb.HermiT.model.Equality;
23import org.semanticweb.HermiT.model.Individual;
24import org.semanticweb.HermiT.model.Inequality;
25import org.semanticweb.HermiT.model.Variable;
26import org.semanticweb.owlapi.model.OWLOntology;
27
28import uk.ac.ox.cs.JRDFox.model.Datatype;
29import uk.ac.ox.cs.JRDFox.model.GroundTerm;
30import uk.ac.ox.cs.JRDFox.model.Literal;
31import uk.ac.ox.cs.pagoda.MyPrefixes;
32import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper;
33import uk.ac.ox.cs.pagoda.query.*;
34import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine;
35import uk.ac.ox.cs.pagoda.reasoner.light.RDFoxTripleManager;
36import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram;
37import uk.ac.ox.cs.pagoda.util.Namespace;
38import uk.ac.ox.cs.pagoda.util.Utility;
39
40public abstract class TrackingRuleEncoder {
41 UpperDatalogProgram program;
42 Collection<DLClause> trackingClauses = new HashSet<DLClause>();
43 Collection<DLClause> queryClauses = new LinkedList<DLClause>();
44
45 Map<Integer, DLClause> index2clause = new HashMap<Integer, DLClause>();
46 Map<DLClause, Integer> clause2index = new HashMap<DLClause, Integer>();
47
48 String equalityRelatedRuleText = null;
49 protected BasicQueryEngine store;
50
51 public TrackingRuleEncoder(UpperDatalogProgram program, BasicQueryEngine store) {
52 this.program = program;
53 this.store = store;
54 }
55
56 protected abstract String getEqualityRelatedRuleText();
57
58 boolean ruleEncoded = false;
59
60 public boolean encodingRules() {
61 if (ruleEncoded) return false;
62 ruleEncoded = true;
63
64// for (DLClause clause: program.getClauses(currentQuery.getClause())) {
65 for (DLClause clause: program.getClauses()) {
66 encodingRule(clause);
67 }
68 return true;
69 }
70
71 protected String getIRI(String name) {
72 return program.getOntology().getOntologyID().getOntologyIRI().toString() + "#" + name;
73 }
74
75 protected abstract void encodingRule(DLClause clause);
76
77 protected Individual getIndividual4GeneralRule(DLClause clause) {
78 clause = program.getCorrespondingClause(clause);
79// if (clause == null)
80// return Individual.create(getIRI("_r0"));
81
82 int index;
83 if (clause2index.containsKey(clause))
84 index = clause2index.get(clause);
85 else {
86 index = clause2index.size() + 1;
87 index2clause.put(index, clause);
88 clause2index.put(clause, index);
89 }
90
91 return Individual.create(getIRI("_r" + index));
92 }
93
94 private boolean queryEncoded = false;
95 private LinkedList<int[]> addedData = new LinkedList<int[]>();
96
97 public Collection<int[]> getAddedData() {
98 return addedData;
99 }
100
101 private void encodingQuery(QueryRecord[] botQuerRecords) {
102 if (queryEncoded) return ;
103 queryEncoded = true;
104
105 if (currentQuery.getArity() > 0 && currentQuery.getArity() < 3) {
106 encodingAtomicQuery(botQuerRecords);
107
108 } else {
109 DLClause queryClause = currentQuery.getClause();
110 Atom[] bodyAtoms = queryClause.getBodyAtoms();
111 for (Atom bodyAtom: bodyAtoms)
112 addQueryRule(bodyAtom, bodyAtoms);
113 }
114 }
115
116 private void addQueryRule(Atom atom, Atom[] atoms) {
117 DLClause newClause;
118 Atom headAtom;
119
120 headAtom = Atom.create(
121 getTrackingDLPredicate(atom.getDLPredicate()),
122 DLClauseHelper.getArguments(atom));
123 newClause = DLClause.create(new Atom[] {headAtom}, atoms);
124 queryClauses.add(newClause);
125 }
126
127 public static final String trackingPredicateRelation = Namespace.PAGODA_AUX + "isTrackingPredicateFor";
128
129 public static final String QueryPredicate = Namespace.PAGODA_AUX + "Query";
130
131 protected String getCurrentQueryPredicate() {
132 return QueryPredicate + currentQuery.getQueryID();
133 }
134
135 protected void encodingAtomicQuery(QueryRecord[] botQuerRecords) {
136 encodingAtomicQuery(botQuerRecords, false);
137 }
138
139 protected void encodingAtomicQuery(QueryRecord[] botQuerRecords, boolean includingBottom) {
140 DLClause queryClause = currentQuery.getClause();
141 AnswerTuples answerTuples = currentQuery.getGapAnswers();
142 String[] answerVariables = currentQuery.getAnswerVariables();
143
144 String currentQueryPredicate = getCurrentQueryPredicate();
145 Atom newAtom;
146 if (answerVariables.length == 1) {
147 AtomicConcept queryConcept = AtomicConcept.create(currentQueryPredicate);
148 newAtom = Atom.create(queryConcept, Variable.create(answerVariables[0]));
149 }
150 else {
151 AtomicRole queryRole = AtomicRole.create(currentQueryPredicate);
152 newAtom = Atom.create(queryRole, Variable.create(answerVariables[0]), Variable.create(answerVariables[1]));
153 }
154
155 Atom[] bodyAtoms = queryClause.getBodyAtoms();
156 Atom[] newBodyAtoms = new Atom[queryClause.getBodyLength() + 1];
157 for (int i = 0; i < bodyAtoms.length; ++i)
158 newBodyAtoms[i + 1] = bodyAtoms[i];
159 newBodyAtoms[0] = newAtom;
160
161 for (Atom bodyAtom: bodyAtoms)
162 addQueryRule(bodyAtom, newBodyAtoms);
163
164 RDFoxTripleManager tripleManager = new RDFoxTripleManager(store.getDataStore(), true);
165// MyPrefixes prefixes = MyPrefixes.PAGOdAPrefixes;
166 int[] triple;
167 int predicate = tripleManager.getResourceID(AtomicConcept.create(currentQueryPredicate));
168 int rdftype = tripleManager.getResourceID(AtomicRole.create(Namespace.RDF_TYPE));
169 if (answerVariables.length == 1) {
170 for (AnswerTuple answer; answerTuples.isValid(); answerTuples.moveNext()) {
171 answer = answerTuples.getTuple();
172 triple = new int[] { tripleManager.getResourceID(getRawTerm(answer.getGroundTerm(0))), rdftype, predicate };
173 addedData.add(triple);
174 tripleManager.addTripleByID(triple);
175// System.out.println("To be removed ... \n" + tripleManager.getRawTerm(tripleManager.getResourceID(prefixes.expandIRI(answer.getRawTerm(0)))) + " " + tripleManager.getRawTerm(rdftype) + " " + tripleManager.getRawTerm(predicate));
176 }
177 }
178 else {
179 for (AnswerTuple answer; answerTuples.isValid(); answerTuples.moveNext()) {
180 answer = answerTuples.getTuple();
181 triple = new int[] { tripleManager.getResourceID(getRawTerm(answer.getGroundTerm(0))), predicate, tripleManager.getResourceID(getRawTerm(answer.getGroundTerm(1))) };
182 addedData.add(triple);
183 tripleManager.addTripleByID(triple);
184 }
185 }
186 answerTuples.dispose();
187
188 if (includingBottom && botQuerRecords != null) {
189 int index = 0;
190 GroundTerm t;
191 String raw;
192 for (QueryRecord botQueryRecord: botQuerRecords) {
193 answerTuples = botQueryRecord.getGapAnswers();
194 int subID = 0;//botQueryRecord.getSubID();
195 String p = subID == 0 ? AtomicConcept.NOTHING.getIRI() : Namespace.OWL_NS + "Nothing_final" + (++index);
196 predicate = tripleManager.getResourceID(AtomicConcept.create(p = getTrackingPredicate(p)));
197 for (AnswerTuple answer; answerTuples.isValid(); answerTuples.moveNext()) {
198 answer = answerTuples.getTuple();
199// System.out.println("To be removed ... " + answer.getRawTerm(0));
200 raw = ((t = answer.getGroundTerm(0)) instanceof uk.ac.ox.cs.JRDFox.model.Individual) ? ((uk.ac.ox.cs.JRDFox.model.Individual) t).getIRI() : t.toString();
201 triple = new int[] { tripleManager.getResourceID(raw), rdftype, predicate };
202 addedData.add(triple);
203 tripleManager.addTripleByID(triple);
204 }
205 answerTuples.dispose();
206 }
207 }
208
209 Utility.logInfo(addedData.size() + " triples are added into the store.");
210 }
211
212 public static String getRawTerm(GroundTerm r) {
213 if (r instanceof uk.ac.ox.cs.JRDFox.model.Individual)
214 return ((uk.ac.ox.cs.JRDFox.model.Individual) r).getIRI();
215 else {
216 Literal l = (Literal) r;
217 if (l.getDatatype().equals(Datatype.XSD_STRING) && l.getDatatype().equals(Datatype.RDF_PLAIN_LITERAL))
218 return "\"" + l.getLexicalForm() + "\"";
219 else
220 return "\"" + l.getLexicalForm() + "\"^^<" + l.getDatatype().getIRI() + ">";
221 }
222 }
223
224 protected DLPredicate getGapDLPredicate(DLPredicate dlPredicate) {
225 return getDLPredicate(dlPredicate, GapTupleIterator.gapPredicateSuffix);
226 }
227
228 DLPredicate getDLPredicate(DLPredicate p, String suffix) {
229 if (p instanceof AtomicConcept)
230 return AtomicConcept.create(((AtomicConcept) p).getIRI() + suffix);
231 else if (p instanceof DatatypeRestriction) {
232 DatatypeRestriction restriction = (DatatypeRestriction) p;
233 String newURI = restriction.getDatatypeURI() + suffix;
234 return getDatatypeRestriction(restriction, newURI);
235 }
236 else if (p instanceof AtomicRole)
237 return AtomicRole.create(((AtomicRole) p).getIRI() + suffix);
238 else if (p instanceof AnnotatedEquality || p instanceof Equality)
239 return AtomicRole.create(Namespace.EQUALITY + suffix);
240 else if (p instanceof Inequality)
241 return AtomicRole.create(Namespace.INEQUALITY + suffix);
242 else {
243 Utility.logDebug("strange DL predicate appeared ... " + p,
244 "the program paused here in TrackingRuleEncoderDisj.java");
245 return null;
246 }
247 }
248
249 protected DLPredicate getTrackingDLPredicate(DLPredicate dlPredicate) {
250 return getDLPredicate(dlPredicate, getTrackingSuffix(currentQuery.getQueryID()));
251 }
252
253 protected static String getTrackingSuffix(String queryID) {
254 return "_AUXt" + queryID;
255 }
256
257 public String getTrackingPredicate(String predicateIRI) {
258 if (predicateIRI.startsWith("<"))
259 return predicateIRI.replace(">", getTrackingSuffix(currentQuery.getQueryID()) + ">");
260 else
261 return predicateIRI + getTrackingSuffix(currentQuery.getQueryID());
262 }
263
264 protected DLPredicate getDatatypeRestriction(DatatypeRestriction restriction, String newName) {
265 int length = restriction.getNumberOfFacetRestrictions();
266 String[] facets = new String[length];
267 Constant[] values = new Constant[length];
268 for (int i = 0; i < length; ++i) {
269 facets[i] = restriction.getFacetURI(i);
270 values[i] = restriction.getFacetValue(i);
271 }
272 return DatatypeRestriction.create(newName, facets, values);
273 }
274
275 protected QueryRecord currentQuery;
276 DLPredicate selected;
277
278 public void setCurrentQuery(QueryRecord record) {
279 deprecateTrackingAndQueryRules();
280 currentQuery = record;
281 selected = AtomicConcept.create(getSelectedPredicate());
282 trackingSuffix = "_AUXt" + currentQuery.getQueryID();
283 }
284
285 public void dispose() {
286 deprecateTrackingAndQueryRules();
287 }
288
289 private String getTrackingRuleText() {
290 return DLClauseHelper.toString(trackingClauses);
291 }
292
293 private String getQueryRuleText() {
294 return DLClauseHelper.toString(queryClauses);
295 }
296
297 public String getTrackingProgram() {
298 StringBuilder sb = getTrackingProgramBody();
299 sb.insert(0, MyPrefixes.PAGOdAPrefixes.prefixesText());
300 return sb.toString();
301 }
302
303 protected StringBuilder getTrackingProgramBody() {
304 encodingRules();
305 encodingQuery(new QueryRecord[0]);
306
307 StringBuilder sb = new StringBuilder();
308 sb.append(getTrackingRuleText());
309 sb.append(getEqualityRelatedRuleText());
310 sb.append(getQueryRuleText());
311 return sb;
312 }
313
314 public void saveTrackingRules(String fileName) {
315 BufferedWriter writer = null;
316 try {
317 writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName)));
318 writer.write(getTrackingProgram());
319 writer.close();
320 } catch (IOException e) {
321 e.printStackTrace();
322 return ;
323 }
324 Utility.logDebug("The tracking rules are saved in " + fileName + ".");
325 }
326
327 private void deprecateTrackingAndQueryRules() {
328 trackingClauses.clear();
329 queryClauses.clear();
330 addedData.clear();
331 ruleEncoded = false;
332 queryEncoded = false;
333 }
334
335 public String getSelectedPredicate() {
336 return getIRI("_selected" + currentQuery.getQueryID());
337 }
338
339 public DLClause getSelectedClause(String iri) {
340 int index = iri.lastIndexOf("_r") + 2;
341 int ruleIndex = Integer.parseInt(iri.substring(index));
342 return index2clause.get(ruleIndex);
343 }
344
345 /**
346 * SELECT ?X
347 * WHERE {
348 * ?X <http://www.w3.org/1999/02/22-rdf-syntax-ns#:type> :_selected?
349 * }
350 */
351 public String getSelectedSPARQLQuery() {
352 StringBuilder builder = new StringBuilder();
353 builder.append("SELECT ?X\nWHERE {\n?X <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ");
354 builder.append(selected.toString()).append("\n}");
355 return builder.toString();
356 }
357
358 public OWLOntology getOntology() {
359 return program.getOntology();
360 }
361
362 public UpperDatalogProgram getProgram() {
363 return program;
364 }
365
366 private String trackingSuffix;
367
368 public String getOriginalPredicate(String p) {
369 if (p.startsWith("<")) {
370 if (!p.endsWith(trackingSuffix + ">")) return null;
371 }
372 else
373 if (!p.endsWith(trackingSuffix)) return null;
374
375 return p.replace(trackingSuffix, "");
376 }
377
378 public boolean isAuxPredicate(String p) {
379 return false;
380 }
381
382 protected Set<String> unaryPredicates = new HashSet<String>();
383 protected Set<String> binaryPredicates = new HashSet<String>();
384
385}