diff options
| author | RncLsn <rnc.lsn@gmail.com> | 2015-05-12 18:48:56 +0100 |
|---|---|---|
| committer | RncLsn <rnc.lsn@gmail.com> | 2015-05-12 18:48:56 +0100 |
| commit | 0c2726db44b562cbda9bfa87e76d829927c31ec8 (patch) | |
| tree | f4a681da5802ca90888719171a05a5d5cf78f040 /src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java | |
| parent | 4fe4ca32d8f45807ab881b6fb8e814842dad0ec6 (diff) | |
| download | ACQuA-0c2726db44b562cbda9bfa87e76d829927c31ec8.tar.gz ACQuA-0c2726db44b562cbda9bfa87e76d829927c31ec8.zip | |
Added classes for implementing new upper store (Limited Skolemisation).
Started implementation of the new classes.
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java')
| -rw-r--r-- | src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java | 129 |
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); |
