aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java129
1 files changed, 68 insertions, 61 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
index 7999daa..3c0a001 100644
--- a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
+++ b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
@@ -44,31 +44,36 @@ public class MyQueryReasoner extends QueryReasoner {
44 44
45 boolean equalityTag; 45 boolean equalityTag;
46 boolean multiStageTag; 46 boolean multiStageTag;
47 47 TrackingRuleEncoder encoder;
48 Timer t = new Timer();
49 private Collection<String> predicatesWithGap = null;
50 private Boolean satisfiable;
51 private ConsistencyManager consistency = new ConsistencyManager(this);
52
48 public MyQueryReasoner() { 53 public MyQueryReasoner() {
49 setup(true, true); 54 setup(true, true);
50 } 55 }
51 56
52 public MyQueryReasoner(boolean multiStageTag, boolean considerEqualities) { 57 public MyQueryReasoner(boolean multiStageTag, boolean considerEqualities) {
53 setup(multiStageTag, considerEqualities); 58 setup(multiStageTag, considerEqualities);
54 } 59 }
55 60
56 private BasicQueryEngine getUpperStore(String name, boolean checkValidity) { 61 private BasicQueryEngine getUpperStore(String name, boolean checkValidity) {
57 if (multiStageTag) 62 if (multiStageTag)
58 return new MultiStageQueryEngine(name, checkValidity); 63 return new MultiStageQueryEngine(name, checkValidity);
59// return new TwoStageQueryEngine(name, checkValidity); 64// return new TwoStageQueryEngine(name, checkValidity);
60 else 65 else
61 return new BasicQueryEngine(name); 66 return new BasicQueryEngine(name);
62 } 67 }
63 68
64 public void setup(boolean multiStageTag, boolean considerEqualities) { 69 public void setup(boolean multiStageTag, boolean considerEqualities) {
65 satisfiable = null; 70 satisfiable = null;
66 this.multiStageTag = multiStageTag; 71 this.multiStageTag = multiStageTag;
67 this.equalityTag = considerEqualities; 72 this.equalityTag = considerEqualities;
68 73
69 rlLowerStore = new BasicQueryEngine("rl-lower-bound"); 74 rlLowerStore = new BasicQueryEngine("rl-lower-bound");
70 elLowerStore = new KarmaQueryEngine("elho-lower-bound"); 75 elLowerStore = new KarmaQueryEngine("elho-lower-bound");
71 76
72 trackingStore = getUpperStore("tracking", false); 77 trackingStore = getUpperStore("tracking", false);
73 } 78 }
74 79
@@ -80,113 +85,108 @@ public class MyQueryReasoner extends QueryReasoner {
80 elLowerStore.importRDFData(name, datafile); 85 elLowerStore.importRDFData(name, datafile);
81 trackingStore.importRDFData(name, datafile); 86 trackingStore.importRDFData(name, datafile);
82 } 87 }
83 88
84 @Override 89 @Override
85 public void loadOntology(OWLOntology o) { 90 public void loadOntology(OWLOntology o) {
86 if (!equalityTag) { 91 if (!equalityTag) {
87 EqualitiesEliminator eliminator = new EqualitiesEliminator(o); 92 EqualitiesEliminator eliminator = new EqualitiesEliminator(o);
88 o = eliminator.getOutputOntology(); 93 o = eliminator.getOutputOntology();
89 eliminator.save(); 94 eliminator.save();
90 } 95 }
91 96
92 ontology = o; 97 ontology = o;
93 program = new DatalogProgram(ontology, properties.getToClassify()); 98 program = new DatalogProgram(ontology, properties.getToClassify());
94// program.getLower().save(); 99// program.getLower().save();
95// program.getUpper().save(); 100// program.getUpper().save();
96// program.getGeneral().save(); 101// program.getGeneral().save();
97 102
98 if (multiStageTag && !program.getGeneral().isHorn()) { 103 if (multiStageTag && !program.getGeneral().isHorn()) {
99 lazyUpperStore = getUpperStore("lazy-upper-bound", true); // new MultiStageQueryEngine("lazy-upper-bound", true); // 104 lazyUpperStore = getUpperStore("lazy-upper-bound", true); // new MultiStageQueryEngine("lazy-upper-bound", true); //
100 } 105 }
101 106
107 // TODO add new upper store creation
108
102 importData(program.getAdditionalDataFile()); 109 importData(program.getAdditionalDataFile());
103 110
104 elho_ontology = new ELHOProfile().getFragment(ontology); 111 elho_ontology = new ELHOProfile().getFragment(ontology);
105 elLowerStore.processOntology(elho_ontology); 112 elLowerStore.processOntology(elho_ontology);
106 } 113 }
107
108 private Collection<String> predicatesWithGap = null;
109 114
110 public Collection<String> getPredicatesWithGap() { 115 public Collection<String> getPredicatesWithGap() {
111 return predicatesWithGap; 116 return predicatesWithGap;
112 } 117 }
113 118
114 @Override 119 @Override
115 public boolean preprocess() { 120 public boolean preprocess() {
116 t.reset(); 121 t.reset();
117 Utility.logInfo("Preprocessing ... checking satisfiability ... "); 122 Utility.logInfo("Preprocessing ... checking satisfiability ... ");
118 123
119 String name = "data", datafile = importedData.toString(); 124 String name = "data", datafile = importedData.toString();
120 rlLowerStore.importRDFData(name, datafile); 125 rlLowerStore.importRDFData(name, datafile);
121 rlLowerStore.materialise("lower program", program.getLower().toString()); 126 rlLowerStore.materialise("lower program", program.getLower().toString());
122// program.getLower().save(); 127// program.getLower().save();
123 if (!consistency.checkRLLowerBound()) return false; 128 if (!consistency.checkRLLowerBound()) return false;
124 Utility.logInfo("The number of sameAs assertions in RL lower store: " + rlLowerStore.getSameAsNumber()); 129 Utility.logInfo("The number of sameAs assertions in RL lower store: " + rlLowerStore.getSameAsNumber());
125 130
126 String originalMarkProgram = OWLHelper.getOriginalMarkProgram(ontology); 131 String originalMarkProgram = OWLHelper.getOriginalMarkProgram(ontology);
127 132
128 elLowerStore.importRDFData(name, datafile); 133 elLowerStore.importRDFData(name, datafile);
129 elLowerStore.materialise("saturate named individuals", originalMarkProgram); 134 elLowerStore.materialise("saturate named individuals", originalMarkProgram);
130 elLowerStore.materialise("lower program", program.getLower().toString()); 135 elLowerStore.materialise("lower program", program.getLower().toString());
131 elLowerStore.initialiseKarma(); 136 elLowerStore.initialiseKarma();
132 if (!consistency.checkELLowerBound()) return false; 137 if (!consistency.checkELLowerBound()) return false;
133 138
134 if (lazyUpperStore != null) { 139 if (lazyUpperStore != null) {
135 lazyUpperStore.importRDFData(name, datafile); 140 lazyUpperStore.importRDFData(name, datafile);
136 lazyUpperStore.materialise("saturate named individuals", originalMarkProgram); 141 lazyUpperStore.materialise("saturate named individuals", originalMarkProgram);
137 int tag = lazyUpperStore.materialiseRestrictedly(program, null); 142 int tag = lazyUpperStore.materialiseRestrictedly(program, null);
138 if (tag != 1) { 143 if (tag != 1) {
139 lazyUpperStore.dispose(); 144 lazyUpperStore.dispose();
140 lazyUpperStore = null; 145 lazyUpperStore = null;
141 } 146 }
142 if (tag == -1) return false; 147 if (tag == -1) return false;
143 } 148 }
144 if (consistency.checkLazyUpper()) { 149 if (consistency.checkLazyUpper()) {
145 satisfiable = true; 150 satisfiable = true;
146 Utility.logInfo("time for satisfiability checking: " + t.duration()); 151 Utility.logInfo("time for satisfiability checking: " + t.duration());
147 } 152 }
148 153
154 // TODO add new upper store preprocessing
155
149 trackingStore.importRDFData(name, datafile); 156 trackingStore.importRDFData(name, datafile);
150 trackingStore.materialise("saturate named individuals", originalMarkProgram); 157 trackingStore.materialise("saturate named individuals", originalMarkProgram);
151 158
152// materialiseFullUpper(); 159// materialiseFullUpper();
153 GapByStore4ID gap = new GapByStore4ID(trackingStore); 160 GapByStore4ID gap = new GapByStore4ID(trackingStore);
154 trackingStore.materialiseFoldedly(program, gap); 161 trackingStore.materialiseFoldedly(program, gap);
155 predicatesWithGap = gap.getPredicatesWithGap(); 162 predicatesWithGap = gap.getPredicatesWithGap();
156 gap.clear(); 163 gap.clear();
157 164
158 if (program.getGeneral().isHorn()) 165 if (program.getGeneral().isHorn())
159 encoder = new TrackingRuleEncoderWithGap(program.getUpper(), trackingStore); 166 encoder = new TrackingRuleEncoderWithGap(program.getUpper(), trackingStore);
160 else 167 else
161 encoder = new TrackingRuleEncoderDisjVar1(program.getUpper(), trackingStore); 168 encoder = new TrackingRuleEncoderDisjVar1(program.getUpper(), trackingStore);
162// encoder = new TrackingRuleEncoderDisj1(program.getUpper(), trackingStore); 169// encoder = new TrackingRuleEncoderDisj1(program.getUpper(), trackingStore);
163// encoder = new TrackingRuleEncoderDisjVar2(program.getUpper(), trackingStore); 170// encoder = new TrackingRuleEncoderDisjVar2(program.getUpper(), trackingStore);
164// encoder = new TrackingRuleEncoderDisj2(program.getUpper(), trackingStore); 171// encoder = new TrackingRuleEncoderDisj2(program.getUpper(), trackingStore);
165 172
166 program.deleteABoxTurtleFile(); 173 program.deleteABoxTurtleFile();
167 174
168 if (!isConsistent()) 175 if (!isConsistent())
169 return false; 176 return false;
170 177
171 consistency.extractBottomFragment(); 178 consistency.extractBottomFragment();
172 return true; 179 return true;
173 } 180 }
174 181
175 private Boolean satisfiable;
176 private ConsistencyManager consistency = new ConsistencyManager(this);
177
178 TrackingRuleEncoder encoder;
179
180 @Override 182 @Override
181 public boolean isConsistent() { 183 public boolean isConsistent() {
182 if (satisfiable == null) { 184 if (satisfiable == null) {
183 satisfiable = consistency.check(); 185 satisfiable = consistency.check();
184 Utility.logInfo("time for satisfiability checking: " + t.duration()); 186 Utility.logInfo("time for satisfiability checking: " + t.duration());
185 } 187 }
186 return satisfiable; 188 return satisfiable;
187 } 189 }
188
189 Timer t = new Timer();
190 190
191 private OWLOntology relevantPart(QueryRecord queryRecord) { 191 private OWLOntology relevantPart(QueryRecord queryRecord) {
192 AnswerTuples rlAnswer = null, elAnswer = null; 192 AnswerTuples rlAnswer = null, elAnswer = null;
@@ -209,22 +209,29 @@ public class MyQueryReasoner extends QueryReasoner {
209 209
210 queryUpperBound(upperStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables()); 210 queryUpperBound(upperStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables());
211 211
212 // TODO log correct partial answers
213// Utility.logDebug(toJson("upperBound1", queryRecord));
214 if (!queryRecord.processed() && !queryRecord.getQueryText().equals(extendedQuery[0])) { 212 if (!queryRecord.processed() && !queryRecord.getQueryText().equals(extendedQuery[0])) {
215 queryUpperBound(upperStore, queryRecord, extendedQuery[0], queryRecord.getAnswerVariables()); 213 queryUpperBound(upperStore, queryRecord, extendedQuery[0], queryRecord.getAnswerVariables());
216// Utility.logDebug(toJson("upperBound2", queryRecord));
217 } 214 }
218 if (!queryRecord.processed() && queryRecord.hasNonAnsDistinguishedVariables()) { 215 if (!queryRecord.processed() && queryRecord.hasNonAnsDistinguishedVariables()) {
219 queryUpperBound(upperStore, queryRecord, extendedQuery[1], queryRecord.getDistinguishedVariables()); 216 queryUpperBound(upperStore, queryRecord, extendedQuery[1], queryRecord.getDistinguishedVariables());
220// Utility.logDebug(toJson("upperBound3", queryRecord));
221 } 217 }
222 218
219 Utility.logDebug(toJsonKeyValuePair("upperBound1", queryRecord));
220
221 // TODO check whether it is harmful. In case is not, implement it properly
222 // BEGIN: trying to intersect
223 if (!queryRecord.isBottom() && lazyUpperStore != null) {
224 queryUpperBound(trackingStore, queryRecord, queryRecord.getQueryText(), queryRecord.getAnswerVariables());
225 }
226 // END: trying to intersect
227
223 queryRecord.addProcessingTime(Step.UpperBound, t.duration()); 228 queryRecord.addProcessingTime(Step.UpperBound, t.duration());
224 if (queryRecord.processed()) { 229 if (queryRecord.processed()) {
225 queryRecord.setDifficulty(Step.UpperBound); 230 queryRecord.setDifficulty(Step.UpperBound);
226 return null; 231 return null;
227 } 232 }
233
234 // TODO add evaluation on new upper store
228 235
229 t.reset(); 236 t.reset();
230 try { 237 try {
@@ -280,7 +287,7 @@ public class MyQueryReasoner extends QueryReasoner {
280 287
281// int counter = 0; 288// int counter = 0;
282 289
283 private String toJson(String key, Object value) { 290 private String toJsonKeyValuePair(String key, Object value) {
284 HashMap<String, Object> map = new HashMap<>(); 291 HashMap<String, Object> map = new HashMap<>();
285 map.put(key, value); 292 map.put(key, value);
286 return QueryRecord.GsonCreator.getInstance().toJson(map); 293 return QueryRecord.GsonCreator.getInstance().toJson(map);