From 4b7253559c290b6fdd1c4122830f153fda85dd62 Mon Sep 17 00:00:00 2001 From: RncLsn Date: Fri, 29 May 2015 18:35:51 +0100 Subject: Disposable. --- .../cs/pagoda/reasoner/light/BasicQueryEngine.java | 720 +++++++++++---------- .../cs/pagoda/reasoner/light/KarmaQueryEngine.java | 155 ++--- .../pagoda/reasoner/light/RDFoxAnswerTuples.java | 44 +- .../cs/pagoda/reasoner/light/RDFoxQueryEngine.java | 219 ++++--- 4 files changed, 578 insertions(+), 560 deletions(-) (limited to 'src/uk/ac/ox/cs/pagoda/reasoner/light') diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/light/BasicQueryEngine.java b/src/uk/ac/ox/cs/pagoda/reasoner/light/BasicQueryEngine.java index 79be8aa..fe43e09 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/light/BasicQueryEngine.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/light/BasicQueryEngine.java @@ -1,375 +1,377 @@ package uk.ac.ox.cs.pagoda.reasoner.light; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; - import org.semanticweb.HermiT.model.DLClause; - +import uk.ac.ox.cs.JRDFox.JRDFStoreException; +import uk.ac.ox.cs.JRDFox.store.DataStore; +import uk.ac.ox.cs.JRDFox.store.DataStore.UpdateType; +import uk.ac.ox.cs.JRDFox.store.Parameters; +import uk.ac.ox.cs.JRDFox.store.TripleStatus; +import uk.ac.ox.cs.JRDFox.store.TupleIterator; import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; import uk.ac.ox.cs.pagoda.query.AnswerTuples; import uk.ac.ox.cs.pagoda.query.GapByStore4ID; import uk.ac.ox.cs.pagoda.rules.DatalogProgram; import uk.ac.ox.cs.pagoda.rules.Program; -import uk.ac.ox.cs.pagoda.util.ConjunctiveQueryHelper; -import uk.ac.ox.cs.pagoda.util.Namespace; +import uk.ac.ox.cs.pagoda.util.*; import uk.ac.ox.cs.pagoda.util.Timer; -import uk.ac.ox.cs.pagoda.util.UFS; -import uk.ac.ox.cs.pagoda.util.Utility; -import uk.ac.ox.cs.JRDFox.JRDFStoreException; -import uk.ac.ox.cs.JRDFox.store.DataStore; -import uk.ac.ox.cs.JRDFox.store.Parameters; -import uk.ac.ox.cs.JRDFox.store.TripleStatus; -import uk.ac.ox.cs.JRDFox.store.TupleIterator; -import uk.ac.ox.cs.JRDFox.store.DataStore.UpdateType; +import uk.ac.ox.cs.pagoda.util.disposable.DisposedException; + +import java.util.*; public class BasicQueryEngine extends RDFoxQueryEngine { - protected DataStore store; - protected Parameters parameters = new Parameters(); - - public BasicQueryEngine(String name) { - super(name); - store = RDFoxQueryEngine.createDataStore(); - parameters.m_allAnswersInRoot = true; - parameters.m_useBushy = true; - } - - public void materialiseFoldedly(DatalogProgram dProgram, GapByStore4ID gap) { - if (gap != null) { - materialise("lower program", dProgram.getLower().toString()); - String program = dProgram.getUpper().toString(); - try { - gap.compile(program); - gap.addBackTo(); - getDataStore().clearRulesAndMakeFactsExplicit(); - } catch (JRDFStoreException e) { - e.printStackTrace(); - } finally { - gap.clear(); - } - } - else - materialise("upper program", dProgram.getUpper().toString()); - } - - public int materialiseRestrictedly(DatalogProgram dProgram, GapByStore4ID gap) { - if (gap != null) { - materialise("lower program", dProgram.getLower().toString()); - String program = dProgram.getUpper().toString(); - try { - gap.compile(program); - gap.addBackTo(); - getDataStore().clearRulesAndMakeFactsExplicit(); - } catch (JRDFStoreException e) { - e.printStackTrace(); - } finally { - gap.clear(); - } - } - else - materialise("upper program", dProgram.getUpper().toString()); - - return 1; - } - - @Override - public AnswerTuples evaluate(String queryText) { - return evaluate(queryText, ConjunctiveQueryHelper.getAnswerVariables(queryText)[0]); - } - - @Override - public AnswerTuples evaluate(String queryText, String[] answerVars) { - TupleIterator tupleIterator; - try { - tupleIterator = store.compileQuery(queryText.replace("_:", "?"), prefixes, parameters); - } catch (JRDFStoreException e) { - e.printStackTrace(); - return null; - } - return new RDFoxAnswerTuples(answerVars, tupleIterator); - } - - @Override - public DataStore getDataStore() { - return store; - } - - @Override - public void dispose() { - store.dispose(); - } - - protected void outputClassAssertions(String filename) { - TupleIterator allTuples = null; - boolean redirect = false; - try { - allTuples = getDataStore().compileQuery("SELECT ?X ?Z WHERE { ?X <" + Namespace.RDF_TYPE + "> ?Z }", prefixes, parameters); - redirect = Utility.redirectCurrentOut(filename); - for (long multi = allTuples.open(); multi != 0; multi = allTuples.getNext()) - System.out.println(RDFoxTripleManager.getQuotedTerm(allTuples.getResource(0)) + " " + RDFoxTripleManager.getQuotedTerm(allTuples.getResource(1))); - } catch (JRDFStoreException e) { - e.printStackTrace(); - } finally { - if (redirect) Utility.closeCurrentOut(); - if (allTuples != null) allTuples.dispose(); - } - } - - public void outputInstance4BinaryPredicate(String iri, String filename) { - Utility.redirectCurrentOut(filename); - outputInstance4BinaryPredicate(iri); - Utility.closeCurrentOut(); - } - - public void outputInstance4BinaryPredicate(String iri) { - outputAnswers("select ?x ?y where { ?x <" + iri + "> ?y . }"); - } - - public void outputInstanceNumbers(String filename) { - TupleIterator predicateTuples = null; - TupleIterator instanceTuples; - Set number = new HashSet(); - String predicate; - try { - predicateTuples = getDataStore().compileQuery("SELECT DISTINCT ?Y WHERE { ?X <" + Namespace.RDF_TYPE + "> ?Y }", prefixes, parameters); - for (long multi = predicateTuples.open(); multi != 0; multi = predicateTuples.getNext()) { - predicate = RDFoxTripleManager.getQuotedTerm(predicateTuples.getResource(0)); - instanceTuples = null; - try { - instanceTuples = getDataStore().compileQuery("SELECT ?X WHERE { ?X <" + Namespace.RDF_TYPE + "> " + predicate + " }", prefixes, parameters); - long totalCount = 0; - for (long multi1 = instanceTuples.open(); multi1 != 0; multi1 = instanceTuples.getNext()) { - totalCount += instanceTuples.getMultiplicity(); - } - number.add(predicate + " * " + totalCount); - } finally { - if (instanceTuples != null) instanceTuples.dispose(); - } - } - } catch (JRDFStoreException e) { - e.printStackTrace(); - } finally { - if (predicateTuples != null) predicateTuples.dispose(); - predicateTuples = null; - } - - try { - predicateTuples = getDataStore().compileQuery("SELECT DISTINCT ?Y WHERE { ?X ?Y ?Z }", prefixes, parameters); - for (long multi = predicateTuples.open(); multi != 0; multi = predicateTuples.getNext()) { - predicate = RDFoxTripleManager.getQuotedTerm(predicateTuples.getResource(0)); - instanceTuples = null; - try { - instanceTuples = getDataStore().compileQuery("SELECT ?X ?Z WHERE { ?X " + predicate + " ?Z }", prefixes, parameters); - ; - long totalCount = 0; - for (long multi1 = instanceTuples.open(); multi1 != 0; multi1 = instanceTuples.getNext()) - totalCount += instanceTuples.getMultiplicity(); - number.add(predicate + " * " + totalCount); - } finally { - if (instanceTuples != null) instanceTuples.dispose(); - } - } - - } catch (JRDFStoreException e) { - e.printStackTrace(); - } finally { - if (predicateTuples != null) predicateTuples.dispose(); - predicateTuples = null; - } - - Utility.redirectCurrentOut(filename); - String[] ordered = number.toArray(new String[0]); - Arrays.sort(ordered, new DLPredicateComparator()); - for (String line: ordered) System.out.println(line); - Utility.closeCurrentOut(); - - } - - public TupleIterator internal_evaluateAgainstIDBs(String queryText) throws JRDFStoreException { - TupleIterator iter = store.compileQuery(queryText, prefixes, parameters, TripleStatus.TUPLE_STATUS_IDB.union(TripleStatus.TUPLE_STATUS_EDB), TripleStatus.TUPLE_STATUS_IDB); + protected DataStore store; + protected Parameters parameters = new Parameters(); + Set materialisedRules = new HashSet(); + private UFS equalityGroups = null; + + public BasicQueryEngine(String name) { + super(name); + store = RDFoxQueryEngine.createDataStore(); + parameters.m_allAnswersInRoot = true; + parameters.m_useBushy = true; + } + + public void materialiseFoldedly(DatalogProgram dProgram, GapByStore4ID gap) { + if(isDisposed()) throw new DisposedException(); + if(gap != null) { + materialise("lower program", dProgram.getLower().toString()); + String program = dProgram.getUpper().toString(); + try { + gap.compile(program); + gap.addBackTo(); + getDataStore().clearRulesAndMakeFactsExplicit(); + } catch(JRDFStoreException e) { + e.printStackTrace(); + } finally { + gap.clear(); + } + } + else + materialise("upper program", dProgram.getUpper().toString()); + } + + public int materialiseRestrictedly(DatalogProgram dProgram, GapByStore4ID gap) { + if(isDisposed()) throw new DisposedException(); + if(gap != null) { + materialise("lower program", dProgram.getLower().toString()); + String program = dProgram.getUpper().toString(); + try { + gap.compile(program); + gap.addBackTo(); + getDataStore().clearRulesAndMakeFactsExplicit(); + } catch(JRDFStoreException e) { + e.printStackTrace(); + } finally { + gap.clear(); + } + } + else + materialise("upper program", dProgram.getUpper().toString()); + + return 1; + } + + @Override + public AnswerTuples evaluate(String queryText) { + if(isDisposed()) throw new DisposedException(); + return evaluate(queryText, ConjunctiveQueryHelper.getAnswerVariables(queryText)[0]); + } + + @Override + public AnswerTuples evaluate(String queryText, String[] answerVars) { + if(isDisposed()) throw new DisposedException(); + TupleIterator tupleIterator; + try { + tupleIterator = store.compileQuery(queryText.replace("_:", "?"), prefixes, parameters); + } catch(JRDFStoreException e) { + e.printStackTrace(); + return null; + } + return new RDFoxAnswerTuples(answerVars, tupleIterator); + } + + @Override + public DataStore getDataStore() { + if(isDisposed()) throw new DisposedException(); + return store; + } + + @Override + public void dispose() { + super.dispose(); + store.dispose(); + } + + public void outputInstance4BinaryPredicate(String iri, String filename) { + Utility.redirectCurrentOut(filename); + outputInstance4BinaryPredicate(iri); + Utility.closeCurrentOut(); + } + + public void outputInstance4BinaryPredicate(String iri) { + outputAnswers("select ?x ?y where { ?x <" + iri + "> ?y . }"); + } + + public void outputInstanceNumbers(String filename) { + TupleIterator predicateTuples = null; + TupleIterator instanceTuples; + Set number = new HashSet(); + String predicate; + try { + predicateTuples = + getDataStore().compileQuery("SELECT DISTINCT ?Y WHERE { ?X <" + Namespace.RDF_TYPE + "> ?Y }", prefixes, parameters); + for(long multi = predicateTuples.open(); multi != 0; multi = predicateTuples.getNext()) { + predicate = RDFoxTripleManager.getQuotedTerm(predicateTuples.getResource(0)); + instanceTuples = null; + try { + instanceTuples = + getDataStore().compileQuery("SELECT ?X WHERE { ?X <" + Namespace.RDF_TYPE + "> " + predicate + " }", prefixes, parameters); + long totalCount = 0; + for(long multi1 = instanceTuples.open(); multi1 != 0; multi1 = instanceTuples.getNext()) { + totalCount += instanceTuples.getMultiplicity(); + } + number.add(predicate + " * " + totalCount); + } finally { + if(instanceTuples != null) instanceTuples.dispose(); + } + } + } catch(JRDFStoreException e) { + e.printStackTrace(); + } finally { + if(predicateTuples != null) predicateTuples.dispose(); + predicateTuples = null; + } + + try { + predicateTuples = + getDataStore().compileQuery("SELECT DISTINCT ?Y WHERE { ?X ?Y ?Z }", prefixes, parameters); + for(long multi = predicateTuples.open(); multi != 0; multi = predicateTuples.getNext()) { + predicate = RDFoxTripleManager.getQuotedTerm(predicateTuples.getResource(0)); + instanceTuples = null; + try { + instanceTuples = + getDataStore().compileQuery("SELECT ?X ?Z WHERE { ?X " + predicate + " ?Z }", prefixes, parameters); + long totalCount = 0; + for(long multi1 = instanceTuples.open(); multi1 != 0; multi1 = instanceTuples.getNext()) + totalCount += instanceTuples.getMultiplicity(); + number.add(predicate + " * " + totalCount); + } finally { + if(instanceTuples != null) instanceTuples.dispose(); + } + } + + } catch(JRDFStoreException e) { + e.printStackTrace(); + } finally { + if(predicateTuples != null) predicateTuples.dispose(); + predicateTuples = null; + } + + Utility.redirectCurrentOut(filename); + String[] ordered = number.toArray(new String[0]); + Arrays.sort(ordered, new DLPredicateComparator()); + for(String line : ordered) System.out.println(line); + Utility.closeCurrentOut(); + + } + + public TupleIterator internal_evaluateAgainstIDBs(String queryText) throws JRDFStoreException { + TupleIterator iter = + store.compileQuery(queryText, prefixes, parameters, TripleStatus.TUPLE_STATUS_IDB.union(TripleStatus.TUPLE_STATUS_EDB), TripleStatus.TUPLE_STATUS_IDB); +// iter.open(); + return iter; + } + + public TupleIterator internal_evaluate(String queryText) throws JRDFStoreException { + TupleIterator iter = store.compileQuery(queryText, prefixes, parameters); +// iter.open(); + return iter; + } + + public void setExpandEquality(boolean flag) { + parameters.m_expandEquality = flag; + } + + public TupleIterator internal_evaluateNotExpanded(String queryText) throws JRDFStoreException { + parameters.m_expandEquality = false; + TupleIterator iter = store.compileQuery(queryText, prefixes, parameters); // iter.open(); - return iter; - } - - public TupleIterator internal_evaluate(String queryText) throws JRDFStoreException { - TupleIterator iter = store.compileQuery(queryText, prefixes, parameters); -// iter.open(); - return iter; - } - - public void setExpandEquality(boolean flag) { - parameters.m_expandEquality = flag; - } - - public TupleIterator internal_evaluateNotExpanded(String queryText) throws JRDFStoreException { - parameters.m_expandEquality = false; - TupleIterator iter = store.compileQuery(queryText, prefixes, parameters); -// iter.open(); - parameters.m_expandEquality = true; - return iter; - } - - - public TupleIterator internal_evaluate(String queryText, boolean incrementally) throws JRDFStoreException { - return incrementally ? internal_evaluateAgainstIDBs(queryText) : internal_evaluate(queryText); - } - - Set materialisedRules = new HashSet(); - - public String getUnusedRules(Collection clauses, boolean toUpdate) { - DLClause clause; - for (Iterator iter = clauses.iterator(); iter.hasNext(); ) { - if (materialisedRules.contains(clause = iter.next())) - iter.remove(); - else if (toUpdate) materialisedRules.add(clause); - } - - if (clauses.isEmpty()) return null; - - return Program.toString(clauses); - } - - public void outputMaterialisedRules() { - System.out.println(DLClauseHelper.toString(materialisedRules)); - } - - public void outputAnswers(String query) { - TupleIterator iter = null; - try { - iter = internal_evaluate(query); - System.out.println(query); - int arity = iter.getArity(); - for (long multi = iter.open(); multi != 0; multi = iter.getNext()) { - for (int i = 0; i < arity; ++i) - System.out.print(RDFoxTripleManager.getQuotedTerm(iter.getResource(i)) + "\t"); - System.out.println(); - } - } catch (JRDFStoreException e) { - e.printStackTrace(); - } finally { - if (iter != null) iter.dispose(); - } - } - - public void outputInstance4UnaryPredicate(String iri) { - outputAnswers("select ?x where { ?x " - + " <" - + iri - + "> .}"); - } - - public void outputSubjects(String p, String o) { - outputAnswers("select x where { ?x <" + p + "> <" + o + "> . }"); - } - - public void outputObjects(String s, String p) { - outputAnswers("select ?x where { <" + s + "> <" + p + "> ?x . }"); - } - - public void outputIDBFacts() { - TupleIterator iter = null; - try { - iter = internal_evaluateAgainstIDBs("select distict ?x ?y ?z where { ?x ?y ?z }"); - for (long multi = iter.open(); multi != 0; multi = iter.getNext()) { - for (int i = 0; i < 3; ++i) - System.out.print(RDFoxTripleManager.getQuotedTerm(iter.getResource(i)) + "\t"); - System.out.println(); - } - } catch (JRDFStoreException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - if (iter != null) iter.dispose(); - } - - } - - public void outputType4Individual(String iri) { - outputAnswers("select ?z where { <" + iri + "> " + Namespace.RDF_TYPE_QUOTED + " ?z }"); - } - - public int getSameAsNumber() { - TupleIterator iter = null; - int counter = 0; - try { - iter = internal_evaluate("select ?x ?y where {?x " + Namespace.EQUALITY_QUOTED + " ?y . }"); - for (long multi = iter.open(); multi != 0; multi = iter.getNext()) - if (iter.getResourceID(0) != iter.getResourceID(1)) - ++counter; - } catch (JRDFStoreException e) { - e.printStackTrace(); - } finally { - if (iter != null) iter.dispose(); - } - return counter; - } - - private UFS equalityGroups = null; - - public UFS getEqualityGroups(boolean reuse) { - if (reuse && equalityGroups != null) return equalityGroups; - - equalityGroups = new UFS(); - - TupleIterator answers = null; - try { - Timer t = new Timer(); - answers = internal_evaluate("select ?x ?z where {?x " + Namespace.EQUALITY_QUOTED + "?z . }"); - for (long multi = answers.open(); multi != 0; multi = answers.getNext()) { - if (answers.getResourceID(0) != answers.getResourceID(1)) - equalityGroups.merge(answers.getResource(0).m_lexicalForm, answers.getResource(1).m_lexicalForm); - } - Utility.logInfo("@Time to group individuals by equality: " + t.duration()); - } catch (JRDFStoreException e) { - e.printStackTrace(); - } finally { - if (answers != null) answers.dispose(); - } - - return equalityGroups; - } - - public void clearRulesAndIDBFacts(Collection collection) { -// performDeletion(collection); - collection.clear(); - try { - store.clearRulesAndMakeFactsExplicit(); - } catch (JRDFStoreException e) { - e.printStackTrace(); - } - } - - @SuppressWarnings("unused") - private void performDeletion(Collection collection) { - Utility.logInfo("Remove all rules, idb facts and added staff..."); - Timer timer = new Timer(); - TupleIterator iter = null; - try { - UpdateType ut = UpdateType.ScheduleForDeletion; - for (int[] t: collection) - store.addTriplesByResourceIDs(t, ut); - - try { - iter = internal_evaluateAgainstIDBs("select ?x ?y ?z where { ?x ?y ?z . }"); - for (long multi = iter.open(); multi != 0; multi = iter.getNext()) { - int[] triple = new int[3]; - for (int i = 0; i < 3; ++i) - triple[i] = iter.getResourceID(i); - store.addTriplesByResourceIDs(triple, ut); - } - } finally { - if (iter != null) iter.dispose(); - iter = null; - } - store.applyReasoning(true); - } catch (JRDFStoreException e) { - e.printStackTrace(); - } - Utility.logInfo("Time for deletion: " + timer.duration()); - } + parameters.m_expandEquality = true; + return iter; + } + + public TupleIterator internal_evaluate(String queryText, boolean incrementally) throws JRDFStoreException { + return incrementally ? internal_evaluateAgainstIDBs(queryText) : internal_evaluate(queryText); + } + + public String getUnusedRules(Collection clauses, boolean toUpdate) { + DLClause clause; + for(Iterator iter = clauses.iterator(); iter.hasNext(); ) { + if(materialisedRules.contains(clause = iter.next())) + iter.remove(); + else if(toUpdate) materialisedRules.add(clause); + } + + if(clauses.isEmpty()) return null; + + return Program.toString(clauses); + } + + public void outputMaterialisedRules() { + System.out.println(DLClauseHelper.toString(materialisedRules)); + } + + public void outputAnswers(String query) { + TupleIterator iter = null; + try { + iter = internal_evaluate(query); + System.out.println(query); + int arity = iter.getArity(); + for(long multi = iter.open(); multi != 0; multi = iter.getNext()) { + for(int i = 0; i < arity; ++i) + System.out.print(RDFoxTripleManager.getQuotedTerm(iter.getResource(i)) + "\t"); + System.out.println(); + } + } catch(JRDFStoreException e) { + e.printStackTrace(); + } finally { + if(iter != null) iter.dispose(); + } + } + + public void outputInstance4UnaryPredicate(String iri) { + outputAnswers("select ?x where { ?x " + + " <" + + iri + + "> .}"); + } + + public void outputSubjects(String p, String o) { + outputAnswers("select x where { ?x <" + p + "> <" + o + "> . }"); + } + + public void outputObjects(String s, String p) { + outputAnswers("select ?x where { <" + s + "> <" + p + "> ?x . }"); + } + + public void outputIDBFacts() { + TupleIterator iter = null; + try { + iter = internal_evaluateAgainstIDBs("select distict ?x ?y ?z where { ?x ?y ?z }"); + for(long multi = iter.open(); multi != 0; multi = iter.getNext()) { + for(int i = 0; i < 3; ++i) + System.out.print(RDFoxTripleManager.getQuotedTerm(iter.getResource(i)) + "\t"); + System.out.println(); + } + } catch(JRDFStoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + if(iter != null) iter.dispose(); + } + + } + + public void outputType4Individual(String iri) { + outputAnswers("select ?z where { <" + iri + "> " + Namespace.RDF_TYPE_QUOTED + " ?z }"); + } + + public int getSameAsNumber() { + TupleIterator iter = null; + int counter = 0; + try { + iter = internal_evaluate("select ?x ?y where {?x " + Namespace.EQUALITY_QUOTED + " ?y . }"); + for(long multi = iter.open(); multi != 0; multi = iter.getNext()) + if(iter.getResourceID(0) != iter.getResourceID(1)) + ++counter; + } catch(JRDFStoreException e) { + e.printStackTrace(); + } finally { + if(iter != null) iter.dispose(); + } + return counter; + } + + public UFS getEqualityGroups(boolean reuse) { + if(reuse && equalityGroups != null) return equalityGroups; + + equalityGroups = new UFS(); + + TupleIterator answers = null; + try { + Timer t = new Timer(); + answers = internal_evaluate("select ?x ?z where {?x " + Namespace.EQUALITY_QUOTED + "?z . }"); + for(long multi = answers.open(); multi != 0; multi = answers.getNext()) { + if(answers.getResourceID(0) != answers.getResourceID(1)) + equalityGroups.merge(answers.getResource(0).m_lexicalForm, answers.getResource(1).m_lexicalForm); + } + Utility.logInfo("@Time to group individuals by equality: " + t.duration()); + } catch(JRDFStoreException e) { + e.printStackTrace(); + } finally { + if(answers != null) answers.dispose(); + } + + return equalityGroups; + } + + public void clearRulesAndIDBFacts(Collection collection) { +// performDeletion(collection); + collection.clear(); + try { + store.clearRulesAndMakeFactsExplicit(); + } catch(JRDFStoreException e) { + e.printStackTrace(); + } + } + + protected void outputClassAssertions(String filename) { + TupleIterator allTuples = null; + boolean redirect = false; + try { + allTuples = + getDataStore().compileQuery("SELECT ?X ?Z WHERE { ?X <" + Namespace.RDF_TYPE + "> ?Z }", prefixes, parameters); + redirect = Utility.redirectCurrentOut(filename); + for(long multi = allTuples.open(); multi != 0; multi = allTuples.getNext()) + System.out.println(RDFoxTripleManager.getQuotedTerm(allTuples.getResource(0)) + " " + RDFoxTripleManager + .getQuotedTerm(allTuples.getResource(1))); + } catch(JRDFStoreException e) { + e.printStackTrace(); + } finally { + if(redirect) Utility.closeCurrentOut(); + if(allTuples != null) allTuples.dispose(); + } + } + + @SuppressWarnings("unused") + private void performDeletion(Collection collection) { + Utility.logInfo("Remove all rules, idb facts and added staff..."); + Timer timer = new Timer(); + TupleIterator iter = null; + try { + UpdateType ut = UpdateType.ScheduleForDeletion; + for(int[] t : collection) + store.addTriplesByResourceIDs(t, ut); + + try { + iter = internal_evaluateAgainstIDBs("select ?x ?y ?z where { ?x ?y ?z . }"); + for(long multi = iter.open(); multi != 0; multi = iter.getNext()) { + int[] triple = new int[3]; + for(int i = 0; i < 3; ++i) + triple[i] = iter.getResourceID(i); + store.addTriplesByResourceIDs(triple, ut); + } + } finally { + if(iter != null) iter.dispose(); + iter = null; + } + store.applyReasoning(true); + } catch(JRDFStoreException e) { + e.printStackTrace(); + } + Utility.logInfo("Time for deletion: " + timer.duration()); + } } diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/light/KarmaQueryEngine.java b/src/uk/ac/ox/cs/pagoda/reasoner/light/KarmaQueryEngine.java index f068164..98f0c35 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/light/KarmaQueryEngine.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/light/KarmaQueryEngine.java @@ -12,6 +12,7 @@ import uk.ac.ox.cs.pagoda.query.AnswerTuples; import uk.ac.ox.cs.pagoda.query.AnswerTuplesImp; import uk.ac.ox.cs.pagoda.util.ConjunctiveQueryHelper; import uk.ac.ox.cs.pagoda.util.Utility; +import uk.ac.ox.cs.pagoda.util.disposable.DisposedException; import java.io.File; import java.io.FileNotFoundException; @@ -19,82 +20,90 @@ import java.nio.file.Paths; import java.util.Set; public class KarmaQueryEngine extends RDFoxQueryEngine { - - private MyKarma reasoner = null; - - String karmaDataFile = null, karmaRuleFile = null; - - public KarmaQueryEngine(String name) { - super(name); - + + String karmaDataFile = null, karmaRuleFile = null; + private MyKarma reasoner = null; + + public KarmaQueryEngine(String name) { + super(name); + // int Base = 1 << 6; // int index = (new Random().nextInt() % Base + Base) % Base; // karmaDataFile = "karma_data" + index + ".ttl"; // karmaRuleFile = "karma_rule" + index + ".dlog"; - karmaDataFile = Paths.get(Utility.getGlobalTempDirAbsolutePath(), "karma_data.ttl").toString(); - karmaRuleFile = Paths.get(Utility.getGlobalTempDirAbsolutePath(), "karma_rule.dlog").toString(); - - reasoner = new MyKarma(); - } - - public MyKarma getReasoner() { - return reasoner; - } - - public void processOntology(OWLOntology elhoOntology) { - try { - OntologyProcesser.transformOntology(elhoOntology, new File(karmaDataFile), new File(karmaRuleFile)); - } catch (IllegalInputOntologyException e) { - e.printStackTrace(); - } - } - - @Override - public void dispose() { - reasoner.dispose(); - } - - @Override - public AnswerTuples evaluate(String queryText) { - return evaluate(queryText, ConjunctiveQueryHelper.getAnswerVariables(queryText)[0], null); - } - - @Override - public AnswerTuples evaluate(String queryText, String[] answerVars) { - return evaluate(queryText, answerVars, null); - } - - public AnswerTuples evaluate(String queryText, AnswerTuples soundAnswerTuples) { - return evaluate(queryText, ConjunctiveQueryHelper.getAnswerVariables(queryText)[0], soundAnswerTuples); - } - - public AnswerTuples evaluate(String queryText, String[] answerVars, AnswerTuples soundAnswerTuples) { - KarmaQuery karmaQuery = new KarmaQuery(queryText.replace("_:", "?")); - reasoner.setConcurrence(false); - ConjunctiveQuery cq = karmaQuery.getConjunctiveQuery(); - if (cq == null) return null; - Set answers = reasoner.answerCQ(cq, soundAnswerTuples, !queryText.contains("_:")); - return new AnswerTuplesImp(answerVars, answers); - } - - @Override - public DataStore getDataStore() { - return reasoner.getStore(); - } - - public void initialiseKarma() { - try { - reasoner.initializeData(new File(karmaDataFile)); - reasoner.materialise(new File(karmaRuleFile)); - - File tmp; - if (karmaDataFile != null && ((tmp = new File(karmaDataFile)).exists())) tmp.delete(); - if (karmaRuleFile != null && ((tmp = new File(karmaRuleFile)).exists())) tmp.delete(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (JRDFStoreException e) { - e.printStackTrace(); - } - } + karmaDataFile = Paths.get(Utility.getGlobalTempDirAbsolutePath(), "karma_data.ttl").toString(); + karmaRuleFile = Paths.get(Utility.getGlobalTempDirAbsolutePath(), "karma_rule.dlog").toString(); + + reasoner = new MyKarma(); + } + + public MyKarma getReasoner() { + if(isDisposed()) throw new DisposedException(); + return reasoner; + } + + public void processOntology(OWLOntology elhoOntology) { + if(isDisposed()) throw new DisposedException(); + try { + OntologyProcesser.transformOntology(elhoOntology, new File(karmaDataFile), new File(karmaRuleFile)); + } catch(IllegalInputOntologyException e) { + e.printStackTrace(); + } + } + + @Override + public void dispose() { + super.dispose(); + reasoner.dispose(); + } + + @Override + public AnswerTuples evaluate(String queryText) { + if(isDisposed()) throw new DisposedException(); + return evaluate(queryText, ConjunctiveQueryHelper.getAnswerVariables(queryText)[0], null); + } + + @Override + public AnswerTuples evaluate(String queryText, String[] answerVars) { + if(isDisposed()) throw new DisposedException(); + return evaluate(queryText, answerVars, null); + } + + public AnswerTuples evaluate(String queryText, AnswerTuples soundAnswerTuples) { + if(isDisposed()) throw new DisposedException(); + return evaluate(queryText, ConjunctiveQueryHelper.getAnswerVariables(queryText)[0], soundAnswerTuples); + } + + public AnswerTuples evaluate(String queryText, String[] answerVars, AnswerTuples soundAnswerTuples) { + if(isDisposed()) throw new DisposedException(); + KarmaQuery karmaQuery = new KarmaQuery(queryText.replace("_:", "?")); + reasoner.setConcurrence(false); + ConjunctiveQuery cq = karmaQuery.getConjunctiveQuery(); + if(cq == null) return null; + Set answers = reasoner.answerCQ(cq, soundAnswerTuples, !queryText.contains("_:")); + return new AnswerTuplesImp(answerVars, answers); + } + + @Override + public DataStore getDataStore() { + if(isDisposed()) throw new DisposedException(); + return reasoner.getStore(); + } + + public void initialiseKarma() { + if(isDisposed()) throw new DisposedException(); + try { + reasoner.initializeData(new File(karmaDataFile)); + reasoner.materialise(new File(karmaRuleFile)); + + File tmp; + if(karmaDataFile != null && ((tmp = new File(karmaDataFile)).exists())) tmp.delete(); + if(karmaRuleFile != null && ((tmp = new File(karmaRuleFile)).exists())) tmp.delete(); + } catch(FileNotFoundException e) { + e.printStackTrace(); + } catch(JRDFStoreException e) { + e.printStackTrace(); + } + } } diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/light/RDFoxAnswerTuples.java b/src/uk/ac/ox/cs/pagoda/reasoner/light/RDFoxAnswerTuples.java index dd71809..1e8181f 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/light/RDFoxAnswerTuples.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/light/RDFoxAnswerTuples.java @@ -3,15 +3,14 @@ package uk.ac.ox.cs.pagoda.reasoner.light; import org.semanticweb.HermiT.model.Constant; import org.semanticweb.HermiT.model.Individual; import org.semanticweb.HermiT.model.Term; - -import uk.ac.ox.cs.pagoda.query.AnswerTuple; -import uk.ac.ox.cs.pagoda.query.AnswerTuples; -import uk.ac.ox.cs.pagoda.util.Utility; import uk.ac.ox.cs.JRDFox.JRDFStoreException; import uk.ac.ox.cs.JRDFox.model.GroundTerm; import uk.ac.ox.cs.JRDFox.store.TupleIterator; +import uk.ac.ox.cs.pagoda.query.AnswerTuple; +import uk.ac.ox.cs.pagoda.query.AnswerTuples; +import uk.ac.ox.cs.pagoda.util.Utility; -public class RDFoxAnswerTuples implements AnswerTuples { +public class RDFoxAnswerTuples extends AnswerTuples { long multi; TupleIterator m_iter; @@ -22,7 +21,18 @@ public class RDFoxAnswerTuples implements AnswerTuples { m_iter = iter; reset(); } - + + public static Term getHermitTerm(GroundTerm t) { + if(t instanceof uk.ac.ox.cs.JRDFox.model.Individual) { + uk.ac.ox.cs.JRDFox.model.Individual individual = (uk.ac.ox.cs.JRDFox.model.Individual) t; + return Individual.create(individual.getIRI()); + } + else { + uk.ac.ox.cs.JRDFox.model.Literal literal = ((uk.ac.ox.cs.JRDFox.model.Literal) t); + return Constant.create(literal.getLexicalForm(), literal.getDatatype().getIRI()); + } + } + @Override public boolean isValid() { return multi != 0; @@ -34,7 +44,7 @@ public class RDFoxAnswerTuples implements AnswerTuples { return m_iter.getArity(); } catch (JRDFStoreException e) { e.printStackTrace(); - return -1; + return -1; } } @@ -44,15 +54,12 @@ public class RDFoxAnswerTuples implements AnswerTuples { multi = m_iter.getNext(); } catch (JRDFStoreException e) { e.printStackTrace(); - } + } } @Override public void dispose() { - m_iter.dispose(); - } - - protected void finalize() { + super.dispose(); m_iter.dispose(); } @@ -85,16 +92,9 @@ public class RDFoxAnswerTuples implements AnswerTuples { public String[] getAnswerVariables() { return m_answerVars; } - - public static Term getHermitTerm(GroundTerm t) { - if (t instanceof uk.ac.ox.cs.JRDFox.model.Individual) { - uk.ac.ox.cs.JRDFox.model.Individual individual = (uk.ac.ox.cs.JRDFox.model.Individual) t; - return Individual.create(individual.getIRI()); - } - else { - uk.ac.ox.cs.JRDFox.model.Literal literal = ((uk.ac.ox.cs.JRDFox.model.Literal) t); - return Constant.create(literal.getLexicalForm(), literal.getDatatype().getIRI()); - } + + protected void finalize() { + m_iter.dispose(); } } diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/light/RDFoxQueryEngine.java b/src/uk/ac/ox/cs/pagoda/reasoner/light/RDFoxQueryEngine.java index 61500f5..f835ba9 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/light/RDFoxQueryEngine.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/light/RDFoxQueryEngine.java @@ -13,119 +13,126 @@ import uk.ac.ox.cs.pagoda.reasoner.QueryReasoner; import uk.ac.ox.cs.pagoda.tracking.AnswerTuplesWriter; import uk.ac.ox.cs.pagoda.util.Timer; import uk.ac.ox.cs.pagoda.util.Utility; +import uk.ac.ox.cs.pagoda.util.disposable.DisposedException; import java.io.File; import java.util.Collection; -public abstract class RDFoxQueryEngine implements QueryEngine { - - public static final int matNoOfThreads = Runtime.getRuntime().availableProcessors() * 2; - protected String name; - protected Prefixes prefixes = MyPrefixes.PAGOdAPrefixes.getRDFoxPrefixes(); +public abstract class RDFoxQueryEngine extends QueryEngine { - public RDFoxQueryEngine(String name) { - this.name = name; - } + public static final int matNoOfThreads = Runtime.getRuntime().availableProcessors() * 2; + protected String name; + protected Prefixes prefixes = MyPrefixes.PAGOdAPrefixes.getRDFoxPrefixes(); - public static DataStore createDataStore() { - DataStore instance = null; - try { + public RDFoxQueryEngine(String name) { + this.name = name; + } + + public static DataStore createDataStore() { + DataStore instance = null; + try { // instance = new DataStore("par-head-n"); - instance = new DataStore(StoreType.NarrowParallelHead); - instance.setNumberOfThreads(matNoOfThreads); - instance.initialize(); - } catch(JRDFStoreException e) { - e.printStackTrace(); - } - return instance; - } - - public String getName() { - return name; - } - - public abstract DataStore getDataStore(); - - public abstract void dispose(); - - public void importRDFData(String fileName, String importedFile) { - if(importedFile == null || importedFile.isEmpty()) return; - Timer t = new Timer(); - DataStore store = getDataStore(); - try { - long oldTripleCount = store.getTriplesCount(), tripleCount; - for (String file: importedFile.split(QueryReasoner.ImportDataFileSeparator)) { - store.importTurtleFile(new File(file), prefixes); - } - tripleCount = store.getTriplesCount(); - Utility.logDebug(name + " store after importing " + fileName + ": " + tripleCount + " (" + (tripleCount - oldTripleCount) + " new)"); - store.clearRulesAndMakeFactsExplicit(); - } catch (JRDFStoreException e) { - e.printStackTrace(); - } - Utility.logDebug(name + " store finished importing " + fileName + " in " + t.duration() + " seconds."); - } - - public void importDataFromABoxOf(OWLOntology ontology) { - DataStore store = getDataStore(); - try { - long prevTriplesCount = store.getTriplesCount(); - store.importOntology(ontology.getOWLOntologyManager().createOntology(ontology.getABoxAxioms(true))); - long loadedTriples = store.getTriplesCount() - prevTriplesCount; - Utility.logInfo(name + ": loaded " + loadedTriples + " triples from " + ontology.getABoxAxioms(true) - .size() + " ABox axioms"); - } catch(JRDFStoreException | OWLOntologyCreationException e) { - e.printStackTrace(); - System.exit(1); - } - - } - - public void materialise(String programName, String programText) { - if(programText == null) return; - Timer t = new Timer(); - DataStore store = getDataStore(); - try { - long oldTripleCount = store.getTriplesCount(), tripleCount; + instance = new DataStore(StoreType.NarrowParallelHead); + instance.setNumberOfThreads(matNoOfThreads); + instance.initialize(); + } catch(JRDFStoreException e) { + e.printStackTrace(); + } + return instance; + } + + public String getName() { + if(isDisposed()) throw new DisposedException(); + return name; + } + + public abstract DataStore getDataStore(); + + public void importRDFData(String fileName, String importedFile) { + if(isDisposed()) throw new DisposedException(); + if(importedFile == null || importedFile.isEmpty()) return; + Timer t = new Timer(); + DataStore store = getDataStore(); + try { + long oldTripleCount = store.getTriplesCount(), tripleCount; + for(String file : importedFile.split(QueryReasoner.ImportDataFileSeparator)) { + store.importTurtleFile(new File(file), prefixes); + } + tripleCount = store.getTriplesCount(); + Utility.logDebug(name + " store after importing " + fileName + ": " + tripleCount + " (" + (tripleCount - oldTripleCount) + " new)"); + store.clearRulesAndMakeFactsExplicit(); + } catch(JRDFStoreException e) { + e.printStackTrace(); + } + Utility.logDebug(name + " store finished importing " + fileName + " in " + t.duration() + " seconds."); + } + + public void importDataFromABoxOf(OWLOntology ontology) { + if(isDisposed()) throw new DisposedException(); + DataStore store = getDataStore(); + try { + long prevTriplesCount = store.getTriplesCount(); + store.importOntology(ontology.getOWLOntologyManager().createOntology(ontology.getABoxAxioms(true))); + long loadedTriples = store.getTriplesCount() - prevTriplesCount; + Utility.logInfo(name + ": loaded " + loadedTriples + " triples from " + ontology.getABoxAxioms(true) + .size() + " ABox axioms"); + } catch(JRDFStoreException | OWLOntologyCreationException e) { + e.printStackTrace(); + System.exit(1); + } + + } + + public void materialise(String programName, String programText) { + if(isDisposed()) throw new DisposedException(); + if(programText == null) return; + Timer t = new Timer(); + DataStore store = getDataStore(); + try { + long oldTripleCount = store.getTriplesCount(), tripleCount; // store.addRules(new String[] {programText}); - store.importRules(programText); - store.applyReasoning(); - tripleCount = store.getTriplesCount(); - Utility.logDebug(name + " store after materialising " + programName + ": " + tripleCount + " (" + (tripleCount - oldTripleCount) + " new)"); - store.clearRulesAndMakeFactsExplicit(); - } catch (JRDFStoreException e) { - e.printStackTrace(); - } - Utility.logDebug(name + " store finished the materialisation of " + programName + " in " + t.duration() + " seconds."); - } - - @Override - public void evaluate(Collection queryTexts, String answerFile) { - if (queryTexts == null) - return ; - - int queryID = 0; - AnswerTuplesWriter answerWriter = new AnswerTuplesWriter(answerFile); - AnswerTuples answerTuples; - Timer t = new Timer(); - try { - for (String query: queryTexts) { - t.reset(); - answerTuples = null; - try { - answerTuples = evaluate(query); - Utility.logDebug("time to answer Query " + ++queryID + ": " + t.duration()); - answerWriter.write(answerTuples.getAnswerVariables(), answerTuples); - } finally { - if (answerTuples != null) answerTuples.dispose(); - } - } - } finally { - answerWriter.close(); - } - - Utility.logDebug("done computing query answers by RDFox."); - - } + store.importRules(programText); + store.applyReasoning(); + tripleCount = store.getTriplesCount(); + Utility.logDebug(name + " store after materialising " + programName + ": " + tripleCount + " (" + (tripleCount - oldTripleCount) + " new)"); + store.clearRulesAndMakeFactsExplicit(); + } catch(JRDFStoreException e) { + e.printStackTrace(); + } + Utility.logDebug(name + " store finished the materialisation of " + programName + " in " + t.duration() + " seconds."); + } + + @Override + public void evaluate(Collection queryTexts, String answerFile) { + if(isDisposed()) throw new DisposedException(); + if(queryTexts == null) + return; + + int queryID = 0; + AnswerTuplesWriter answerWriter = new AnswerTuplesWriter(answerFile); + AnswerTuples answerTuples; + Timer t = new Timer(); + try { + for(String query : queryTexts) { + t.reset(); + answerTuples = null; + try { + answerTuples = evaluate(query); + Utility.logDebug("time to answer Query " + ++queryID + ": " + t.duration()); + answerWriter.write(answerTuples.getAnswerVariables(), answerTuples); + } finally { + if(answerTuples != null) answerTuples.dispose(); + } + } + } finally { + answerWriter.close(); + } + + Utility.logDebug("done computing query answers by RDFox."); + } + @Override + public void dispose() { + super.dispose(); + } } -- cgit v1.2.3