aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java
new file mode 100644
index 0000000..5511691
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java
@@ -0,0 +1,133 @@
1package uk.ac.ox.cs.pagoda.reasoner;
2
3import java.io.File;
4import java.io.IOException;
5import java.util.HashSet;
6import java.util.Set;
7
8import org.semanticweb.HermiT.Reasoner;
9import org.semanticweb.owlapi.model.OWLClassExpression;
10import org.semanticweb.owlapi.model.OWLDataFactory;
11import org.semanticweb.owlapi.model.OWLNamedIndividual;
12import org.semanticweb.owlapi.model.OWLOntology;
13import org.semanticweb.owlapi.model.OWLOntologyCreationException;
14import org.semanticweb.owlapi.model.OWLOntologyStorageException;
15
16import uk.ac.ox.cs.JRDFox.model.Individual;
17import uk.ac.ox.cs.pagoda.multistage.MultiStageQueryEngine;
18import uk.ac.ox.cs.pagoda.owl.OWLHelper;
19import uk.ac.ox.cs.pagoda.owl.QueryRoller;
20import uk.ac.ox.cs.pagoda.query.AnswerTuple;
21import uk.ac.ox.cs.pagoda.query.AnswerTuples;
22import uk.ac.ox.cs.pagoda.query.AnswerTuplesImp;
23import uk.ac.ox.cs.pagoda.query.GapByStore4ID;
24import uk.ac.ox.cs.pagoda.query.QueryRecord;
25import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine;
26import uk.ac.ox.cs.pagoda.rules.DatalogProgram;
27import uk.ac.ox.cs.pagoda.util.Utility;
28
29public class HermiTReasoner extends QueryReasoner {
30
31 Reasoner hermit;
32
33 BasicQueryEngine upperStore = null;
34
35 OWLOntology onto;
36 OWLDataFactory factory;
37
38 String importedOntologyPath = null;
39
40 QueryRoller roller;
41 boolean toCheckSatisfiability;
42
43 public HermiTReasoner(boolean toCheckSatisfiability) {
44 this.toCheckSatisfiability = toCheckSatisfiability;
45 }
46
47 @Override
48 public void loadOntology(OWLOntology ontology) {
49 onto = ontology;
50 }
51
52 @Override
53 public boolean preprocess() {
54 OWLOntology tbox = onto;
55 try {
56 onto = OWLHelper.getImportedOntology(tbox, importedData.toString().split(ImportDataFileSeparator));
57 importedOntologyPath = OWLHelper.getOntologyPath(onto);
58 } catch (OWLOntologyCreationException e) {
59 // TODO Auto-generated catch block
60 e.printStackTrace();
61 } catch (OWLOntologyStorageException e) {
62 // TODO Auto-generated catch block
63 e.printStackTrace();
64 } catch (IOException e) {
65 // TODO Auto-generated catch block
66 e.printStackTrace();
67 }
68
69 DatalogProgram datalogProgram = new DatalogProgram(tbox, false);
70 importData(datalogProgram.getAdditionalDataFile());
71 upperStore = new MultiStageQueryEngine("rl-upper", false);
72 upperStore.importRDFData("data", importedData.toString());
73 GapByStore4ID gap = new GapByStore4ID(upperStore);
74 upperStore.materialiseFoldedly(datalogProgram, gap);
75 gap.clear();
76
77 factory = onto.getOWLOntologyManager().getOWLDataFactory();
78 roller = new QueryRoller(factory);
79
80 hermit = new Reasoner(onto);
81 return isConsistent();
82 }
83
84 @Override
85 public boolean isConsistent() {
86 if (toCheckSatisfiability)
87 return hermit.isConsistent();
88 return true;
89 }
90
91 @Override
92 public void evaluate(QueryRecord record) {
93 String[] disVars = record.getDistinguishedVariables();
94 Set<OWLNamedIndividual> individuals = onto.getIndividualsInSignature(true);
95 if (disVars.length == 1) {
96 OWLClassExpression clsExp = roller.rollUp(record.getClause(), record.getAnswerVariables()[0]);
97 Set<AnswerTuple> answers = new HashSet<AnswerTuple>();
98 for (OWLNamedIndividual individual: individuals) {
99 Utility.logDebug("checking ... " + individual);
100 if (hermit.isEntailed(factory.getOWLClassAssertionAxiom(clsExp, individual))) {
101 answers.add(new AnswerTuple(new Individual[] {Individual.create(individual.toStringID())}));
102 }
103 }
104 record.updateLowerBoundAnswers(new AnswerTuplesImp(record.getAnswerVariables(), answers));
105 record.markAsProcessed();
106 }
107 else {
108 // FIXME join here
109 record.markAsProcessed();
110 }
111 }
112
113 @Override
114 public void evaluateUpper(QueryRecord record) {
115 AnswerTuples rlAnswer = null;
116 try {
117 rlAnswer = upperStore.evaluate(record.getQueryText(), record.getAnswerVariables());
118 record.updateUpperBoundAnswers(rlAnswer, true);
119 } finally {
120 if (rlAnswer != null) rlAnswer.dispose();
121 }
122 }
123
124 @Override
125 public void dispose() {
126 if (importedOntologyPath != null) {
127 File tmp = new File(importedOntologyPath);
128 if (tmp.exists()) tmp.delete();
129 }
130 super.dispose();
131 }
132
133}