aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/query/GapByTriple.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/query/GapByTriple.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/query/GapByTriple.java171
1 files changed, 171 insertions, 0 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/query/GapByTriple.java b/src/uk/ac/ox/cs/pagoda/query/GapByTriple.java
new file mode 100644
index 0000000..1a94f07
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/query/GapByTriple.java
@@ -0,0 +1,171 @@
1package uk.ac.ox.cs.pagoda.query;
2
3import java.io.BufferedWriter;
4import java.io.FileOutputStream;
5import java.io.IOException;
6import java.io.OutputStreamWriter;
7import java.util.Collection;
8
9import org.semanticweb.HermiT.model.Atom;
10import org.semanticweb.HermiT.model.AtomicConcept;
11import org.semanticweb.HermiT.model.AtomicRole;
12import org.semanticweb.HermiT.model.DLClause;
13import org.semanticweb.HermiT.model.Individual;
14
15import uk.ac.ox.cs.pagoda.MyPrefixes;
16import uk.ac.ox.cs.pagoda.owl.OWLHelper;
17import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine;
18import uk.ac.ox.cs.pagoda.reasoner.light.RDFoxTripleManager;
19import uk.ac.ox.cs.pagoda.util.Namespace;
20import uk.ac.ox.cs.pagoda.util.Utility;
21import uk.ac.ox.cs.JRDFox.JRDFStoreException;
22import uk.ac.ox.cs.JRDFox.Prefixes;
23import uk.ac.ox.cs.JRDFox.store.DataStore;
24import uk.ac.ox.cs.JRDFox.store.Parameters;
25import uk.ac.ox.cs.JRDFox.store.TupleIterator;
26
27public class GapByTriple extends GapTupleIterator<String> {
28
29 private static final String RDF_TYPE = Namespace.RDF_NS + "type";
30 private static final String BRIEF_RDF_TYPE = "rdf:type";
31
32 static final String allTripleQuery = "SELECT ?X ?Y ?Z WHERE { ?X ?Y ?Z }";
33
34 DataStore lowerStore, upperStore;
35 long multi;
36 TupleIterator iterator;
37 String sub, obj, predicate;
38// GroundTerm subTerm, objTerm;
39 Prefixes prefixes;
40 Parameters parameters;
41
42 public GapByTriple(BasicQueryEngine lowerStore, BasicQueryEngine upperStore) {
43 this.lowerStore = lowerStore.getDataStore();
44 this.upperStore = upperStore.getDataStore();
45 prefixes = MyPrefixes.PAGOdAPrefixes.getRDFoxPrefixes();
46 parameters = new Parameters();
47 }
48
49 public void compile(Collection<DLClause> clauses) throws JRDFStoreException {
50 iterator = this.upperStore.compileQuery(allTripleQuery, prefixes, parameters);
51 multi = iterator.open();
52 }
53
54 @Override
55 public boolean hasNext() {
56 TupleIterator iter;
57 boolean inGap;
58 StringBuffer queryBuffer = new StringBuffer();
59 try {
60 for (; multi != 0; multi = iterator.getNext()) {
61// iterator.getRawGroundTerm(0);
62// iterator.getRawGroundTerm(1);
63// iterator.getRawGroundTerm(2);
64
65 sub = RDFoxTripleManager.getQuotedTerm(iterator.getResource(0));
66 predicate = RDFoxTripleManager.getQuotedTerm(iterator.getResource(1));
67 obj = RDFoxTripleManager.getQuotedTerm(iterator.getResource(2));
68
69 if (!obj.startsWith("<")) {
70 // This fragment of code ignores data types assertions.
71// Utility.LOGS.info(sub + " " + predicate + " " + obj);
72 continue;
73 }
74
75 queryBuffer.setLength(0);
76 queryBuffer.append("SELECT WHERE { ").append(sub).append(" ").append(predicate).append(" ").append(obj).append(" }");
77
78 iter = lowerStore.compileQuery(queryBuffer.toString(), prefixes, parameters);
79 inGap = iter.open() != 0;
80 iter.dispose();
81 if (inGap)
82 return true;
83 }
84 } catch (JRDFStoreException e) {
85 // TODO Auto-generated catch block
86 e.printStackTrace();
87 }
88 return false;
89 }
90
91 @Override
92 public String next() {
93 try {
94 multi = iterator.getNext();
95 } catch (JRDFStoreException e) {
96 e.printStackTrace();
97 }
98 StringBuilder sb = new StringBuilder();
99 if (isRDF_TYPE()) {
100 sb.append(sub).append(" ").append(predicate).append(" ").append(getGapPredicate(obj)).append(".");
101 }
102 else sb.append(sub).append(" ").append(getGapPredicate(predicate)).append(" ").append(obj).append(".");
103 return sb.toString();
104 }
105
106 private boolean isRDF_TYPE() {
107 return predicate.equals(RDF_TYPE) || predicate.equals(BRIEF_RDF_TYPE);
108 }
109
110 @Override
111 public void remove() {
112 Utility.logError("Unsupported operation!");
113 }
114
115 public void save(String file) {
116 int tupleCounter = 0;
117 try {
118 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
119 String tuple;
120 while (hasNext()) {
121 tuple = next();
122 writer.write(tuple);
123 writer.newLine();
124 ++tupleCounter;
125 }
126 writer.close();
127 } catch (IOException e) {
128 e.printStackTrace();
129 }
130
131 Utility.logError("There are " + tupleCounter + " tuples in the gap between lower and upper bound materialisation.");
132 }
133
134 public void addTo(DataStore store) throws JRDFStoreException {
135 int tupleCounter = 0;
136 RDFoxTripleManager tripleManager = new RDFoxTripleManager(store, false);
137 while (hasNext()) {
138 multi = iterator.getNext();
139 ++tupleCounter;
140 if (isRDF_TYPE()) {
141 obj = OWLHelper.removeAngles(obj);
142 tripleManager.addTripleByTerm(
143 Atom.create(AtomicConcept.create(getGapPredicate(obj)), Individual.create(sub)));
144 }
145 else {
146 predicate = OWLHelper.removeAngles(predicate);
147 tripleManager.addTripleByTerm(
148 Atom.create(AtomicRole.create(getGapPredicate(predicate)), Individual.create(sub), Individual.create(obj)));
149 }
150 if (tupleCounter % 10000 == 0)
151 Utility.logDebug(tupleCounter);
152 }
153
154 Utility.logDebug("There are " + tupleCounter + " tuples in the gap between lower and upper bound materialisation.");
155 }
156
157 @Override
158 public void addBackTo() throws JRDFStoreException {
159 addTo(upperStore);
160 }
161
162 @Override
163 public boolean isValid() {
164 return true;
165 }
166
167 @Override
168 public void clear() {
169 iterator.dispose();
170 }
171}