aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java352
1 files changed, 179 insertions, 173 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java
index c74ea58..771190e 100644
--- a/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java
+++ b/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java
@@ -13,181 +13,187 @@ import uk.ac.ox.cs.pagoda.reasoner.light.KarmaQueryEngine;
13import uk.ac.ox.cs.pagoda.rules.DatalogProgram; 13import uk.ac.ox.cs.pagoda.rules.DatalogProgram;
14import uk.ac.ox.cs.pagoda.util.Timer; 14import uk.ac.ox.cs.pagoda.util.Timer;
15import uk.ac.ox.cs.pagoda.util.Utility; 15import uk.ac.ox.cs.pagoda.util.Utility;
16import uk.ac.ox.cs.pagoda.util.disposable.DisposedException;
16 17
17class ELHOUQueryReasoner extends QueryReasoner { 18class ELHOUQueryReasoner extends QueryReasoner {
18 19
19 DatalogProgram program; 20 DatalogProgram program;
20 21
21 BasicQueryEngine rlLowerStore; 22 BasicQueryEngine rlLowerStore;
22 BasicQueryEngine rlUpperStore; 23 BasicQueryEngine rlUpperStore;
23 24
24 OWLOntology elho_ontology; 25 OWLOntology elho_ontology;
25 KarmaQueryEngine elLowerStore = null; 26 KarmaQueryEngine elLowerStore = null;
26 27
27 boolean multiStageTag, equalityTag; 28 boolean multiStageTag, equalityTag;
28 String originalMarkProgram; 29 String originalMarkProgram;
29 private Timer t = new Timer(); 30 private Timer t = new Timer();
30 31
31 public ELHOUQueryReasoner(boolean multiStageTag, boolean considerEqualities) { 32 public ELHOUQueryReasoner(boolean multiStageTag, boolean considerEqualities) {
32 this.multiStageTag = multiStageTag; 33 this.multiStageTag = multiStageTag;
33 this.equalityTag = considerEqualities; 34 this.equalityTag = considerEqualities;
34 rlLowerStore = new BasicQueryEngine("rl-lower-bound"); 35 rlLowerStore = new BasicQueryEngine("rl-lower-bound");
35 elLowerStore = new KarmaQueryEngine("el-lower-bound"); 36 elLowerStore = new KarmaQueryEngine("el-lower-bound");
36 37
37 if(!multiStageTag) 38 if(!multiStageTag)
38 rlUpperStore = new BasicQueryEngine("rl-upper-bound"); 39 rlUpperStore = new BasicQueryEngine("rl-upper-bound");
39 else 40 else
40 rlUpperStore = new MultiStageQueryEngine("rl-upper-bound", false); 41 rlUpperStore = new MultiStageQueryEngine("rl-upper-bound", false);
41 } 42 }
42 43
43 @Override 44 @Override
44 public void evaluate(QueryRecord queryRecord) { 45 public void evaluate(QueryRecord queryRecord) {
45 AnswerTuples rlAnswer = null; 46 if(isDisposed()) throw new DisposedException();
46 t.reset(); 47 AnswerTuples rlAnswer = null;
47 try { 48 t.reset();
48 rlAnswer = rlLowerStore.evaluate(queryRecord.getQueryText(), queryRecord.getAnswerVariables()); 49 try {
49 queryRecord.updateLowerBoundAnswers(rlAnswer); 50 rlAnswer = rlLowerStore.evaluate(queryRecord.getQueryText(), queryRecord.getAnswerVariables());
50 } finally { 51 queryRecord.updateLowerBoundAnswers(rlAnswer);
51 if(rlAnswer != null) rlAnswer.dispose(); 52 } finally {
52 } 53 if(rlAnswer != null) rlAnswer.dispose();
53 queryRecord.addProcessingTime(Step.LOWER_BOUND, t.duration()); 54 }
54 55 queryRecord.addProcessingTime(Step.LOWER_BOUND, t.duration());
55 String extendedQueryText = queryRecord.getExtendedQueryText().get(0); 56
56 String[] toQuery = queryRecord.getQueryText().equals(extendedQueryText) ? 57 String extendedQueryText = queryRecord.getExtendedQueryText().get(0);
57 new String[]{queryRecord.getQueryText()} : 58 String[] toQuery = queryRecord.getQueryText().equals(extendedQueryText) ?
58 new String[] {queryRecord.getQueryText(), extendedQueryText}; 59 new String[]{queryRecord.getQueryText()} :
59 60 new String[]{queryRecord.getQueryText(), extendedQueryText};
60 for (String queryText: toQuery) { 61
61 rlAnswer = null; 62 for(String queryText : toQuery) {
62 t.reset(); 63 rlAnswer = null;
63 try { 64 t.reset();
64 rlAnswer = rlUpperStore.evaluate(queryText, queryRecord.getAnswerVariables()); 65 try {
65 queryRecord.updateUpperBoundAnswers(rlAnswer); 66 rlAnswer = rlUpperStore.evaluate(queryText, queryRecord.getAnswerVariables());
66 } finally { 67 queryRecord.updateUpperBoundAnswers(rlAnswer);
67 if(rlAnswer != null) rlAnswer.dispose(); 68 } finally {
68 } 69 if(rlAnswer != null) rlAnswer.dispose();
69 queryRecord.addProcessingTime(Step.UPPER_BOUND, t.duration()); 70 }
70 71 queryRecord.addProcessingTime(Step.UPPER_BOUND, t.duration());
71 if(queryRecord.isProcessed()) { 72
72 queryRecord.setDifficulty(Step.UPPER_BOUND); 73 if(queryRecord.isProcessed()) {
73 return; 74 queryRecord.setDifficulty(Step.UPPER_BOUND);
74 } 75 return;
75 } 76 }
76 77 }
77 AnswerTuples elAnswer = null; 78
78 t.reset(); 79 AnswerTuples elAnswer = null;
79 try { 80 t.reset();
80 elAnswer = 81 try {
81 elLowerStore.evaluate(extendedQueryText, queryRecord.getAnswerVariables(), queryRecord.getLowerBoundAnswers()); 82 elAnswer =
82 queryRecord.updateLowerBoundAnswers(elAnswer); 83 elLowerStore.evaluate(extendedQueryText, queryRecord.getAnswerVariables(), queryRecord.getLowerBoundAnswers());
83 } finally { 84 queryRecord.updateLowerBoundAnswers(elAnswer);
84 if (elAnswer != null) elAnswer.dispose(); 85 } finally {
85 } 86 if(elAnswer != null) elAnswer.dispose();
86 queryRecord.addProcessingTime(Step.EL_LOWER_BOUND, t.duration()); 87 }
87 } 88 queryRecord.addProcessingTime(Step.EL_LOWER_BOUND, t.duration());
88 89 }
89 @Override 90
90 public void evaluateUpper(QueryRecord queryRecord) { 91 @Override
91 AnswerTuples rlAnswer = null; 92 public void evaluateUpper(QueryRecord queryRecord) {
92 try { 93 if(isDisposed()) throw new DisposedException();
93 rlAnswer = rlUpperStore.evaluate(queryRecord.getQueryText(), queryRecord.getAnswerVariables()); 94 AnswerTuples rlAnswer = null;
94 queryRecord.updateUpperBoundAnswers(rlAnswer, true); 95 try {
95 } finally { 96 rlAnswer = rlUpperStore.evaluate(queryRecord.getQueryText(), queryRecord.getAnswerVariables());
96 if(rlAnswer != null) rlAnswer.dispose(); 97 queryRecord.updateUpperBoundAnswers(rlAnswer, true);
97 } 98 } finally {
98 } 99 if(rlAnswer != null) rlAnswer.dispose();
99 100 }
100 @Override 101 }
101 public void dispose() { 102
102 if (elLowerStore != null) elLowerStore.dispose(); 103 @Override
103 if(rlUpperStore != null) rlUpperStore.dispose(); 104 public void dispose() {
104 super.dispose(); 105 super.dispose();
105 } 106 if(elLowerStore != null) elLowerStore.dispose();
106 107 if(rlUpperStore != null) rlUpperStore.dispose();
107 @Override 108 }
108 public void loadOntology(OWLOntology o) { 109
109 if (!equalityTag) { 110 @Override
110 EqualitiesEliminator eliminator = new EqualitiesEliminator(o); 111 public void loadOntology(OWLOntology o) {
111 o = eliminator.getOutputOntology(); 112 if(isDisposed()) throw new DisposedException();
112 eliminator.save(); 113 if(!equalityTag) {
113 } 114 EqualitiesEliminator eliminator = new EqualitiesEliminator(o);
114 115 o = eliminator.getOutputOntology();
115 OWLOntology ontology = o; 116 eliminator.save();
116 program = new DatalogProgram(ontology, properties.getToClassify()); 117 }
117 118
118 importData(program.getAdditionalDataFile()); 119 OWLOntology ontology = o;
119 120 program = new DatalogProgram(ontology, properties.getToClassify());
120 elho_ontology = new ELHOProfile().getFragment(ontology); 121
121 elLowerStore.processOntology(elho_ontology); 122 importData(program.getAdditionalDataFile());
122 originalMarkProgram = OWLHelper.getOriginalMarkProgram(ontology); 123
123 } 124 elho_ontology = new ELHOProfile().getFragment(ontology);
124 125 elLowerStore.processOntology(elho_ontology);
125 @Override 126 originalMarkProgram = OWLHelper.getOriginalMarkProgram(ontology);
126 public boolean preprocess() { 127 }
127 String name = "data", datafile = importedData.toString(); 128
128 129 @Override
129 String lowername = "lower program"; 130 public boolean preprocess() {
130 String rlLowerProgramText = program.getLower().toString(); 131 if(isDisposed()) throw new DisposedException();
131 132 String name = "data", datafile = importedData.toString();
132 rlUpperStore.importRDFData(name, datafile); 133
133 rlUpperStore.materialise("saturate named individuals", originalMarkProgram); 134 String lowername = "lower program";
134 135 String rlLowerProgramText = program.getLower().toString();
135 int flag = rlUpperStore.materialiseRestrictedly(program, null); 136
136 if (flag != 1) { 137 rlUpperStore.importRDFData(name, datafile);
137 if (flag == -1) return false; 138 rlUpperStore.materialise("saturate named individuals", originalMarkProgram);
138 rlUpperStore.dispose(); 139
139 140 int flag = rlUpperStore.materialiseRestrictedly(program, null);
140 if (!multiStageTag) 141 if(flag != 1) {
141 rlUpperStore = new BasicQueryEngine("rl-upper-bound"); 142 if(flag == -1) return false;
142 else 143 rlUpperStore.dispose();
143 rlUpperStore = new MultiStageQueryEngine("rl-upper-bound", false); 144
144 rlUpperStore.importRDFData(name, datafile); 145 if(!multiStageTag)
145 rlUpperStore.materialise("saturate named individuals", originalMarkProgram); 146 rlUpperStore = new BasicQueryEngine("rl-upper-bound");
146 rlUpperStore.materialiseFoldedly(program, null); 147 else
147 } 148 rlUpperStore = new MultiStageQueryEngine("rl-upper-bound", false);
148 Utility.logInfo("upper store ready."); 149 rlUpperStore.importRDFData(name, datafile);
149 150 rlUpperStore.materialise("saturate named individuals", originalMarkProgram);
150 rlLowerStore.importRDFData(name, datafile); 151 rlUpperStore.materialiseFoldedly(program, null);
151 rlLowerStore.materialise(lowername, rlLowerProgramText); 152 }
152 Utility.logInfo("lower store ready."); 153 Utility.logInfo("upper store ready.");
153 154
154 elLowerStore.importRDFData(name, datafile); 155 rlLowerStore.importRDFData(name, datafile);
155 elLowerStore.materialise("saturate named individuals", originalMarkProgram); 156 rlLowerStore.materialise(lowername, rlLowerProgramText);
156 elLowerStore.materialise(lowername, rlLowerProgramText); 157 Utility.logInfo("lower store ready.");
157 158
158 elLowerStore.initialiseKarma(); 159 elLowerStore.importRDFData(name, datafile);
159 Utility.logInfo("EL lower store ready."); 160 elLowerStore.materialise("saturate named individuals", originalMarkProgram);
160 161 elLowerStore.materialise(lowername, rlLowerProgramText);
161 if (!isConsistent()) { 162
162 Utility.logInfo("The dataset is not consistent with the ontology."); 163 elLowerStore.initialiseKarma();
163 return false; 164 Utility.logInfo("EL lower store ready.");
164 } 165
165 Utility.logInfo("The dataset is consistent."); 166 if(!isConsistent()) {
166 return true; 167 Utility.logInfo("The dataset is not consistent with the ontology.");
167 } 168 return false;
168 169 }
169 @Override 170 Utility.logInfo("The dataset is consistent.");
170 public boolean isConsistent() { 171 return true;
171 Utility.logInfo("Start checking consistency... "); 172 }
172 String[] X = new String[] {"X"}; 173
173 AnswerTuples ans = null; 174 @Override
174 try { 175 public boolean isConsistent() {
175 ans = rlUpperStore.evaluate(QueryRecord.botQueryText, X); 176 if(isDisposed()) throw new DisposedException();
176 if (!ans.isValid()) return true; 177 Utility.logInfo("Start checking consistency... ");
177 } finally { 178 String[] X = new String[]{"X"};
178 if (ans != null) ans.dispose(); 179 AnswerTuples ans = null;
179 } 180 try {
180 181 ans = rlUpperStore.evaluate(QueryRecord.botQueryText, X);
181 ans = null; 182 if(!ans.isValid()) return true;
182 try { 183 } finally {
183 ans = elLowerStore.evaluate(QueryRecord.botQueryText, X); 184 if(ans != null) ans.dispose();
184 if (ans.isValid()) return false; 185 }
185 } finally { 186
186 if (ans != null) ans.dispose(); 187 ans = null;
187 } 188 try {
188 189 ans = elLowerStore.evaluate(QueryRecord.botQueryText, X);
189 Utility.logDebug("The consistency of the data has not been determined yet."); 190 if(ans.isValid()) return false;
190 return true; 191 } finally {
191 } 192 if(ans != null) ans.dispose();
193 }
194
195 Utility.logDebug("The consistency of the data has not been determined yet.");
196 return true;
197 }
192 198
193} 199}