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