aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/uk/ac/ox/cs/hermit/HermitQueryReasoner.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/uk/ac/ox/cs/hermit/HermitQueryReasoner.java')
-rw-r--r--src/test/java/uk/ac/ox/cs/hermit/HermitQueryReasoner.java200
1 files changed, 200 insertions, 0 deletions
diff --git a/src/test/java/uk/ac/ox/cs/hermit/HermitQueryReasoner.java b/src/test/java/uk/ac/ox/cs/hermit/HermitQueryReasoner.java
new file mode 100644
index 0000000..957790f
--- /dev/null
+++ b/src/test/java/uk/ac/ox/cs/hermit/HermitQueryReasoner.java
@@ -0,0 +1,200 @@
1package uk.ac.ox.cs.hermit;
2
3import org.semanticweb.HermiT.Reasoner;
4import org.semanticweb.HermiT.model.Atom;
5import org.semanticweb.HermiT.model.AtomicRole;
6import org.semanticweb.owlapi.model.*;
7import org.semanticweb.owlapi.model.parameters.Imports;
8import org.semanticweb.owlapi.reasoner.Node;
9import uk.ac.ox.cs.pagoda.owl.OWLHelper;
10import uk.ac.ox.cs.pagoda.owl.QueryRoller;
11import uk.ac.ox.cs.pagoda.query.QueryManager;
12import uk.ac.ox.cs.pagoda.query.QueryRecord;
13import uk.ac.ox.cs.pagoda.util.Timer;
14
15import java.io.*;
16import java.util.HashSet;
17import java.util.Set;
18import java.util.concurrent.*;
19
20public class HermitQueryReasoner {
21
22 public static void main(String... args) throws FileNotFoundException, OWLOntologyCreationException, OWLOntologyStorageException {
23 if (args.length == 0) {
24// args = new String[] {"/media/krr-nas-share/Yujiao/ontologies/lubm/lubm1_merged.owl", null, PagodaTester.lubm_query};
25// args = new String[] {"/users/yzhou/ontologies/uobm/uobm1_merged.owl", null, "/users/yzhou/ontologies/uobm/queries/standard.sparql"};
26// args = new String[] {"/users/yzhou/ontologies/fly/fly_anatomy_XP_with_GJ_FC_individuals.owl", null, "/users/yzhou/ontologies/fly/queries/fly.sparql"};
27// args = new String[] {"/media/krr-nas-share/Yujiao/ontologies/npd/npd-all-minus-datatype.owl", "/media/krr-nas-share/Yujiao/ontologies/npd/data/npd-data-dump-minus-datatype-new.ttl", "/users/yzhou/ontologies/npd/queries/atomic.sparql"};
28// args = new String[] {"/media/krr-nas-share/Yujiao/ontologies/npd/npd-all.owl", "/media/krr-nas-share/Yujiao/ontologies/npd/data/npd-data-dump-processed.ttl", "/users/yzhou/ontologies/npd/queries/atomic.sparql"};
29// args = new String[] {PagodaTester.dbpedia_tbox, PagodaTester.dbpedia_abox, PagodaTester.dbpedia_query};
30// args = new String[] {"/users/yzhou/ontologies/answersCorrectness/unsatisfiable.owl", null, "/users/yzhou/ontologies/answersCorrectness/unsatisfiable_queries.sparql"};
31
32// args = new String[] {"/media/krr-nas-share/Yujiao/ontologies/bio2rdf/chembl/cco-processed-noDPR-noDPD.ttl", "/media/krr-nas-share/Yujiao/ontologies/bio2rdf/chembl/graph sampling/sample_100.nt", "/media/krr-nas-share/Yujiao/ontologies/bio2rdf/chembl/queries/atomic_one_filtered.sparql", "../answersCorrectness-share/results/chembl/hermit_1p"};
33 args =
34 new String[]{"/users/yzhou/temp/uniprot_debug/core-processed-noDis.owl", "/users/yzhou/temp/uniprot_debug/sample_1_removed.nt", "/media/krr-nas-share/Yujiao/ontologies/bio2rdf/uniprot/queries/atomic_one.sparql", "../answersCorrectness-share/results/uniprot/hermit_1p"};
35 }
36// args = new String[] {"imported.owl", "", "/media/krr-nas-share/Yujiao/ontologies/bio2rdf/uniprot/queries/atomic_one.sparql", "../answersCorrectness-share/results/uniprot/hermit_1p"}; }
37
38
39 PrintStream ps = args.length < 4 ? null : new PrintStream(new File(args[3]));
40 for (int i = 0; i < args.length; ++i) {
41 if (args[i] == null || args[i].equalsIgnoreCase("null")) args[i] = "";
42 System.out.println("Argument " + i + ": " + args[i]);
43 }
44
45// PrintStream ps = null; // new PrintStream(new File("../answersCorrectness-share/results/reactome/ "));
46 if (ps != null) System.setOut(ps);
47
48 Timer t = new Timer();
49 OWLOntology onto = OWLHelper.loadOntology(args[0]);
50 OWLOntologyManager man = onto.getOWLOntologyManager();
51
52 OWLDatatype date = man.getOWLDataFactory().getOWLDatatype(IRI.create("http://www.w3.org/2001/XMLSchema#date"));
53
54 if (onto.containsEntityInSignature(date)) {
55 for (OWLOntology o: onto.getImportsClosure())
56 for (OWLAxiom axiom: o.getAxioms())
57 if (axiom.getDatatypesInSignature().contains(date)) {
58 System.out.println("The axiom: " + axiom + " is being ingored. ");
59 man.removeAxiom(onto, axiom);
60 }
61 man.saveOntology(onto, new FileOutputStream(args[0] = "tbox_hermit.owl"));
62 man.removeOntology(onto);
63 onto = OWLHelper.loadOntology(man, args[0]);
64 System.out.println("TBox processed in " + t.duration());
65 }
66
67 try {
68 onto = OWLHelper.getImportedOntology(onto, args[1]);
69 } catch (IOException e) {
70 e.printStackTrace();
71 }
72 System.out.println("Ontology loaded in " + t.duration());
73 System.out.println("ABox axioms:" + onto.getABoxAxioms(Imports.INCLUDED).size());
74// for (OWLOntology o: onto.getImportsClosure())
75// for (OWLAxiom axiom: o.getAxioms())
76// System.out.println(axiom);
77
78 Reasoner hermit = new Reasoner(onto);
79 if (!hermit.isConsistent()) {
80 System.out.println("The ontology is inconsistent.");
81 return ;
82 }
83 System.out.println("Preprocessing DONE in " + t.duration());
84
85// System.out.println(hermit.isConsistent());
86
87 QueryManager queryManager = new QueryManager();
88 QueryRoller roller = new QueryRoller(onto.getOWLOntologyManager().getOWLDataFactory());
89 int failedCounter = 0;
90 Timer total = new Timer();
91 for (QueryRecord record: queryManager.collectQueryRecords(args[2])) {
92 if (Integer.parseInt(record.getQueryID()) < 10) continue;
93 if (total.duration() > 18000) {
94 System.out.println("Time out 5h.");
95 return ;
96 }
97 System.out.println("--------------------- Query " + record.getQueryID() + " -----------------------");
98 System.out.println(record.getQueryText());
99 ExecutorService exec = Executors.newSingleThreadExecutor();
100 try {
101 Future<Boolean> succ = exec.submit(new QueryThread(record, onto, hermit, roller));
102 try {
103 try {
104 if (record.getQueryID().equals("1"))
105 System.out.println(succ.get(60, TimeUnit.MINUTES));
106 else
107 System.out.println(succ.get(20, TimeUnit.MINUTES));
108 } catch (InterruptedException e) {
109// e.printStackTrace();
110 } catch (ExecutionException e) {
111// e.printStackTrace();
112 } catch (TimeoutException e) {
113// e.printStackTrace();
114 }
115 } finally {
116 if (succ.cancel(true)) {
117 System.out.println("Trying to cancel the current query thread " + (++failedCounter));
118 }
119 }
120 } finally {
121 exec.shutdownNow();
122 }
123 }
124
125 if (ps != null) ps.close();
126 System.exit(0);
127 }
128
129}
130
131class QueryThread implements Callable<Boolean> {
132
133 QueryRecord record;
134 OWLOntology onto;
135 Reasoner hermit;
136 QueryRoller roller;
137
138 public QueryThread(QueryRecord record2, OWLOntology onto2, Reasoner hermit2, QueryRoller roller2) {
139 record = record2; onto = onto2; hermit = hermit2; roller = roller2;
140 }
141
142 @Override
143 public Boolean call() throws Exception {
144 Set<String> answers = new HashSet<String>();
145 Timer t = new Timer();
146 if (record.getDistinguishedVariables().length > 1) {
147 if (record.getDistinguishedVariables().length == 2 && record.getClause().getBodyLength() == 1) {
148 dealWithAtomicBinaryQuery(record.getClause().getBodyAtom(0), answers);
149 System.out.println("Query " + record.getQueryID() + " The number of answers: " + answers.size());
150 System.out.println("Query " + record.getQueryID() + " Total time: " + t.duration());
151 }
152 else {
153 System.out.println("Query " + record.getQueryID() + " The number of answers: Query cannot be processsed.");
154 System.out.println("Query " + record.getQueryID() + " Total time: Query cannot be processsed.");
155 }
156 return false;
157 }
158
159 OWLClassExpression exp = null;
160
161 try {
162 exp = roller.rollUp(record.getClause(), record.getAnswerVariables()[0]);
163 } catch (Exception e) {
164 System.out.println("Query " + record.getQueryID() + " The number of answers: Query cannot be processsed.");
165 System.out.println("Query " + record.getQueryID() + " Total time: Query cannot be processsed.");
166 return false;
167 }
168 System.out.println(exp);
169 for (Node<OWLNamedIndividual> node: hermit.getInstances(exp, false)) {
170 for (OWLIndividual ind: node.getEntities()) {
171 answers.add(ind.toStringID());
172 }
173 }
174 System.out.println("Query " + record.getQueryID() + " The number of answers: " + answers.size());
175 System.out.println("Query " + record.getQueryID() + " Total time: " + t.duration());
176 return true;
177 }
178
179 private void dealWithAtomicBinaryQuery(Atom bodyAtom, Set<String> answers) {
180 StringBuilder sb = new StringBuilder();
181 OWLDataFactory f = onto.getOWLOntologyManager().getOWLDataFactory();
182 OWLObjectProperty p = f.getOWLObjectProperty(IRI.create(((AtomicRole) bodyAtom.getDLPredicate()).getIRI()));
183 for (Node<OWLNamedIndividual> sub: hermit.getInstances(f.getOWLObjectMinCardinality(1, p), false)) {
184 for (Node<OWLNamedIndividual> obj: hermit.getObjectPropertyValues(sub.getRepresentativeElement(), p)) {
185 for (OWLNamedIndividual subInd: sub.getEntities()) {
186 sb.setLength(0);
187 sb.append(subInd.toString()).append(" ");
188 int len = sb.length();
189 for (OWLNamedIndividual objInd: obj.getEntities()) {
190 sb.setLength(len);
191 sb.append(objInd.toString());
192 answers.add(sb.toString());
193 }
194 }
195 }
196 }
197 }
198
199}
200