You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by ss...@apache.org on 2013/04/25 16:18:40 UTC
[13/15] git commit: first working SPARQL optimization: joins
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 <ss...@apache.org>
Authored: Wed Apr 24 17:26:46 2013 +0200
Committer: Sebastian Schaffert <ss...@apache.org>
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;
}