first working SPARQL optimization: joins
Project: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/commit/f6f5001f Tree: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/tree/f6f5001f Diff: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/diff/f6f5001f Branch: refs/heads/develop Commit: f6f5001fdd19dd661bdc642a40e3d6ef0f2dc2bd Parents: 5f4d8f6 Author: Sebastian Schaffert <[email protected]> Authored: Wed Apr 24 17:26:46 2013 +0200 Committer: Sebastian Schaffert <[email protected]> Committed: Wed Apr 24 17:26:46 2013 +0200 ---------------------------------------------------------------------- .../sparql/persistence/KiWiSparqlConnection.java | 9 ++- .../marmotta/kiwi/sparql/sail/KiWiSparqlSail.java | 2 +- .../kiwi/sparql/sail/KiWiSparqlSailConnection.java | 5 +- .../kiwi/sparql/test/KiWiSparqlJoinTest.java | 63 ++++++++++++++- .../apache/marmotta/kiwi/sparql/test/query1.sparql | 6 ++ .../marmotta/kiwi/persistence/KiWiConnection.java | 4 +- 6 files changed, 78 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/f6f5001f/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java index 8c23d2a..92bbcb6 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java @@ -26,6 +26,7 @@ import org.apache.marmotta.kiwi.persistence.KiWiDialect; import org.apache.marmotta.kiwi.persistence.KiWiPersistence; import org.apache.marmotta.kiwi.persistence.util.ResultSetIteration; import org.apache.marmotta.kiwi.persistence.util.ResultTransformerFunction; +import org.apache.marmotta.kiwi.sail.KiWiValueFactory; import org.openrdf.model.Value; import org.openrdf.query.Binding; import org.openrdf.query.BindingSet; @@ -55,9 +56,11 @@ public class KiWiSparqlConnection { private static Logger log = LoggerFactory.getLogger(KiWiSparqlConnection.class); private KiWiConnection parent; + private KiWiValueFactory valueFactory; - public KiWiSparqlConnection(KiWiConnection parent) throws SQLException { + public KiWiSparqlConnection(KiWiConnection parent, KiWiValueFactory valueFactory) throws SQLException { this.parent = parent; + this.valueFactory = valueFactory; } /** @@ -199,7 +202,7 @@ public class KiWiSparqlConnection { // in this way we can avoid setting too many query parameters Long nodeId = null; if(fields[i] != null && fields[i].hasValue()) { - Value v = fields[i].getValue(); + Value v = valueFactory.convert(fields[i].getValue()); if(v instanceof KiWiNode) { nodeId = ((KiWiNode) v).getId(); } else { @@ -233,7 +236,7 @@ public class KiWiSparqlConnection { entry.getValue() != null && entry.getValue().size() > 0) { List<String> vNames = queryVariables.get(v); String vName = vNames.get(0); - Value binding = bindings.getValue(v); + Value binding = valueFactory.convert(bindings.getValue(v)); if(binding instanceof KiWiNode) { whereConditions.add(vName+".id = "+((KiWiNode)binding).getId()); } else { http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/f6f5001f/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSail.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSail.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSail.java index 88a37ef..eb1b810 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSail.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSail.java @@ -79,7 +79,7 @@ public class KiWiSparqlSail extends NotifyingSailWrapper { KiWiSailConnection root = getRootConnection(connection); try { - return new KiWiSparqlSailConnection(connection, new KiWiSparqlConnection(root.getDatabaseConnection()), root.getValueFactory()); + return new KiWiSparqlSailConnection(connection, new KiWiSparqlConnection(root.getDatabaseConnection(), root.getValueFactory()), root.getValueFactory()); } catch (SQLException e) { throw new SailException(e); } http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/f6f5001f/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java index 8ddc846..d1a798f 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java @@ -19,6 +19,7 @@ package org.apache.marmotta.kiwi.sparql.sail; import info.aduna.iteration.CloseableIteration; import org.apache.marmotta.kiwi.sail.KiWiSailConnection; +import org.apache.marmotta.kiwi.sail.KiWiValueFactory; import org.apache.marmotta.kiwi.sparql.evaluation.KiWiEvaluationStatistics; import org.apache.marmotta.kiwi.sparql.evaluation.KiWiEvaluationStrategyImpl; import org.apache.marmotta.kiwi.sparql.evaluation.KiWiTripleSource; @@ -44,9 +45,9 @@ import org.openrdf.sail.helpers.NotifyingSailConnectionWrapper; public class KiWiSparqlSailConnection extends NotifyingSailConnectionWrapper { private KiWiSparqlConnection connection; - private ValueFactory valueFactory; + private KiWiValueFactory valueFactory; - public KiWiSparqlSailConnection(NotifyingSailConnection parent, KiWiSparqlConnection connection, ValueFactory valueFactory) { + public KiWiSparqlSailConnection(NotifyingSailConnection parent, KiWiSparqlConnection connection, KiWiValueFactory valueFactory) { super(parent); this.connection = connection; this.valueFactory = valueFactory; http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/f6f5001f/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java b/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java index bead1d5..325eaa6 100644 --- a/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java +++ b/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java @@ -17,6 +17,8 @@ package org.apache.marmotta.kiwi.sparql.test; +import info.aduna.iteration.Iterations; +import org.apache.commons.io.IOUtils; import org.apache.marmotta.kiwi.persistence.KiWiDialect; import org.apache.marmotta.kiwi.persistence.h2.H2Dialect; import org.apache.marmotta.kiwi.persistence.mysql.MySQLDialect; @@ -24,23 +26,31 @@ import org.apache.marmotta.kiwi.persistence.pgsql.PostgreSQLDialect; import org.apache.marmotta.kiwi.sail.KiWiStore; import org.apache.marmotta.kiwi.sparql.sail.KiWiSparqlSail; import org.apache.marmotta.kiwi.test.helper.DBConnectionChecker; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; +import org.junit.*; import org.junit.rules.TestWatcher; import org.junit.runner.Description; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.openrdf.query.BindingSet; +import org.openrdf.query.QueryLanguage; +import org.openrdf.query.TupleQuery; +import org.openrdf.query.TupleQueryResult; import org.openrdf.repository.Repository; +import org.openrdf.repository.RepositoryConnection; import org.openrdf.repository.RepositoryException; import org.openrdf.repository.sail.SailRepository; +import org.openrdf.rio.RDFFormat; +import org.openrdf.rio.RDFParseException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import static org.hamcrest.CoreMatchers.hasItem; + /** * Test the KiWi SPARQL Join optimization. * @@ -128,11 +138,23 @@ public class KiWiSparqlJoinTest { @Before - public void initDatabase() throws RepositoryException { + public void initDatabase() throws RepositoryException, IOException, RDFParseException { store = new KiWiStore("test",jdbcUrl,jdbcUser,jdbcPass,dialect, "http://localhost/context/default", "http://localhost/context/inferred"); ssail = new KiWiSparqlSail(store); repository = new SailRepository(ssail); repository.initialize(); + + // load demo data + RepositoryConnection con = repository.getConnection(); + try { + con.begin(); + + con.add(this.getClass().getResourceAsStream("demo-data.foaf"), "http://localhost/test/", RDFFormat.RDFXML); + + con.commit(); + } finally { + con.close(); + } } @After @@ -155,4 +177,37 @@ public class KiWiSparqlJoinTest { } }; + + /** + * This method tests a simple triple join with two triple patterns. + * @throws Exception + */ + @Test + public void testQuery1() throws Exception { + String queryString = IOUtils.toString(this.getClass().getResourceAsStream("query1.sparql"), "UTF-8"); + + RepositoryConnection con = repository.getConnection(); + try { + con.begin(); + + + TupleQuery query = con.prepareTupleQuery(QueryLanguage.SPARQL, queryString); + TupleQueryResult result = query.evaluate(); + + con.commit(); + + Assert.assertTrue(result.hasNext()); + + List<BindingSet> bindingSets = Iterations.asList(result); + + for(BindingSet bindings : bindingSets) { + System.err.println(bindings); + } + } catch(RepositoryException ex) { + con.rollback(); + } finally { + con.close(); + } + } + } http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/f6f5001f/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query1.sparql ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query1.sparql b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query1.sparql new file mode 100644 index 0000000..bc05292 --- /dev/null +++ b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query1.sparql @@ -0,0 +1,6 @@ +PREFIX foaf: <http://xmlns.com/foaf/0.1/> + +SELECT ?p1 ?p3 WHERE { + ?p1 foaf:knows ?p2 . + ?p2 foaf:knows ?p3 +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/f6f5001f/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/persistence/KiWiConnection.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/persistence/KiWiConnection.java b/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/persistence/KiWiConnection.java index e582631..fa9834a 100644 --- a/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/persistence/KiWiConnection.java +++ b/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/persistence/KiWiConnection.java @@ -170,7 +170,9 @@ public class KiWiConnection { * * @return */ - public Connection getJDBCConnection() { + public Connection getJDBCConnection() throws SQLException { + requireJDBCConnection(); + return connection; }
