From 6e8ee40e41d84e0466153802a2c9b4ae88af3544 Mon Sep 17 00:00:00 2001 From: RncLsn Date: Tue, 9 Jun 2015 18:23:15 +0100 Subject: Fixed marking original individuals in the relevant upper store. --- pom.xml | 10 ++-- src/uk/ac/ox/cs/pagoda/Pagoda.java | 6 +++ .../pagoda/multistage/MultiStageQueryEngine.java | 4 ++ src/uk/ac/ox/cs/pagoda/query/QueryRecord.java | 8 ++- .../ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java | 7 +-- src/uk/ac/ox/cs/pagoda/reasoner/QueryReasoner.java | 1 + .../rules/approximators/SkolemTermsManager.java | 2 +- src/uk/ac/ox/cs/pagoda/util/tuples/Tuple.java | 5 ++ test/resources/ComparisonTests.xml | 24 +++++++++ test/resources/LightTests.xml | 4 +- .../ox/cs/pagoda/global_tests/TestPagodaFLY.java | 60 ++++++++++++++++++++-- test/uk/ac/ox/cs/pagoda/util/TestUtil.java | 18 ++++++- 12 files changed, 132 insertions(+), 17 deletions(-) create mode 100644 test/resources/ComparisonTests.xml diff --git a/pom.xml b/pom.xml index 0a9f1c7..3b9a94a 100644 --- a/pom.xml +++ b/pom.xml @@ -172,11 +172,11 @@ jrdfox 1.0 - - - - - + + commons-lang + commons-lang + 2.1 + diff --git a/src/uk/ac/ox/cs/pagoda/Pagoda.java b/src/uk/ac/ox/cs/pagoda/Pagoda.java index aeb85a7..f5dce15 100644 --- a/src/uk/ac/ox/cs/pagoda/Pagoda.java +++ b/src/uk/ac/ox/cs/pagoda/Pagoda.java @@ -177,6 +177,12 @@ public class Pagoda implements Runnable { return this; } + public PagodaBuilder skolem(Boolean isEnabled) { + if(instance == null) return null; + instance.properties.setUseSkolemUpperBound(isEnabled); + return this; + } + public Pagoda build() { Pagoda builtInstance = instance; instance = null; diff --git a/src/uk/ac/ox/cs/pagoda/multistage/MultiStageQueryEngine.java b/src/uk/ac/ox/cs/pagoda/multistage/MultiStageQueryEngine.java index 479905d..2471c80 100644 --- a/src/uk/ac/ox/cs/pagoda/multistage/MultiStageQueryEngine.java +++ b/src/uk/ac/ox/cs/pagoda/multistage/MultiStageQueryEngine.java @@ -10,6 +10,7 @@ import uk.ac.ox.cs.pagoda.query.GapByStore4ID; import uk.ac.ox.cs.pagoda.query.QueryRecord; import uk.ac.ox.cs.pagoda.rules.DatalogProgram; import uk.ac.ox.cs.pagoda.rules.Program; +import uk.ac.ox.cs.pagoda.rules.approximators.SkolemTermsManager; import uk.ac.ox.cs.pagoda.util.PagodaProperties; import uk.ac.ox.cs.pagoda.util.Timer; import uk.ac.ox.cs.pagoda.util.Utility; @@ -216,6 +217,9 @@ public class MultiStageQueryEngine extends StageQueryEngine { Utility.logDebug(name + " store after adding facts for violations: " + (tripleCount = store.getTriplesCount()) + " (" + (tripleCount - oldTripleCount) + " new)"); Utility.logDebug("Time to add triples for violations: " + subTimer.duration()); + + Utility.logDebug("Number of Skolem individuals: " + SkolemTermsManager.getInstance() + .getSkolemIndividualsCount()); } } catch(JRDFStoreException e) { e.printStackTrace(); diff --git a/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java b/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java index 7f02741..5878a57 100644 --- a/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java +++ b/src/uk/ac/ox/cs/pagoda/query/QueryRecord.java @@ -2,6 +2,7 @@ package uk.ac.ox.cs.pagoda.query; import com.google.gson.*; import com.google.gson.reflect.TypeToken; +import org.apache.commons.lang.WordUtils; import org.semanticweb.HermiT.model.*; import org.semanticweb.owlapi.model.*; import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; @@ -713,7 +714,12 @@ public class QueryRecord extends Disposable { FRAGMENT_REFINEMENT, SUMMARISATION, DEPENDENCY, - FULL_REASONING + FULL_REASONING; + + @Override + public String toString() { + return WordUtils.capitalizeFully(super.toString(), new char[]{'_'}).replace("_", ""); + } } /** diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java index e6e508a..e689de6 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java @@ -19,7 +19,6 @@ import uk.ac.ox.cs.pagoda.tracking.QueryTracker; import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoder; import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoderDisjVar1; import uk.ac.ox.cs.pagoda.tracking.TrackingRuleEncoderWithGap; -import uk.ac.ox.cs.pagoda.util.PagodaProperties; 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; @@ -192,7 +191,7 @@ class MyQueryReasoner extends QueryReasoner { OWLOntology relevantOntologySubset = extractRelevantOntologySubset(queryRecord); // queryRecord.saveRelevantOntology("./fragment_query" + queryRecord.getQueryID() + ".owl"); - if(PagodaProperties.getDefaultUseSkolemUpperBound() && + if(properties.getUseSkolemUpperBound() && querySkolemisedRelevantSubset(relevantOntologySubset, queryRecord)) return; @@ -297,7 +296,7 @@ class MyQueryReasoner extends QueryReasoner { Tuple extendedQueryTexts = queryRecord.getExtendedQueryText(); - if(PagodaProperties.getDefaultUseAlwaysSimpleUpperBound() || lazyUpperStore == null) { + if(properties.getUseAlwaysSimpleUpperBound() || lazyUpperStore == null) { Utility.logDebug("Tracking store"); if(queryUpperStore(trackingStore, queryRecord, extendedQueryTexts, Step.SIMPLE_UPPER_BOUND)) return true; @@ -369,8 +368,10 @@ class MyQueryReasoner extends QueryReasoner { new MultiStageQueryEngine("Relevant-store", true); // checkValidity is true relevantStore.importDataFromABoxOf(relevantSubset); + String relevantOriginalMarkProgram = OWLHelper.getOriginalMarkProgram(relevantSubset); int queryDependentMaxTermDepth = 5; // TODO make it dynamic + relevantStore.materialise("Mark original individuals", relevantOriginalMarkProgram); int materialisationTag = relevantStore.materialiseSkolemly(relevantProgram, null, queryDependentMaxTermDepth); queryRecord.addProcessingTime(Step.SKOLEM_UPPER_BOUND, t.duration()); diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/QueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/QueryReasoner.java index eab6a1b..3a057ec 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/QueryReasoner.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/QueryReasoner.java @@ -193,6 +193,7 @@ public abstract class QueryReasoner extends Disposable { if(!record.isProcessed()) evaluate(record); Utility.logInfo("Total time to answer this query: " + t.duration()); + Utility.logInfo("Difficulty of this query: " + record.getDifficulty()); if(!fullReasoner && !record.isProcessed()) { Utility.logInfo("The query has not been fully answered in " + t.duration() + " seconds."); continue; diff --git a/src/uk/ac/ox/cs/pagoda/rules/approximators/SkolemTermsManager.java b/src/uk/ac/ox/cs/pagoda/rules/approximators/SkolemTermsManager.java index 44daf7a..a78aabe 100644 --- a/src/uk/ac/ox/cs/pagoda/rules/approximators/SkolemTermsManager.java +++ b/src/uk/ac/ox/cs/pagoda/rules/approximators/SkolemTermsManager.java @@ -83,7 +83,7 @@ public class SkolemTermsManager { /** * Get the number of individuals generated by this manager. */ - public int getNumberOfSkolemisedIndividual() { + public int getSkolemIndividualsCount() { return individualToDepth_map.keySet().size(); } diff --git a/src/uk/ac/ox/cs/pagoda/util/tuples/Tuple.java b/src/uk/ac/ox/cs/pagoda/util/tuples/Tuple.java index 9139a5d..0a5983c 100644 --- a/src/uk/ac/ox/cs/pagoda/util/tuples/Tuple.java +++ b/src/uk/ac/ox/cs/pagoda/util/tuples/Tuple.java @@ -46,4 +46,9 @@ public class Tuple implements Iterable { public int hashCode() { return elements.hashCode() + getClass().hashCode(); } + + @Override + public String toString() { + return elements.toString(); + } } diff --git a/test/resources/ComparisonTests.xml b/test/resources/ComparisonTests.xml new file mode 100644 index 0000000..0095724 --- /dev/null +++ b/test/resources/ComparisonTests.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/resources/LightTests.xml b/test/resources/LightTests.xml index 859e3fa..8d9a700 100644 --- a/test/resources/LightTests.xml +++ b/test/resources/LightTests.xml @@ -5,10 +5,10 @@ - + + - diff --git a/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaFLY.java b/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaFLY.java index 4fdccf8..42827a0 100644 --- a/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaFLY.java +++ b/test/uk/ac/ox/cs/pagoda/global_tests/TestPagodaFLY.java @@ -4,6 +4,7 @@ import org.testng.annotations.Test; import uk.ac.ox.cs.pagoda.Pagoda; import uk.ac.ox.cs.pagoda.query.CheckAnswers; import uk.ac.ox.cs.pagoda.util.TestUtil; +import uk.ac.ox.cs.pagoda.util.Timer; import java.io.File; import java.io.IOException; @@ -20,8 +21,8 @@ public class TestPagodaFLY { Path givenAnswers = TestUtil.getAnswersFilePath("answers/pagoda-fly-with-GJ-FC-individuals.json"); Pagoda pagoda = Pagoda.builder() - .ontology(TestUtil.combinePaths(ontoDir, "fly/fly_anatomy_XP_with_GJ_FC_individuals.owl")) - .query(TestUtil.combinePaths(ontoDir, "fly/queries/fly.sparql")) + .ontology(Paths.get(ontoDir, "fly/fly_anatomy_XP_with_GJ_FC_individuals.owl")) + .query(Paths.get(ontoDir, "fly/queries/fly.sparql")) .answer(answers) .classify(false) .hermit(true) @@ -39,9 +40,10 @@ public class TestPagodaFLY { Path givenAnswers = TestUtil.getAnswersFilePath("answers/pagoda-fly-rolledup.json"); Pagoda pagoda = Pagoda.builder() - .ontology(TestUtil.combinePaths(ontoDir, "fly/fly_rolledUp.owl")) - .query(TestUtil.combinePaths(ontoDir, "fly/queries/fly_rolledUp.sparql")) + .ontology(Paths.get(ontoDir, "fly/fly_rolledUp.owl")) + .query(Paths.get(ontoDir, "fly/queries/fly_rolledUp.sparql")) .answer(answers) + .answer(Paths.get("/home/alessandro/Desktop/answers.json")) .classify(false) .hermit(true) .build(); @@ -49,4 +51,54 @@ public class TestPagodaFLY { pagoda.run(); CheckAnswers.assertSameAnswers(answers, givenAnswers); } + + @Test(groups = {"light", "justExecute"}) + public void justExecute_newQueries() throws IOException { + String ontoDir = TestUtil.getConfig().getProperty("ontoDir"); + + Pagoda pagoda = Pagoda.builder() + .ontology(Paths.get(ontoDir, "fly/fly_rolledUp.owl")) +// .ontology(Paths.get(ontoDir, "fly/fly_anatomy_XP_with_GJ_FC_individuals.owl")) + .query(Paths.get(ontoDir, "fly/queries/new_queries.sparql")) +// .answer(Paths.get("/home/alessandro/Desktop/answers.json")) + .classify(false) + .hermit(true) + .skolem(false) + .build(); + + pagoda.run(); + } + + @Test(groups = {"light", "comparison"}) + public void compare_newQueries() throws IOException { + String ontoDir = TestUtil.getConfig().getProperty("ontoDir"); + + Timer timer = new Timer(); + Pagoda.builder() + .ontology(Paths.get(ontoDir, "fly/fly_rolledUp.owl")) + .query(Paths.get(ontoDir, "fly/queries/new_queries.sparql")) + .classify(false) + .hermit(true) + .skolem(true) // <----<< Skolem upper bound is ENABLED <<< + .build() + .run(); + double t1 = timer.duration(); + + timer.reset(); + + Pagoda.builder() + .ontology(Paths.get(ontoDir, "fly/fly_rolledUp.owl")) + .query(Paths.get(ontoDir, "fly/queries/new_queries.sparql")) + .classify(false) + .hermit(true) + .skolem(false) // <----<< Skolem upper bound is DISABLED <<< + .build() + .run(); + double t2 = timer.duration(); + + if(t1 < t2) + TestUtil.logInfo("Overall reasoning with Skolem upper bound was " + (int) (t2 / t1 * 100 - 100) + "x faster!"); + else + TestUtil.logInfo("Overall reasoning with Skolem upper bound was " + (int) (t1 / t2 * 100 - 100) + "x slower..."); + } } diff --git a/test/uk/ac/ox/cs/pagoda/util/TestUtil.java b/test/uk/ac/ox/cs/pagoda/util/TestUtil.java index c3909d5..fdd242a 100644 --- a/test/uk/ac/ox/cs/pagoda/util/TestUtil.java +++ b/test/uk/ac/ox/cs/pagoda/util/TestUtil.java @@ -22,7 +22,7 @@ import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; public class TestUtil { public static final String CONFIG_FILE = "test.properties"; - + private static final Logger LOGGER = Logger.getLogger("Tester"); private static boolean isConfigLoaded = false; private static Properties config; @@ -71,4 +71,20 @@ public class TestUtil { return Paths.get(givenAnswersURL.getPath()); } + public static void logInfo(Object msg) { + LOGGER.info(msg); + } + + public static void logDebug(Object msg) { + LOGGER.debug(msg); + } + + public static void logError(Object msg) { + LOGGER.error(msg); + } + + public static void logError(Object msg, Throwable t) { + LOGGER.error(msg, t); + } + } -- cgit v1.2.3