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