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