diff --git a/build-release.sh b/build-release.sh new file mode 100755 index 00000000000..bfccd085e3a --- /dev/null +++ b/build-release.sh @@ -0,0 +1,139 @@ +#!/bin/sh + +### +# README: +# +# The required components for building the release can be found: http://obda.inf.unibz.it/files/dev/Dependencies.zip +# +# - In UNIX system, locate the dependencies folder in ONTOP_DEP_HOME variable. +# +### + +# location for the build dependencies home +export ONTOP_DEP_HOME=/Users/timi/Documents/Dependencies + +# location for the JDBC plugin jars +export JDBC_PLUGINS_PATH=$ONTOP_DEP_HOME + +# location for protege clean folder (Protege 4.2) +export PROTEGE_COPY_PATH=$ONTOP_DEP_HOME +export PROTEGE_COPY_FILENAME=protege-4.2-beta.284 +export PROTEGE_MAIN_FOLDER_NAME=Protege_4.2 +export PROTEGE_MAIN_PLUGIN=ontopro-plugin + +# location and name for jetty distribution (should be ZIP) +export JETTY_COPY_PATH=$ONTOP_DEP_HOME +export JETTY_COPY_FILENAME=jetty-distribution-8.1.9 +export JETTY_INNER_FOLDERNAME=jetty-distribution-8.1.9 + +#location for sesame and workbench WEB-APP jars +export OPENRDF_WORKBENCH_PATH=$ONTOP_DEP_HOME +export OPENRDF_SESAME_PATH=$ONTOP_DEP_HOME + +# name of the wars for sesame and workbench WEB-APPs (these have to be already customized with stylesheets) +export OPENRDF_SESAME_FILENAME=openrdf-sesame +export OPENRDF_WORKBENCH_FILENAME=openrdf-workbench + +# folder names of the output +export PROTEGE_DIST=ontopPro +export QUEST_SESAME_DIST=QuestSesame +export QUEST_JETTY_DIST=QuestJetty +export OWL_API_DIST=QuestOWL + +export VERSION=1.8 +export REVISION=0 + +#svn update +mvn clean + +# Packing the -ontopPro- distribution +# +echo "" +echo "=========================================" +echo " Making -ontopPro- distribution package" +echo "-----------------------------------------" +echo "pluginVersion=$VERSION.$REVISION" > obdalib-core/src/main/resources/it/unibz/krdb/obda/utils/version.properties +rm -fr obdalib-protege41/dist +mvn install -DskipTests +cd obdalib-protege41/ +mvn bundle:bundle -DskipTests + +rm -fr ../quest-distribution/$PROTEGE_DIST +mkdir ../quest-distribution/$PROTEGE_DIST +cp target/it.unibz.inf.obda.p4plugin-$VERSION.jar ../quest-distribution/$PROTEGE_DIST/it.unibz.inf.obda.p4plugin-$VERSION.$REVISION.jar +cp $PROTEGE_COPY_PATH/$PROTEGE_COPY_FILENAME.zip ../quest-distribution/$PROTEGE_DIST/ + +cd ../quest-distribution/$PROTEGE_DIST/ + +mkdir -p $PROTEGE_MAIN_FOLDER_NAME/plugins +cp it.unibz.inf.obda.p4plugin-$VERSION.$REVISION.jar $PROTEGE_MAIN_FOLDER_NAME/plugins/ +cp $JDBC_PLUGINS_PATH/org.protege.osgi.jdbc.jar $PROTEGE_MAIN_FOLDER_NAME/plugins/ +cp $JDBC_PLUGINS_PATH/org.protege.osgi.jdbc.prefs.jar $PROTEGE_MAIN_FOLDER_NAME/plugins/ +zip ../$PROTEGE_DIST/$PROTEGE_MAIN_PLUGIN-$VERSION.$REVISION.zip $PROTEGE_MAIN_FOLDER_NAME/plugins/*.* + +zip $PROTEGE_COPY_FILENAME.zip $PROTEGE_MAIN_FOLDER_NAME/plugins/* +mv $PROTEGE_COPY_FILENAME.zip $PROTEGE_MAIN_PLUGIN-with-protege-$VERSION.$REVISION.zip + +rm -fr $PROTEGE_MAIN_FOLDER_NAME +cd .. + +# Packing the sesame distribution +# +echo "" +echo "=========================================" +echo " Making Sesame distribution package" +echo "-----------------------------------------" +rm -fr $QUEST_SESAME_DIST +mkdir -p $QUEST_SESAME_DIST/WEB-INF/lib +mvn assembly:assembly -DskipTests +cp target/quest-distribution-$VERSION-sesame-bin.jar $QUEST_SESAME_DIST/WEB-INF/lib/ontop-distribution-$VERSION.$REVISION.jar +unzip -q -d $QUEST_SESAME_DIST/WEB-INF/lib/ target/quest-distribution-$VERSION-dependencies.zip +cp $OPENRDF_SESAME_PATH/$OPENRDF_SESAME_FILENAME.war $QUEST_SESAME_DIST/ +cp $OPENRDF_WORKBENCH_PATH/$OPENRDF_WORKBENCH_FILENAME.war $QUEST_SESAME_DIST/ + +cd $QUEST_SESAME_DIST +echo "" +echo "[INFO] Adding QuestSesame and dependency JARs to openrdf-sesame.war" +jar -uf $OPENRDF_SESAME_FILENAME.war WEB-INF/lib/* + +echo "[INFO] Adding QuestSesame and dependency JARs to openrdf-workbench.war" +jar -uf $OPENRDF_WORKBENCH_FILENAME.war WEB-INF/lib/* + +rm -fr WEB-INF +cd .. + +# Packaging the sesame jetty distribution +# +echo "" +echo "=========================================" +echo " Making Sesame Jetty distribution package" +echo "-----------------------------------------" +rm -fr $QUEST_JETTY_DIST +mkdir $QUEST_JETTY_DIST +cp $JETTY_COPY_PATH/$JETTY_COPY_FILENAME.zip $QUEST_JETTY_DIST/ontop-with-jetty-$VERSION.$REVISION.zip + +export JETTY_FOLDER=$JETTY_INNER_FOLDERNAME +cd $QUEST_JETTY_DIST +mkdir -p $JETTY_INNER_FOLDERNAME/webapps +cp ../$QUEST_SESAME_DIST/$OPENRDF_SESAME_FILENAME.war $JETTY_FOLDER/webapps +cp ../$QUEST_SESAME_DIST/$OPENRDF_WORKBENCH_FILENAME.war $JETTY_FOLDER/webapps + +zip ontop-with-jetty-$VERSION.$REVISION.zip $JETTY_FOLDER/webapps/* + +rm -fr $JETTY_FOLDER +cd .. + +# Packaging the OWL-API distribution +# +echo "" +echo "=========================================" +echo " Making OWL-API distribution package" +echo "-----------------------------------------" +rm -fr $OWL_API_DIST +mkdir $OWL_API_DIST +echo "[INFO] Copying files..." +cp target/quest-distribution-$VERSION-bin.zip $OWL_API_DIST/ontop-distribution-$VERSION.$REVISION.zip + +echo "" +echo "Done." +echo "" diff --git a/obdalib-core/pom.xml b/obdalib-core/pom.xml index 0586b1e1946..96050c10330 100644 --- a/obdalib-core/pom.xml +++ b/obdalib-core/pom.xml @@ -35,18 +35,6 @@ commons-cli commons-cli - - org.openrdf.sesame - sesame-model - - - org.openrdf.sesame - sesame-rio-api - - - org.openrdf.sesame - sesame-rio-turtle - junit junit diff --git a/obdalib-core/src/main/java/it/unibz/krdb/obda/io/R2RMLWriter.java b/obdalib-core/src/main/java/it/unibz/krdb/obda/io/R2RMLWriter.java deleted file mode 100644 index ae598d7c76b..00000000000 --- a/obdalib-core/src/main/java/it/unibz/krdb/obda/io/R2RMLWriter.java +++ /dev/null @@ -1,431 +0,0 @@ -/* - * Copyright (C) 2009-2013, Free University of Bozen Bolzano - * This source code is available under the terms of the Affero General Public - * License v3. - * - * Please see LICENSE.txt for full license terms, including the availability of - * proprietary exceptions. - */ -package it.unibz.krdb.obda.io; - -import it.unibz.krdb.obda.model.CQIE; -import it.unibz.krdb.obda.model.DataTypePredicate; -import it.unibz.krdb.obda.model.Function; -import it.unibz.krdb.obda.model.Term; -import it.unibz.krdb.obda.model.OBDAMappingAxiom; -import it.unibz.krdb.obda.model.OBDAModel; -import it.unibz.krdb.obda.model.OBDAQuery; -import it.unibz.krdb.obda.model.Predicate; -import it.unibz.krdb.obda.model.URIConstant; -import it.unibz.krdb.obda.model.URITemplatePredicate; -import it.unibz.krdb.obda.model.ValueConstant; -import it.unibz.krdb.obda.model.Variable; -import it.unibz.krdb.obda.model.impl.BNodePredicateImpl; -import it.unibz.krdb.obda.model.impl.FunctionalTermImpl; -import it.unibz.krdb.obda.model.impl.OBDAVocabulary; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileWriter; -import java.io.IOException; -import java.net.URI; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - - -public class R2RMLWriter { - - BufferedWriter out; - List mappings; - URI sourceUri; - PrefixManager prefixmng; - - public R2RMLWriter(File file, OBDAModel obdamodel, URI sourceURI) - { - try { - this.out = new BufferedWriter(new FileWriter(file)); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - this.sourceUri = sourceURI; - this.mappings = obdamodel.getMappings(sourceUri); - this.prefixmng = obdamodel.getPrefixManager(); - } - - public R2RMLWriter(OBDAModel obdamodel, URI sourceURI) - { - this.sourceUri = sourceURI; - this.mappings = obdamodel.getMappings(sourceUri); - this.prefixmng = obdamodel.getPrefixManager(); - } - - - public void write(File file) - { - try { - this.out = new BufferedWriter(new FileWriter(file)); - - out.write("@prefix rr: .\n"); - - Map prefixes = prefixmng.getPrefixMap(); - out.write("@prefix xsd: .\n"); - for(String key : prefixes.keySet()) - { - out.write("@prefix "+key+" <"+prefixes.get(key)+"> .\n"); - } - out.write("@base .\n\n"); - - for (OBDAMappingAxiom mapping : mappings) - { - if (mapping.getId().contains("join")) - getJoinMapping(mapping); - else{ - out.write("<"+mapping.getId().replaceAll(" ", "_")+">\n\t a rr:TriplesMap;\n"); - - //write sql table - out.write("\trr:logicalTable "+getSQL(mapping.getSourceQuery().toString())); - - - OBDAQuery targetQuery = mapping.getTargetQuery(); - - //write subjectMap - out.write("\trr:subjectMap ["+getSubjectMap(targetQuery)+" ]"); - - List predobjs = getPredObjMap(targetQuery); - if (predobjs.size() > 0) - out.write(";\n"); - else - out.write(".\n\n"); - - for (int i=0;i 0) - out.write("\trr:predicateObjectMap [\n"+ predobjs.get(predobjs.size()-1) + "\n\t].\n\n"); - - } - } - - out.close(); - - } catch (Exception e) { - e.printStackTrace(); - } - finally{ - - } - } - - private String getSQL(String sql) { - if (sql.contains("*")) - { - String table = getTableName(sql); - return ("[ rr:tableName \"\\"+table.substring(0, table.length()-1)+"\\\"\" ];\n"); - } - else - return ("[ rr:sqlQuery \"\"\"\n\t\t"+sql+"\n\t\"\"\" ];\n"); - } - - private void getJoinMapping(OBDAMappingAxiom mapping) throws IOException { - - String sql = mapping.getSourceQuery().toString(); - String childSql = getChildSQL(sql); - String parentSql = getParentSQL(sql); - String refMap = findParentRef(parentSql); - - - - OBDAQuery targetQuery = mapping.getTargetQuery(); - - - out.write("<"+mapping.getId()+">\n\t a rr:TriplesMap;\n"); - - //write sql table - out.write("\trr:logicalTable "+getSQL(childSql)); - - - //write subjectMap - out.write("\trr:subjectMap ["+getSubjectMap(targetQuery)+" ];\n"); - - //write predobjmap - out.write("\trr:predicateObjectMap [\n"+ getJoinPredicate(targetQuery) + getJoinObject(sql,refMap) + "\t].\n\n"); - - - } - - private String getJoinObject(String targetQuery, String parent) { - String childCond = getChildCond(targetQuery); - String parentCond = getParentCond(targetQuery); - - return "\t\t rr:objectMap [\n\t\t\ta rr:RefObjectMap;\n\t\t\trr:parentTriplesMap <"+ - parent+">;\n\t\t\trr:joinCondition [\n\t\t\t\trr:child \"\\\""+childCond+"\\\"\";\n\t\t\t\trr:parent \"\\\"" - +parentCond+"\\\"\";\n\t\t];\n\t];\n"; - - } - - private String getJoinPredicate(OBDAQuery targetQuery) { - //there's only one term in the body - Term term = ((CQIE)targetQuery).getBody().get(0); - if (term instanceof FunctionalTermImpl) - { - Function atom = (FunctionalTermImpl) term; - //not class atoms - if (atom.getTerms().size() > 1) - { - return ("\t\t rr:predicate \t<"+atom.getFunctionSymbol().toString()+"> ;\n"); - } - } - return null; - } - - private String findParentRef(String parentSql) { - for(OBDAMappingAxiom mapping : mappings) - { - if (mapping.getSourceQuery().toString().equals(parentSql)) - return mapping.getId(); - } - return null; - } - - private String getParentCond(String sql) { - int begin = sql.indexOf("PARENT."); - int end = sql.length(); - - if (sql.contains("AND")) - //i'm screwed - end = 0; - - return sql.substring(begin+7, end); - } - - private String getChildCond(String sql) { - int begin = sql.indexOf("CHILD."); - int end = sql.indexOf(" = "); - return sql.substring(begin+6, end); - } - - private String getChildSQL(String sql) { - String child = ""; - int index = sql.indexOf("("); - child = sql.substring(index+1,sql.indexOf(" as CHILD")-1); - - return (child); - } - - private String getParentSQL(String sql) { - String parent = ""; - int index = sql.indexOf("CHILD, "); - parent = sql.substring(index+8,sql.indexOf(" as PARENT")-1); - - return (parent); - } - - private String getSubjectMap(OBDAQuery targetQuery) { - - String subject = ""; - List classes = new ArrayList(); - CQIE cqie = (CQIE)targetQuery; - List body = cqie.getBody(); - Iterator it = body.iterator(); - while(it.hasNext()) - { - Term term = it.next(); - if (term instanceof Function) - { - Function atom = (Function) term; - int arity = atom.getTerms().size(); - - if (arity == 1) { - // class - if (atom.getPredicate().isClass()) - classes.add(atom.getFunctionSymbol().toString()); - } - } - - } - - //get first term = subject - Term term = body.get(0).getTerm(0); - if (term instanceof FunctionalTermImpl) - { - Function atom = (FunctionalTermImpl) term; - int arity = atom.getTerms().size(); - - - if (arity == 1) { - - // constant - arity 1 - if (!atom.getPredicate().isClass()) - subject += " rr:constant " + removeJoinKeyword(atom.getTerm(0))+ ";\n"; - - } else if (arity == 2 || atom.getPredicate().equals(OBDAVocabulary.RDFS_LITERAL_LANG)) { - - // column - arity 2 - base prefix + {} + 1 var - if (atom.getTerm(0).toString().equals("\"http://example.com/base/{}\"")) - subject += " rr:column \"\\\""+ removeJoinKeyword(atom.getTerm(1))+"\\\"\""; - else //template - arity 2 - subject += " rr:template " + getTemplate(atom); - - } else if (arity > 2) { - // template - any arity - subject += " rr:template " + getTemplate(atom) +"\n"; - } - - if (atom.getFunctionSymbol() instanceof BNodePredicateImpl) { - // bnode - subject += "; rr:termType rr:BlankNode "; - } - if (atom.getPredicate().equals(OBDAVocabulary.RDFS_LITERAL_LANG)) - subject += "; rr:termType rr:Literal "; - - - for(String cl : classes) - subject += ";\n\t\t\t\t\t rr:class <"+cl+">\n"; - } - - - return subject; - } - private String removeJoinKeyword(Term atom) - { - String str = atom.toString(); - if (str.startsWith("CHILD_")) - return str.substring(6); - else if (str.startsWith("PARENT_")) - return str.substring(7); - return str; - } - - private String getTemplate(Function atom) - { - String temp = atom.getTerm(0).toString(); - String newtemp = ""; - //copy uri part - int oldidx=0; - - int i=1; - while(temp.contains("{}")) - { - int idx = temp.indexOf("{}"); - newtemp+= temp.substring(oldidx, idx); - - oldidx = idx+2; - newtemp += "{\\\""+removeJoinKeyword(atom.getTerm(i)) + "\\\"}"; - i++; - temp = temp.replaceFirst("[{]", "["); - - } - - newtemp += temp.substring(oldidx, temp.length()); - return newtemp; - } - - private String getTableName(String sql) - { - int index = sql.indexOf("FROM"); - return sql.substring(index+5, sql.length()); - } - - - private List getPredObjMap(OBDAQuery targetQuery) - { - List predobj = new ArrayList(); - CQIE cqie = (CQIE)targetQuery; - List body = cqie.getBody(); - Iterator it = body.iterator(); - while(it.hasNext()) - { - Term term = it.next(); - if (term instanceof Function) - { - Function atom = (Function) term; - //not class atoms - if (atom.getTerms().size() > 1) - { - predobj.add("\t\t rr:predicate \t<"+atom.getFunctionSymbol().toString()+"> ;\n"+getObject(atom.getTerm(1))); - } - } - - } - - return predobj; - } - - private String getObject(Term obj) - { - String object = ""; - if(obj instanceof FunctionalTermImpl) - { - - FunctionalTermImpl fobj = ((FunctionalTermImpl) obj); - int size = fobj.getTerms().size(); - if (size == 1) - { //object - if (fobj.isDataTypeFunction()) { - Predicate p = fobj.getFunctionSymbol(); - if (p instanceof DataTypePredicate || p instanceof URITemplatePredicate) - object = "\t\t rr:objectMap \t[ rr:column \"\\\""+fobj.getTerm(0).toString()+"\\\"\"; rr:datatype <"+ p.toString() + "> ]"; - else - object = "\t\t rr:objectMap \t[ rr:column \"\\\""+fobj.getTerm(0).toString()+"\\\"\"; rr:datatype "+ p.toString() + " ]"; - } else - object = "\t\t rr:object \t "+((Function)obj).getTerm(0).toString(); - return object; - } - else - { - String lang ="", templ =""; - - if (fobj.getTerm(0).toString().startsWith("\"http")) - templ = " rr:template "+getTemplate((Function)obj); - else - templ = " rr:column \"\\\""+fobj.getTerm(0).toString()+"\\\"\""; - - - if (fobj.getFunctionSymbol().equals(OBDAVocabulary.RDFS_LITERAL_LANG)) - { - if(fobj.getTerm(size-1) instanceof ValueConstant){ - if (!((ValueConstant)(fobj.getTerm(size-1))).toString().equals(OBDAVocabulary.NULL.toString())) - lang = "; rr:language "+ fobj.getTerm(size-1).toString(); - } - object = "\t\t rr:objectMap \t[ "+templ+ lang+" ]"; - } - else - { - object = "\t\t rr:objectMap \t[ "+templ+" ]"; - } - } - } - else if (obj instanceof Variable) - object = "\t\t rr:objectMap [ rr:column \"\\\""+obj.toString()+"\\\"\" ]"; - else if (obj instanceof URIConstant) - System.out.println("URIConst: "+obj.toString()); - else if (obj instanceof ValueConstant) - System.out.println("ValueConst: "+obj.toString()); - else if (((Function)obj).isDataFunction()) - { - Iterator varcol = ((Function)obj).getVariables().iterator(); - object = "\t\t rr:objectMap \t[ rr:column \"\\\""+varcol.next().toString()+"\\\"\"; rr:datatype xsd:"+ - ((Function)obj).getFunctionSymbol().toString().split("#")[1]+"]"; - } - else - System.out.println("Found: "+obj.toString()); - - return object; - } - - public static void main(String args[]) - { - String file = "C:/Project/Test Cases/mapping2.ttl"; - //"C:/Project/Timi/Workspace/obdalib-parent/quest-rdb2rdf-compliance/src/main/resources/D004/r2rmlb.ttl"; - R2RMLReader reader = new R2RMLReader(file); - R2RMLWriter writer = new R2RMLWriter(reader.readModel(URI.create("blah")),URI.create("blah")); - File out = new File("C:/Project/Test Cases/mapping1.ttl"); - //"C:/Project/Timi/Workspace/obdalib-parent/quest-rdb2rdf-compliance/src/main/resources/D004/WRr2rmlb.ttl"); - writer.write(out); - - } -} diff --git a/obdalib-core/src/main/java/it/unibz/krdb/obda/model/impl/SQLQueryImpl.java b/obdalib-core/src/main/java/it/unibz/krdb/obda/model/impl/SQLQueryImpl.java index 934221cb1c9..54f5c676cf5 100644 --- a/obdalib-core/src/main/java/it/unibz/krdb/obda/model/impl/SQLQueryImpl.java +++ b/obdalib-core/src/main/java/it/unibz/krdb/obda/model/impl/SQLQueryImpl.java @@ -22,13 +22,17 @@ protected SQLQueryImpl(String sqlQuery) { this.sqlQuery = sqlQuery; } - @Override - public String toString() { + public String getSQLQuery() { if ((sqlQuery == null) || (sqlQuery.equals(""))) { return ""; } return sqlQuery; } + + @Override + public String toString() { + return getSQLQuery(); + } @Override public SQLQueryImpl clone() { diff --git a/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/DatalogQueryHelper.java b/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/DatalogQueryHelper.java index 41d2e94edba..e68284d8278 100644 --- a/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/DatalogQueryHelper.java +++ b/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/DatalogQueryHelper.java @@ -8,8 +8,8 @@ */ package it.unibz.krdb.obda.parser; -import it.unibz.krdb.obda.io.PrefixManager; import it.unibz.krdb.obda.model.OBDALibConstants; +import it.unibz.krdb.obda.io.PrefixManager; import java.util.Map; import java.util.Set; diff --git a/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/TargetQueryParser.java b/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/TargetQueryParser.java index 4f1e08924f3..b37e1c13c5e 100644 --- a/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/TargetQueryParser.java +++ b/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/TargetQueryParser.java @@ -8,8 +8,8 @@ */ package it.unibz.krdb.obda.parser; -import it.unibz.krdb.obda.io.PrefixManager; import it.unibz.krdb.obda.model.CQIE; +import it.unibz.krdb.obda.io.PrefixManager; public interface TargetQueryParser { diff --git a/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/TurtleOBDASyntaxParser.java b/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/TurtleOBDASyntaxParser.java index ee37c418947..c2ada7a82a8 100644 --- a/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/TurtleOBDASyntaxParser.java +++ b/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/TurtleOBDASyntaxParser.java @@ -8,9 +8,9 @@ */ package it.unibz.krdb.obda.parser; -import it.unibz.krdb.obda.io.PrefixManager; import it.unibz.krdb.obda.model.CQIE; import it.unibz.krdb.obda.model.impl.OBDAVocabulary; +import it.unibz.krdb.obda.io.PrefixManager; import java.util.Map; diff --git a/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/TurtleSyntaxParser.java b/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/TurtleSyntaxParser.java index c88489212e9..5fe8c39a9e5 100644 --- a/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/TurtleSyntaxParser.java +++ b/obdalib-core/src/main/java/it/unibz/krdb/obda/parser/TurtleSyntaxParser.java @@ -8,9 +8,9 @@ */ package it.unibz.krdb.obda.parser; -import it.unibz.krdb.obda.io.PrefixManager; import it.unibz.krdb.obda.model.CQIE; import it.unibz.krdb.obda.model.impl.OBDAVocabulary; +import it.unibz.krdb.obda.io.PrefixManager; import java.util.Map; diff --git a/obdalib-core/src/main/java/it/unibz/krdb/obda/renderer/TargetQueryRenderer.java b/obdalib-core/src/main/java/it/unibz/krdb/obda/renderer/TargetQueryRenderer.java index 3a708015505..22ed612cbf6 100644 --- a/obdalib-core/src/main/java/it/unibz/krdb/obda/renderer/TargetQueryRenderer.java +++ b/obdalib-core/src/main/java/it/unibz/krdb/obda/renderer/TargetQueryRenderer.java @@ -8,7 +8,6 @@ */ package it.unibz.krdb.obda.renderer; -import it.unibz.krdb.obda.io.PrefixManager; import it.unibz.krdb.obda.io.SimplePrefixManager; import it.unibz.krdb.obda.model.CQIE; import it.unibz.krdb.obda.model.DataTypePredicate; @@ -22,6 +21,7 @@ import it.unibz.krdb.obda.model.Variable; import it.unibz.krdb.obda.model.impl.FunctionalTermImpl; import it.unibz.krdb.obda.model.impl.OBDAVocabulary; +import it.unibz.krdb.obda.io.PrefixManager; import java.util.ArrayList; import java.util.List; diff --git a/obdalib-core/src/main/java/it/unibz/krdb/obda/uri/UriTemplateHelper.java b/obdalib-core/src/main/java/it/unibz/krdb/obda/uri/UriTemplateHelper.java new file mode 100644 index 00000000000..2e0d4c78d93 --- /dev/null +++ b/obdalib-core/src/main/java/it/unibz/krdb/obda/uri/UriTemplateHelper.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2009-2013, Free University of Bozen Bolzano + * This source code is available under the terms of the Affero General Public + * License v3. + * + * Please see LICENSE.txt for full license terms, including the availability of + * proprietary exceptions. + */ +package it.unibz.krdb.obda.uri; + +import it.unibz.krdb.obda.model.Function; +import it.unibz.krdb.obda.model.Variable; + +import java.util.Iterator; + +public class UriTemplateHelper { + + public static String getUriTemplateString(Function uriFunction) { + String template = uriFunction.getTerm(0).toString(); + Iterator vars = uriFunction.getVariables().iterator(); + String[] split = template.split("\\{\\}"); + int i = 0; + template = ""; + while (vars.hasNext()) { + template += split[i] + "{" + vars.next().toString() + "}"; + i++; + } + if (split.length-i > 1) + template += split[i]; + + return template; + } +} diff --git a/obdalib-core/src/main/resources/it/unibz/krdb/obda/utils/version.properties b/obdalib-core/src/main/resources/it/unibz/krdb/obda/utils/version.properties index 76b5b6feff4..4da3fe90d8a 100644 --- a/obdalib-core/src/main/resources/it/unibz/krdb/obda/utils/version.properties +++ b/obdalib-core/src/main/resources/it/unibz/krdb/obda/utils/version.properties @@ -1 +1 @@ -pluginVersion=1.8-b2564 +pluginVersion=1.8.0 diff --git a/obdalib-core/src/test/java/it/unibz/krdb/obda/api/io/PrefixRendererTest.java b/obdalib-core/src/test/java/it/unibz/krdb/obda/api/io/PrefixRendererTest.java index 4a82bba4a95..500faf1b5de 100644 --- a/obdalib-core/src/test/java/it/unibz/krdb/obda/api/io/PrefixRendererTest.java +++ b/obdalib-core/src/test/java/it/unibz/krdb/obda/api/io/PrefixRendererTest.java @@ -8,7 +8,6 @@ */ package it.unibz.krdb.obda.api.io; -import it.unibz.krdb.obda.io.PrefixManager; import it.unibz.krdb.obda.io.SimplePrefixManager; import it.unibz.krdb.obda.model.CQIE; import it.unibz.krdb.obda.model.DatalogProgram; @@ -17,6 +16,7 @@ import it.unibz.krdb.obda.model.OBDADataFactory; import it.unibz.krdb.obda.model.impl.FunctionalTermImpl; import it.unibz.krdb.obda.model.impl.OBDADataFactoryImpl; +import it.unibz.krdb.obda.io.PrefixManager; import java.util.Collections; import java.util.LinkedList; diff --git a/obdalib-core/src/test/java/it/unibz/krdb/obda/parser/TurtleSyntaxParserTest.java b/obdalib-core/src/test/java/it/unibz/krdb/obda/parser/TurtleSyntaxParserTest.java index af262295772..6b3645e0dcd 100644 --- a/obdalib-core/src/test/java/it/unibz/krdb/obda/parser/TurtleSyntaxParserTest.java +++ b/obdalib-core/src/test/java/it/unibz/krdb/obda/parser/TurtleSyntaxParserTest.java @@ -8,8 +8,8 @@ */ package it.unibz.krdb.obda.parser; -import it.unibz.krdb.obda.io.PrefixManager; import it.unibz.krdb.obda.io.SimplePrefixManager; +import it.unibz.krdb.obda.io.PrefixManager; import junit.framework.TestCase; import org.slf4j.Logger; diff --git a/obdalib-protege41/src/main/java/it/unibz/krdb/obda/protege4/gui/action/R2RMLExportAction.java b/obdalib-protege41/src/main/java/it/unibz/krdb/obda/protege4/gui/action/R2RMLExportAction.java index fa8d9ce1369..40f52d84a0e 100644 --- a/obdalib-protege41/src/main/java/it/unibz/krdb/obda/protege4/gui/action/R2RMLExportAction.java +++ b/obdalib-protege41/src/main/java/it/unibz/krdb/obda/protege4/gui/action/R2RMLExportAction.java @@ -8,11 +8,11 @@ */ package it.unibz.krdb.obda.protege4.gui.action; -import it.unibz.krdb.obda.io.R2RMLWriter; import it.unibz.krdb.obda.model.OBDAMappingAxiom; import it.unibz.krdb.obda.model.OBDAModel; import it.unibz.krdb.obda.model.impl.OBDAModelImpl; import it.unibz.krdb.obda.protege4.core.OBDAModelManager; +import it.unibz.krdb.obda.sesame.r2rml.R2RMLWriter; import java.awt.event.ActionEvent; import java.io.File; diff --git a/obdalib-protege41/src/main/java/it/unibz/krdb/obda/protege4/gui/action/R2RMLImportAction.java b/obdalib-protege41/src/main/java/it/unibz/krdb/obda/protege4/gui/action/R2RMLImportAction.java index 99443a21e34..c7bb13be373 100644 --- a/obdalib-protege41/src/main/java/it/unibz/krdb/obda/protege4/gui/action/R2RMLImportAction.java +++ b/obdalib-protege41/src/main/java/it/unibz/krdb/obda/protege4/gui/action/R2RMLImportAction.java @@ -9,11 +9,11 @@ package it.unibz.krdb.obda.protege4.gui.action; import it.unibz.krdb.obda.exception.DuplicateMappingException; -import it.unibz.krdb.obda.io.R2RMLReader; import it.unibz.krdb.obda.model.OBDAMappingAxiom; import it.unibz.krdb.obda.model.OBDAModel; import it.unibz.krdb.obda.model.impl.OBDAModelImpl; import it.unibz.krdb.obda.protege4.core.OBDAModelManager; +import it.unibz.krdb.obda.sesame.r2rml.R2RMLReader; import java.awt.event.ActionEvent; import java.io.File; diff --git a/obdalib-sesame/pom.xml b/obdalib-sesame/pom.xml new file mode 100644 index 00000000000..c06fc0a2ecc --- /dev/null +++ b/obdalib-sesame/pom.xml @@ -0,0 +1,68 @@ + + 4.0.0 + + obdalib-parent + inf.unibz.it.obda + 1.8 + + inf.unibz.it.obda + obdalib-sesame + 1.8 + + + + + ch.qos.logback + logback-classic + + + ch.qos.logback + logback-core + + + obdalib-core + inf.unibz.it.obda + 1.8 + + + slf4j-log4j12 + org.slf4j + + + + + + org.openrdf.sesame + sesame-runtime + + + org.openrdf.sesame + sesame-model + + + org.openrdf.sesame + sesame-rio-api + + + org.openrdf.sesame + sesame-rio-turtle + + + + + + + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + org.apache.maven.plugins + maven-jar-plugin + + + + \ No newline at end of file diff --git a/obdalib-core/src/main/java/it/unibz/krdb/obda/sesame/SesameRDFIterator.java b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/SesameRDFIterator.java similarity index 100% rename from obdalib-core/src/main/java/it/unibz/krdb/obda/sesame/SesameRDFIterator.java rename to obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/SesameRDFIterator.java diff --git a/quest-sesame/src/main/java/sesameWrapper/SesameStatement.java b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/SesameStatement.java similarity index 99% rename from quest-sesame/src/main/java/sesameWrapper/SesameStatement.java rename to obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/SesameStatement.java index 0af4864fec6..6e32914156b 100644 --- a/quest-sesame/src/main/java/sesameWrapper/SesameStatement.java +++ b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/SesameStatement.java @@ -6,7 +6,7 @@ * Please see LICENSE.txt for full license terms, including the availability of * proprietary exceptions. */ -package sesameWrapper; +package it.unibz.krdb.obda.sesame; import it.unibz.krdb.obda.model.BNode; import it.unibz.krdb.obda.model.Constant; diff --git a/quest-sesame/src/main/java/sesameWrapper/SesameStatementIterator.java b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/SesameStatementIterator.java similarity index 96% rename from quest-sesame/src/main/java/sesameWrapper/SesameStatementIterator.java rename to obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/SesameStatementIterator.java index f2968adbac3..ea0edc79097 100644 --- a/quest-sesame/src/main/java/sesameWrapper/SesameStatementIterator.java +++ b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/SesameStatementIterator.java @@ -6,7 +6,7 @@ * Please see LICENSE.txt for full license terms, including the availability of * proprietary exceptions. */ -package sesameWrapper; +package it.unibz.krdb.obda.sesame; import it.unibz.krdb.obda.model.OBDADataFactory; import it.unibz.krdb.obda.model.impl.OBDADataFactoryImpl; @@ -34,19 +34,16 @@ public SesameStatementIterator(Iterator it) { this.iterator = it; } - @Override public boolean hasNext() { return iterator.hasNext(); } - @Override public Statement next() { Assertion assertion = iterator.next(); Statement individual = new SesameStatement(assertion); return individual; } - @Override public void remove() { throw new UnsupportedOperationException("This iterator is read-only"); } diff --git a/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/OBDAMappingTransformer.java b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/OBDAMappingTransformer.java new file mode 100644 index 00000000000..bf30bbf5297 --- /dev/null +++ b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/OBDAMappingTransformer.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2009-2013, Free University of Bozen Bolzano + * This source code is available under the terms of the Affero General Public + * License v3. + * + * Please see LICENSE.txt for full license terms, including the availability of + * proprietary exceptions. + * + * @author Timea Bagosi + */ +package it.unibz.krdb.obda.sesame.r2rml; + +import it.unibz.krdb.obda.model.CQIE; +import it.unibz.krdb.obda.model.DataTypePredicate; +import it.unibz.krdb.obda.model.Function; +import it.unibz.krdb.obda.model.OBDAMappingAxiom; +import it.unibz.krdb.obda.model.OBDAQueryModifiers; +import it.unibz.krdb.obda.model.Predicate; +import it.unibz.krdb.obda.model.Term; +import it.unibz.krdb.obda.model.URITemplatePredicate; +import it.unibz.krdb.obda.model.ValueConstant; +import it.unibz.krdb.obda.model.Variable; +import it.unibz.krdb.obda.model.impl.OBDAVocabulary; +import it.unibz.krdb.obda.model.impl.SQLQueryImpl; +import it.unibz.krdb.obda.uri.UriTemplateHelper; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Random; +import java.util.Set; + +import org.openrdf.model.Resource; +import org.openrdf.model.Statement; +import org.openrdf.model.ValueFactory; +import org.openrdf.model.impl.ValueFactoryImpl; + +import com.hp.hpl.jena.vocabulary.RDFS; + +public class OBDAMappingTransformer { + + private ValueFactory vf; + + public OBDAMappingTransformer() { + this.vf = new ValueFactoryImpl(); + } + + public Set getStatements(OBDAMappingAxiom axiom) { + Set statements = new HashSet(); + SQLQueryImpl squery = (SQLQueryImpl) axiom.getSourceQuery(); + CQIE tquery = (CQIE) axiom.getTargetQuery(); + + int idx = 0; + Random rand = new Random(); + idx = rand.nextInt(10000); + + //triplesMap node + String mapping_id = axiom.getId(); + if (!mapping_id.startsWith("http://")) + mapping_id = "http://example.org/" + mapping_id; + Resource mainNode = vf.createURI(mapping_id); + statements.add(vf.createStatement(mainNode, vf.createURI(OBDAVocabulary.RDF_TYPE), R2RMLVocabulary.TriplesMap)); + + //process source query + String sqlquery = squery.getSQLQuery(); + OBDAQueryModifiers modifiers = squery.getQueryModifiers(); + if (sqlquery.startsWith("SELECT * FROM") && + !sqlquery.contains("WHERE") && !sqlquery.contains(",")) { + //tableName -> need small parser + Resource logicalTableNode = vf.createBNode("logicalTableNode" + idx); + String tableName = sqlquery.substring(14); + //tableName = trimApostrophes(tableName); + statements.add(vf.createStatement(mainNode, R2RMLVocabulary.logicalTable, logicalTableNode)); + statements.add(vf.createStatement(logicalTableNode, R2RMLVocabulary.tableName, vf.createLiteral(tableName))); +// } else if (sqlquery.contains("CHILD")) { +// //join mapping +// + + } else { + //sqlquery -> general case + statements.add(vf.createStatement(mainNode, R2RMLVocabulary.sqlQuery, vf.createLiteral(sqlquery))); + } + + //get subject uri + Resource subjectNode = vf.createBNode("subjectMap" +idx); + Function uriTemplate = (Function) tquery.getBody().get(0).getTerm(0); //URI("..{}..", , ) + String subjectURI = UriTemplateHelper.getUriTemplateString(uriTemplate); + //add subject Map to triples Map node + statements.add(vf.createStatement(mainNode, R2RMLVocabulary.subjectMap, subjectNode)); + //add template subject + statements.add(vf.createStatement(subjectNode, R2RMLVocabulary.template, vf.createURI(subjectURI))); + //TODO: deal with column and termType + + + //process target query + for (Function func : tquery.getBody()) { + Predicate pred = func.getFunctionSymbol(); + if (pred.isClass()) { + //add class declaration to subject Map node + statements.add(vf.createStatement(subjectNode, R2RMLVocabulary.classUri, vf.createURI(pred.getName()))); + } else { + + Resource predObjNode = vf.createBNode("predicateObjectMap"+ idx); + //add predicateObjectMap to triples Map node + statements.add(vf.createStatement(mainNode, R2RMLVocabulary.predicateObjectMap, predObjNode)); + //add predicate declaration to predObj node + statements.add(vf.createStatement(predObjNode, R2RMLVocabulary.predicate, vf.createURI(pred.getName()))); + //add object declaration to predObj node + //term 0 is always the subject, we are interested in term 1 + Term object = func.getTerm(1); + Resource objNode = vf.createBNode("objectMap"+idx); + statements.add(vf.createStatement(predObjNode, R2RMLVocabulary.objectMap, objNode)); + if (object instanceof Variable){ + statements.add(vf.createStatement(objNode, R2RMLVocabulary.column, vf.createLiteral(((Variable) object).getName()))); + } else if (object instanceof Function) { + //check if uritemplate + Predicate objectPred = ((Function) object).getFunctionSymbol(); + if (objectPred instanceof URITemplatePredicate) { + String objectURI = UriTemplateHelper.getUriTemplateString((Function)object); + //add template object + statements.add(vf.createStatement(objNode, R2RMLVocabulary.template, vf.createURI(objectURI))); + }else if (objectPred instanceof DataTypePredicate) { + statements.add(vf.createStatement(objNode, R2RMLVocabulary.constant, vf.createLiteral(((Function) object).getTerm(0).toString()))); + statements.add(vf.createStatement(objNode, R2RMLVocabulary.datatype, vf.createURI(objectPred.getName()))); + } + } else { + System.out.println("FOUND UNKNOWN: "+object.toString()); + } + } + + } + + return statements; + } + + private String trimApostrophes(String input) { + input = input.trim(); + while (input.startsWith("\"")) + input = input.substring(1); + while (input.endsWith("\"")) + input = input.substring(0, input.length()-1); + return input; + } + + +} diff --git a/obdalib-core/src/main/java/it/unibz/krdb/obda/io/R2RMLManager.java b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLManager.java similarity index 93% rename from obdalib-core/src/main/java/it/unibz/krdb/obda/io/R2RMLManager.java rename to obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLManager.java index 1d8920ce4c3..6d6d33ea1bc 100644 --- a/obdalib-core/src/main/java/it/unibz/krdb/obda/io/R2RMLManager.java +++ b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLManager.java @@ -6,15 +6,15 @@ * Please see LICENSE.txt for full license terms, including the availability of * proprietary exceptions. */ -package it.unibz.krdb.obda.io; +package it.unibz.krdb.obda.sesame.r2rml; import it.unibz.krdb.obda.model.CQIE; import it.unibz.krdb.obda.model.Function; -import it.unibz.krdb.obda.model.Term; import it.unibz.krdb.obda.model.OBDADataFactory; import it.unibz.krdb.obda.model.OBDALibConstants; import it.unibz.krdb.obda.model.OBDAMappingAxiom; import it.unibz.krdb.obda.model.Predicate; +import it.unibz.krdb.obda.model.Term; import it.unibz.krdb.obda.model.Variable; import it.unibz.krdb.obda.model.impl.OBDADataFactoryImpl; import it.unibz.krdb.obda.model.impl.OBDAVocabulary; @@ -25,11 +25,13 @@ import java.net.URL; import java.util.ArrayList; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Set; import org.openrdf.model.Graph; import org.openrdf.model.Resource; +import org.openrdf.model.Statement; import org.openrdf.rio.RDFFormat; import org.openrdf.rio.RDFParser; import org.openrdf.rio.Rio; @@ -54,7 +56,7 @@ public R2RMLManager(File file) { InputStream in = new FileInputStream(file); URL documentUrl = new URL("file://" + file); myGraph = new org.openrdf.model.impl.GraphImpl(); - StatementCollector collector = new StatementCollector(myGraph); + StatementCollector collector = new StatementCollector(myGraph); parser.setRDFHandler(collector); parser.parse(in, documentUrl.toString()); } catch (Exception e) { @@ -62,7 +64,16 @@ public R2RMLManager(File file) { } } + public R2RMLManager(Graph graph){ + myGraph = graph; + r2rmlParser = new R2RMLParser(); + + } + public Graph getGraph() { + Iterator it = myGraph.iterator(); + while (it.hasNext()) + System.out.println(it.next()); return myGraph; } @@ -128,7 +139,7 @@ private List getJoinMappings(Graph myGraph, Resource tripleMap Term joinSubject1 = r2rmlParser.getSubjectAtom(myGraph, tripleMap); Term joinSubject1Child = r2rmlParser.getSubjectAtom(myGraph, tripleMap, "CHILD_"); - + int idx = 1; //for each predicateobject map that contains a join for (Resource joinPredObjNode : joinNodes) { //get the predicates @@ -177,9 +188,10 @@ private List getJoinMappings(Graph myGraph, Resource tripleMap throw new Exception("Could not create source query for join in "+tripleMap.stringValue()); } //finally, create mapping and add it to the list - OBDAMappingAxiom mapping = fac.getRDBMSMappingAxiom("mapping-join-"+tripleMap.stringValue(), sourceQuery, targetQuery); - - System.out.println("joinMapping: "+mapping.toString()); + OBDAMappingAxiom mapping = fac.getRDBMSMappingAxiom("mapping-join"+idx+"-"+tripleMap.stringValue(), sourceQuery, targetQuery); + idx++; + System.out.println("WARNING joinMapping introduced : "+mapping.toString()); + System.out.println("Renaming of variables as CHILD_ and PARENT_ introduced!"); joinMappings.add(mapping); } diff --git a/obdalib-core/src/main/java/it/unibz/krdb/obda/io/R2RMLParser.java b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLParser.java similarity index 74% rename from obdalib-core/src/main/java/it/unibz/krdb/obda/io/R2RMLParser.java rename to obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLParser.java index 0c90995a0e9..c534e852eea 100644 --- a/obdalib-core/src/main/java/it/unibz/krdb/obda/io/R2RMLParser.java +++ b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLParser.java @@ -6,7 +6,7 @@ * Please see LICENSE.txt for full license terms, including the availability of * proprietary exceptions. */ -package it.unibz.krdb.obda.io; +package it.unibz.krdb.obda.sesame.r2rml; import it.unibz.krdb.obda.model.Constant; import it.unibz.krdb.obda.model.DataTypePredicate; @@ -38,52 +38,13 @@ public class R2RMLParser { - private final String baseuri = "http://example.com/base/"; - - public static final ValueFactory fact = new ValueFactoryImpl(); - public final URI TriplesMap = fact.createURI("http://www.w3.org/ns/r2rml#TriplesMap"); - - public final URI logicalTable = fact.createURI("http://www.w3.org/ns/r2rml#logicalTable"); - public final URI tableName = fact.createURI("http://www.w3.org/ns/r2rml#tableName"); - public final URI baseTableOrView = fact.createURI("http://www.w3.org/ns/r2rml#baseTableOrView"); - public final URI r2rmlView = fact.createURI("http://www.w3.org/ns/r2rml#R2RMLView"); - - public final URI subjectMap = fact.createURI("http://www.w3.org/ns/r2rml#subjectMap"); - public final URI subject = fact.createURI("http://www.w3.org/ns/r2rml#subject"); - public final URI predicateObjectMap = fact.createURI("http://www.w3.org/ns/r2rml#predicateObjectMap"); - public final URI predicateMap = fact.createURI("http://www.w3.org/ns/r2rml#predicateMap"); - public final URI objectMap = fact.createURI("http://www.w3.org/ns/r2rml#objectMap"); - public final URI object = fact.createURI("http://www.w3.org/ns/r2rml#object"); - public final URI refObjectMap = fact.createURI("http://www.w3.org/ns/r2rml#refObjectMap"); - public final URI graphMap = fact.createURI("http://www.w3.org/ns/r2rml#graphMap"); - public final URI graph = fact.createURI("http://www.w3.org/ns/r2rml#graph"); - - public final URI predicate = fact.createURI("http://www.w3.org/ns/r2rml#predicate"); - public final URI template = fact.createURI("http://www.w3.org/ns/r2rml#template"); - public final URI column = fact.createURI("http://www.w3.org/ns/r2rml#column"); - public final URI constant = fact.createURI("http://www.w3.org/ns/r2rml#constant"); - public final URI termType = fact.createURI("http://www.w3.org/ns/r2rml#termType"); - public final URI language = fact.createURI("http://www.w3.org/ns/r2rml#language"); - public final URI datatype = fact.createURI("http://www.w3.org/ns/r2rml#datatype"); - public final URI inverseExpression = fact.createURI("http://www.w3.org/ns/r2rml#inverseExpression"); - public final URI iri = fact.createURI("http://www.w3.org/ns/r2rml#IRI"); - public final URI blankNode = fact.createURI("http://www.w3.org/ns/r2rml#BlankNode"); - public final URI literal = fact.createURI("http://www.w3.org/ns/r2rml#Literal"); - public final URI classUri = fact.createURI("http://www.w3.org/ns/r2rml#class"); - public final URI sqlQuery = fact.createURI("http://www.w3.org/ns/r2rml#sqlQuery"); - public final URI sqlVersion = fact.createURI("http://www.w3.org/ns/r2rml#sqlVersion"); - - public final URI parentTriplesMap = fact.createURI("http://www.w3.org/ns/r2rml#parentTriplesMap"); - public final URI joinCondition = fact.createURI("http://www.w3.org/ns/r2rml#joinCondition"); - public final URI child = fact.createURI("http://www.w3.org/ns/r2rml#child"); - public final URI parent = fact.createURI("http://www.w3.org/ns/r2rml#parent"); - - private OBDADataFactory fac = OBDADataFactoryImpl.getInstance(); + private ValueFactory fact; + private OBDADataFactory fac; Iterator iterator, newiterator; - List classPredicates = new ArrayList(); - List joinPredObjNodes = new ArrayList(); + List classPredicates; + List joinPredObjNodes; String parsedString = ""; String subjectString = ""; @@ -91,7 +52,10 @@ public class R2RMLParser { String basePrefix = ""; public R2RMLParser() { - + classPredicates = new ArrayList(); + joinPredObjNodes = new ArrayList(); + fact = new ValueFactoryImpl(); + fac = OBDADataFactoryImpl.getInstance(); } /* @@ -99,11 +63,11 @@ public R2RMLParser() { */ public Set getMappingNodes(Graph myGraph) { - Set resources = GraphUtil.getSubjects(myGraph, logicalTable, null); + Set resources = GraphUtil.getSubjects(myGraph, R2RMLVocabulary.logicalTable, null); Set nodes = new HashSet(); for (Resource subj : resources) { //add resource if it's a triplesMap declaration - iterator = myGraph.match(subj, fact.createURI(OBDAVocabulary.RDF_TYPE), TriplesMap); + iterator = myGraph.match(subj, fact.createURI(OBDAVocabulary.RDF_TYPE), R2RMLVocabulary.TriplesMap); if (iterator.hasNext()) { nodes.add(subj); } @@ -121,7 +85,7 @@ public String getSQLQuery(Graph myGraph, Resource subj) { String sqlString; // search for logicalTable declaration - Set objects = GraphUtil.getObjects(myGraph, subj, logicalTable); + Set objects = GraphUtil.getObjects(myGraph, subj, R2RMLVocabulary.logicalTable); if (objects.size() > 0){ Resource object = (Resource) objects.toArray()[0]; @@ -139,7 +103,7 @@ public String getSQLQuery(Graph myGraph, Resource subj) { // search for r2rmlview declaration - tableit = myGraph.match(object, r2rmlView, null); + tableit = myGraph.match(object, R2RMLVocabulary.r2rmlView, null); if (tableit.hasNext()) { Resource objectt = (Resource) tableit.next().getObject(); @@ -149,7 +113,7 @@ public String getSQLQuery(Graph myGraph, Resource subj) { } // search for basetableorview declaration - tableit = myGraph.match(object, baseTableOrView, null, + tableit = myGraph.match(object, R2RMLVocabulary.baseTableOrView, null, (Resource) null); if (tableit.hasNext()) { Resource objectt = (Resource) tableit.next().getObject(); @@ -170,7 +134,7 @@ public String getSQLQuery(Graph myGraph, Resource subj) { private String getSQLQueryString(Graph myGraph, Resource object) { // search for sqlQuery declarations - Iterator tableit = myGraph.match(object, sqlQuery, null); + Iterator tableit = myGraph.match(object, R2RMLVocabulary.sqlQuery, null); if (tableit.hasNext()) { String sqlString = tableit.next().getObject().toString(); // System.out.println(sqlString); @@ -185,7 +149,7 @@ private String getSQLQueryString(Graph myGraph, Resource object) { private String getSQLTableName(Graph myGraph, Resource object){ //look for tableName declaration - Iterator newiterator = myGraph.match(object, tableName, null); + Iterator newiterator = myGraph.match(object, R2RMLVocabulary.tableName, null); if (newiterator.hasNext()) { String sqlString = newiterator.next().getObject().toString(); // System.out.println(sqlString); @@ -205,7 +169,7 @@ public List getClassPredicates() { public Set getPredicateObjects(Graph myGraph, Resource subj) { // process PREDICATEOBJECTs Set predobjs = new HashSet(); - Set objectss = GraphUtil.getObjects(myGraph, subj, predicateObjectMap); + Set objectss = GraphUtil.getObjects(myGraph, subj, R2RMLVocabulary.predicateObjectMap); for (Value objectVal : objectss) { Resource object = (Resource) objectVal; predobjs.add(object); @@ -223,11 +187,11 @@ public Term getSubjectAtom(Graph myGraph, Resource subj, String joinCond) Term subjectAtom = null; // process SUBJECT - Set objects = GraphUtil.getObjects(myGraph, subj, subjectMap); + Set objects = GraphUtil.getObjects(myGraph, subj, R2RMLVocabulary.subjectMap); Resource object = (Resource) objects.toArray()[0]; // process template declaration - iterator = myGraph.match(object, template, null); + iterator = myGraph.match(object, R2RMLVocabulary.template, null); if (iterator.hasNext()) { parsedString = iterator.next().getObject().toString(); // System.out.println(parsedString); @@ -237,7 +201,7 @@ public Term getSubjectAtom(Graph myGraph, Resource subj, String joinCond) } // process column declaration - iterator = myGraph.match(object, column, null); + iterator = myGraph.match(object, R2RMLVocabulary.column, null); if (iterator.hasNext()) { parsedString = iterator.next().getObject().toString(); // System.out.println(parsedString); @@ -246,7 +210,7 @@ public Term getSubjectAtom(Graph myGraph, Resource subj, String joinCond) } // process constant declaration - iterator = myGraph.match(object, constant, null); + iterator = myGraph.match(object, R2RMLVocabulary.constant, null); if (iterator.hasNext()) { parsedString = iterator.next().getObject().toString(); // System.out.println(parsedString); @@ -255,7 +219,7 @@ public Term getSubjectAtom(Graph myGraph, Resource subj, String joinCond) } // process termType declaration - iterator = myGraph.match(object, termType, null); + iterator = myGraph.match(object, R2RMLVocabulary.termType, null); if (iterator.hasNext()) { parsedString = iterator.next().getObject().toString(); // System.out.println(parsedString); @@ -263,7 +227,7 @@ public Term getSubjectAtom(Graph myGraph, Resource subj, String joinCond) } // process class declaration - iterator = myGraph.match(object, classUri, null); + iterator = myGraph.match(object, R2RMLVocabulary.classUri, null); while (iterator.hasNext()) { parsedString = iterator.next().getObject().toString(); // System.out.println(parsedString); @@ -289,7 +253,7 @@ public List getBodyPredicates(Graph myGraph, Resource object) // process PREDICATE // look for the predicate - iterator = myGraph.match(object, predicate, null); + iterator = myGraph.match(object, R2RMLVocabulary.predicate, null); while (iterator.hasNext()) { parsedString = iterator.next().getObject().toString(); // System.out.println(parsedString); @@ -299,12 +263,12 @@ public List getBodyPredicates(Graph myGraph, Resource object) // process PREDICATEMAP // look for the predicateMap - iterator = myGraph.match(object, predicateMap, null); + iterator = myGraph.match(object, R2RMLVocabulary.predicateMap, null); while (iterator.hasNext()) { Resource objectt = (Resource) (iterator.next().getObject()); // process constant declaration - Iterator newiterator = myGraph.match(objectt, constant, null); + Iterator newiterator = myGraph.match(objectt, R2RMLVocabulary.constant, null); if (newiterator.hasNext()) { parsedString = newiterator.next().getObject().toString(); // System.out.println(parsedString); @@ -331,7 +295,7 @@ public Term getObjectAtom(Graph myGraph, Resource objectt, String joinCond) // process OBJECT // look for the object - iterator = myGraph.match(objectt, this.object, null); + iterator = myGraph.match(objectt, R2RMLVocabulary.object, null); if (iterator.hasNext()) { parsedString = iterator.next().getObject().toString(); // System.out.println(parsedString); @@ -350,12 +314,12 @@ public Term getObjectAtom(Graph myGraph, Resource objectt, String joinCond) } // process OBJECTMAP - iterator = myGraph.match(objectt, objectMap, null); + iterator = myGraph.match(objectt, R2RMLVocabulary.objectMap, null); if (iterator.hasNext()) { Resource object = (Resource) (iterator.next().getObject()); // look for column declaration - newiterator = myGraph.match(object, column, null); + newiterator = myGraph.match(object, R2RMLVocabulary.column, null); if (newiterator.hasNext()) { parsedString = newiterator.next().getObject().toString(); objectString = trim(parsedString); @@ -367,7 +331,7 @@ public Term getObjectAtom(Graph myGraph, Resource objectt, String joinCond) // look for constant declaration - newiterator = myGraph.match(object, constant, null); + newiterator = myGraph.match(object, R2RMLVocabulary.constant, null); if (newiterator.hasNext()) { parsedString = newiterator.next().getObject().toString(); // System.out.println(parsedString); @@ -379,7 +343,7 @@ public Term getObjectAtom(Graph myGraph, Resource objectt, String joinCond) } // look for template declaration - newiterator = myGraph.match(object, template, null); + newiterator = myGraph.match(object, R2RMLVocabulary.template, null); if (newiterator.hasNext()) { parsedString = newiterator.next().getObject().toString(); @@ -389,7 +353,7 @@ public Term getObjectAtom(Graph myGraph, Resource objectt, String joinCond) } // process termType declaration - newiterator = myGraph.match(object, termType, null); + newiterator = myGraph.match(object, R2RMLVocabulary.termType, null); if (newiterator.hasNext()) { parsedString = newiterator.next().getObject().toString(); // System.out.println(parsedString); @@ -398,7 +362,7 @@ public Term getObjectAtom(Graph myGraph, Resource objectt, String joinCond) } // look for language declaration - newiterator = myGraph.match(object, language, null); + newiterator = myGraph.match(object, R2RMLVocabulary.language, null); if (newiterator.hasNext()) { parsedString = newiterator.next().getObject().toString(); // System.out.println(parsedString); @@ -410,7 +374,7 @@ public Term getObjectAtom(Graph myGraph, Resource objectt, String joinCond) } // look for datatype declaration - newiterator = myGraph.match(object, datatype, null); + newiterator = myGraph.match(object, R2RMLVocabulary.datatype, null); if (newiterator.hasNext()) { parsedString = newiterator.next().getObject().toString(); // System.out.println(parsedString); @@ -468,12 +432,12 @@ public List getJoinNodes(Graph myGraph, Resource termMap) // for each predicate object map // process OBJECTMAP - iterator = myGraph.match(predobj, objectMap, null); + iterator = myGraph.match(predobj, R2RMLVocabulary.objectMap, null); if (iterator.hasNext()) { Resource objectt = (Resource) (iterator.next().getObject()); // look for parentTriplesMap declaration - newiterator = myGraph.match(objectt, parentTriplesMap, null); + newiterator = myGraph.match(objectt, R2RMLVocabulary.parentTriplesMap, null); if (newiterator.hasNext()) { // found a join condition, add the predicateobject node to the list joinPredObjNodes.add(predobj); @@ -485,15 +449,15 @@ public List getJoinNodes(Graph myGraph, Resource termMap) private Function getTermTypeAtom(String type, String string) { - if (type.contentEquals(iri.stringValue())) { + if (type.contentEquals(R2RMLVocabulary.iri.stringValue())) { return getURIFunction(string); - } else if (type.contentEquals(blankNode.stringValue())) { + } else if (type.contentEquals(R2RMLVocabulary.blankNode.stringValue())) { return getTypedFunction(string, 2); - } else if (type.contentEquals(literal.stringValue())) { + } else if (type.contentEquals(R2RMLVocabulary.literal.stringValue())) { return getTypedFunction(trim(string), 3); } @@ -519,7 +483,7 @@ public Function getTypedFunction(String parsedString, int type, String joinCond) String string = (parsedString); if (!string.contains("{")) if (!string.startsWith("http://")) - { string = baseuri + "{" + string + "}"; + { string = R2RMLVocabulary.baseuri + "{" + string + "}"; if (type == 2) string = "\"" + string + "\""; } @@ -528,7 +492,7 @@ public Function getTypedFunction(String parsedString, int type, String joinCond) type = 0; } if (type == 1 && !string.startsWith("http://")) - string = baseuri + string; + string = R2RMLVocabulary.baseuri + string; string = string.replace("\\{", "["); string = string.replace("\\}", "]"); @@ -603,12 +567,12 @@ private String trimTo1(String string) { public Resource getReferencedTripleMap(Graph myGraph, Resource predobjNode) { // process OBJECTMAP - iterator = myGraph.match(predobjNode, objectMap, null); + iterator = myGraph.match(predobjNode, R2RMLVocabulary.objectMap, null); if (iterator.hasNext()) { Resource object = (Resource) (iterator.next().getObject()); // look for parentTriplesMap declaration - newiterator = myGraph.match(object, parentTriplesMap, null); + newiterator = myGraph.match(object, R2RMLVocabulary.parentTriplesMap, null); if (newiterator.hasNext()) { return (Resource)newiterator.next().getObject(); } @@ -619,17 +583,17 @@ public Resource getReferencedTripleMap(Graph myGraph, Resource predobjNode) { public String getChildColumn(Graph myGraph, Resource predobjNode) { // process OBJECTMAP - iterator = myGraph.match(predobjNode, objectMap, null); + iterator = myGraph.match(predobjNode, R2RMLVocabulary.objectMap, null); if (iterator.hasNext()) { Resource object = (Resource) (iterator.next().getObject()); // look for joincondition declaration - newiterator = myGraph.match(object, joinCondition, null); + newiterator = myGraph.match(object, R2RMLVocabulary.joinCondition, null); if (newiterator.hasNext()) { Resource objectt = (Resource) (newiterator.next().getObject()); // look for child declaration - Iterator newiterator2 = myGraph.match(objectt, child, null); + Iterator newiterator2 = myGraph.match(objectt, R2RMLVocabulary.child, null); if (newiterator2.hasNext()) { return trimTo1(newiterator2.next().getObject().stringValue()); } @@ -640,17 +604,17 @@ public String getChildColumn(Graph myGraph, Resource predobjNode) { public String getParentColumn(Graph myGraph, Resource predobjNode) { // process OBJECTMAP - iterator = myGraph.match(predobjNode, objectMap, null); + iterator = myGraph.match(predobjNode, R2RMLVocabulary.objectMap, null); if (iterator.hasNext()) { Resource object = (Resource) (iterator.next().getObject()); // look for joincondition declaration - newiterator = myGraph.match(object, joinCondition, null); + newiterator = myGraph.match(object, R2RMLVocabulary.joinCondition, null); if (newiterator.hasNext()) { Resource objectt = (Resource) (newiterator.next().getObject()); // look for parent declaration - Iterator newiterator2 = myGraph.match(objectt, parent, null); + Iterator newiterator2 = myGraph.match(objectt, R2RMLVocabulary.parent, null); if (newiterator2.hasNext()) { return trimTo1(newiterator2.next().getObject().stringValue()); } diff --git a/obdalib-core/src/main/java/it/unibz/krdb/obda/io/R2RMLReader.java b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLReader.java similarity index 84% rename from obdalib-core/src/main/java/it/unibz/krdb/obda/io/R2RMLReader.java rename to obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLReader.java index c8f0b1e4956..45ce1490635 100644 --- a/obdalib-core/src/main/java/it/unibz/krdb/obda/io/R2RMLReader.java +++ b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLReader.java @@ -6,7 +6,7 @@ * Please see LICENSE.txt for full license terms, including the availability of * proprietary exceptions. */ -package it.unibz.krdb.obda.io; +package it.unibz.krdb.obda.sesame.r2rml; import java.io.File; import java.net.URI; @@ -32,33 +32,33 @@ public class R2RMLReader { private Graph graph ; + public R2RMLReader(Graph graph) { + manager = new R2RMLManager(graph); + this.graph = graph; + } + public R2RMLReader(String file) { this(new File(file)); } - public R2RMLReader(File file) + public R2RMLReader(File file, OBDAModel model) { - - manager = new R2RMLManager(file); - graph = manager.getGraph(); + this(file); + obdaModel = model; } - public R2RMLReader(File file, OBDAModel model) + public R2RMLReader(File file) { - manager = new R2RMLManager(file); graph = manager.getGraph(); - obdaModel = model; } - public void setOBDAModel(OBDAModel model) { this.obdaModel = model; } - - + public OBDAModel readModel(URI sourceUri){ try { //add to the model the mappings retrieved from the manager @@ -76,12 +76,14 @@ public ArrayList readMappings(){ public static void main(String args[]) { - String file = "C:/Project/Test Cases/mapping.ttl"; + String file = "/Users/timi/Documents/hdd/Project/Test Cases/mapping1.ttl"; // "C:/Project/Timi/Workspace/obdalib-parent/quest-rdb2rdf-compliance/src/main/resources/D014/r2rmla.ttl"; //"C:/Project/Timi/Workspace/obdalib-parent/quest-rdb2rdf-compliance/src/main/resources/D004/WRr2rmlb.ttl"; R2RMLReader reader = new R2RMLReader(file); - reader.readMappings(); + ArrayList axioms = reader.readMappings(); + for (OBDAMappingAxiom ax : axioms) + System.out.println(ax); } diff --git a/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLVocabulary.java b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLVocabulary.java new file mode 100644 index 00000000000..5e8c9d0945b --- /dev/null +++ b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLVocabulary.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2009-2013, Free University of Bozen Bolzano + * This source code is available under the terms of the Affero General Public + * License v3. + * + * Please see LICENSE.txt for full license terms, including the availability of + * proprietary exceptions. + */ +package it.unibz.krdb.obda.sesame.r2rml; + +import org.openrdf.model.URI; +import org.openrdf.model.ValueFactory; +import org.openrdf.model.impl.ValueFactoryImpl; + +public class R2RMLVocabulary { + + public static final String baseuri = "http://example.com/base/"; + + public static final ValueFactory fact = new ValueFactoryImpl(); + public static final URI TriplesMap = fact.createURI("http://www.w3.org/ns/r2rml#TriplesMap"); + + public static final URI logicalTable = fact.createURI("http://www.w3.org/ns/r2rml#logicalTable"); + public static final URI tableName = fact.createURI("http://www.w3.org/ns/r2rml#tableName"); + public static final URI baseTableOrView = fact.createURI("http://www.w3.org/ns/r2rml#baseTableOrView"); + public static final URI r2rmlView = fact.createURI("http://www.w3.org/ns/r2rml#R2RMLView"); + + public static final URI subjectMap = fact.createURI("http://www.w3.org/ns/r2rml#subjectMap"); + public static final URI subject = fact.createURI("http://www.w3.org/ns/r2rml#subject"); + public static final URI predicateObjectMap = fact.createURI("http://www.w3.org/ns/r2rml#predicateObjectMap"); + public static final URI predicateMap = fact.createURI("http://www.w3.org/ns/r2rml#predicateMap"); + public static final URI objectMap = fact.createURI("http://www.w3.org/ns/r2rml#objectMap"); + public static final URI object = fact.createURI("http://www.w3.org/ns/r2rml#object"); + public static final URI refObjectMap = fact.createURI("http://www.w3.org/ns/r2rml#refObjectMap"); + public static final URI graphMap = fact.createURI("http://www.w3.org/ns/r2rml#graphMap"); + public static final URI graph = fact.createURI("http://www.w3.org/ns/r2rml#graph"); + + public static final URI predicate = fact.createURI("http://www.w3.org/ns/r2rml#predicate"); + public static final URI template = fact.createURI("http://www.w3.org/ns/r2rml#template"); + public static final URI column = fact.createURI("http://www.w3.org/ns/r2rml#column"); + public static final URI constant = fact.createURI("http://www.w3.org/ns/r2rml#constant"); + public static final URI termType = fact.createURI("http://www.w3.org/ns/r2rml#termType"); + public static final URI language = fact.createURI("http://www.w3.org/ns/r2rml#language"); + public static final URI datatype = fact.createURI("http://www.w3.org/ns/r2rml#datatype"); + public static final URI inverseExpression = fact.createURI("http://www.w3.org/ns/r2rml#inverseExpression"); + public static final URI iri = fact.createURI("http://www.w3.org/ns/r2rml#IRI"); + public static final URI blankNode = fact.createURI("http://www.w3.org/ns/r2rml#BlankNode"); + public static final URI literal = fact.createURI("http://www.w3.org/ns/r2rml#Literal"); + public static final URI classUri = fact.createURI("http://www.w3.org/ns/r2rml#class"); + public static final URI sqlQuery = fact.createURI("http://www.w3.org/ns/r2rml#sqlQuery"); + public static final URI sqlVersion = fact.createURI("http://www.w3.org/ns/r2rml#sqlVersion"); + + public static final URI parentTriplesMap = fact.createURI("http://www.w3.org/ns/r2rml#parentTriplesMap"); + public static final URI joinCondition = fact.createURI("http://www.w3.org/ns/r2rml#joinCondition"); + public static final URI child = fact.createURI("http://www.w3.org/ns/r2rml#child"); + public static final URI parent = fact.createURI("http://www.w3.org/ns/r2rml#parent"); + +} diff --git a/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLWriter.java b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLWriter.java new file mode 100644 index 00000000000..5cfc1310b4b --- /dev/null +++ b/obdalib-sesame/src/main/java/it/unibz/krdb/obda/sesame/r2rml/R2RMLWriter.java @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2009-2013, Free University of Bozen Bolzano + * This source code is available under the terms of the Affero General Public + * License v3. + * + * Please see LICENSE.txt for full license terms, including the availability of + * proprietary exceptions. + */ +package it.unibz.krdb.obda.sesame.r2rml; + +import it.unibz.krdb.obda.io.PrefixManager; +import it.unibz.krdb.obda.model.CQIE; +import it.unibz.krdb.obda.model.DataTypePredicate; +import it.unibz.krdb.obda.model.Function; +import it.unibz.krdb.obda.model.OBDAMappingAxiom; +import it.unibz.krdb.obda.model.OBDAModel; +import it.unibz.krdb.obda.model.OBDAQuery; +import it.unibz.krdb.obda.model.Predicate; +import it.unibz.krdb.obda.model.Term; +import it.unibz.krdb.obda.model.URIConstant; +import it.unibz.krdb.obda.model.URITemplatePredicate; +import it.unibz.krdb.obda.model.ValueConstant; +import it.unibz.krdb.obda.model.Variable; +import it.unibz.krdb.obda.model.impl.BNodePredicateImpl; +import it.unibz.krdb.obda.model.impl.FunctionalTermImpl; +import it.unibz.krdb.obda.model.impl.OBDAVocabulary; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.openrdf.model.Graph; +import org.openrdf.model.Statement; +import org.openrdf.model.impl.GraphImpl; +import org.openrdf.rio.turtle.TurtleWriter; + + +public class R2RMLWriter { + + private BufferedWriter out; + private List mappings; + private URI sourceUri; + private PrefixManager prefixmng; + + public R2RMLWriter(File file, OBDAModel obdamodel, URI sourceURI) + { + try { + this.out = new BufferedWriter(new FileWriter(file)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + this.sourceUri = sourceURI; + this.mappings = obdamodel.getMappings(sourceUri); + this.prefixmng = obdamodel.getPrefixManager(); + } + + public R2RMLWriter(OBDAModel obdamodel, URI sourceURI) + { + this.sourceUri = sourceURI; + this.mappings = obdamodel.getMappings(sourceUri); + this.prefixmng = obdamodel.getPrefixManager(); + } + + /** + * call this method if you need the RDF Graph + * that represents the R2RML mappings + * @return an RDF Graph + */ + public Graph getGraph() { + OBDAMappingTransformer transformer = new OBDAMappingTransformer(); + Set statements = new HashSet(); + for (OBDAMappingAxiom axiom: this.mappings) { + statements.addAll(transformer.getStatements(axiom)); + } + @SuppressWarnings("deprecation") + Graph g = new GraphImpl(); + g.addAll(statements); + return g; + } + + /** + * the method to write the R2RML mappings + * from an rdf Graph to a file + * @param file the ttl file to write to + */ + public void write(File file) + { + try { + //retrieve rdf graph to write + Graph result = getGraph(); + //open output stream + this.out = new BufferedWriter(new FileWriter(file)); + //set up turtle writer + TurtleWriter writer = new TurtleWriter(this.out); + writer.startRDF(); + //handle namespaces + Map prefixes = this.prefixmng.getPrefixMap(); + for (String pref : prefixes.keySet()) { + writer.handleNamespace(pref, prefixes.get(pref)); + } + //write graph statements + Iterator stIterator = result.iterator(); + while (stIterator.hasNext()) { + writer.handleStatement(stIterator.next()); + } + writer.endRDF(); + //close output stream + out.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + public static void main(String args[]) + { + String file = "/Users/timi/Documents/hdd/Project/Test Cases/mapping1.ttl"; + R2RMLReader reader = new R2RMLReader(file); + + R2RMLWriter writer = new R2RMLWriter(reader.readModel(URI.create("blah")),URI.create("blah")); + File out = new File("/Users/timi/Documents/hdd/Project/Test Cases/mapping1out.ttl"); + //"C:/Project/Timi/Workspace/obdalib-parent/quest-rdb2rdf-compliance/src/main/resources/D004/WRr2rmlb.ttl"); + Graph g = writer.getGraph(); + Iterator st = g.iterator(); + while (st.hasNext()) + System.out.println(st.next()); + writer.write(out); + + } +} diff --git a/pom.xml b/pom.xml index 6ba8eca73a2..8930ac84a2c 100644 --- a/pom.xml +++ b/pom.xml @@ -9,12 +9,6 @@ http://obda.inf.unibz.it/ - - junit - junit - 4.10 - test - @@ -22,12 +16,14 @@ reformulation-core obdalib-owlapi3 obdalib-protege41 + obdalib-sesame quest-owlapi3 quest-distribution quest-sparql-compliance quest-sesame quest-db quest-rdb2rdf-compliance + @@ -101,7 +97,7 @@ junit junit - 3.8.1 + 4.10 test @@ -117,17 +113,17 @@ org.slf4j slf4j-api - 1.5.11 + 1.6.4 ch.qos.logback logback-classic - 0.9.20 + 1.0.2 ch.qos.logback logback-core - 0.9.20 + 1.0.2 xsdlib @@ -187,7 +183,7 @@ org.slf4j log4j-over-slf4j - 1.5.11 + 1.6.4 commons-logging diff --git a/quest-db/pom.xml b/quest-db/pom.xml index 9792baedff0..69ef3544b43 100644 --- a/quest-db/pom.xml +++ b/quest-db/pom.xml @@ -30,6 +30,11 @@ quest-owlapi3 1.8 + + inf.unibz.it.obda + obdalib-sesame + 1.8 + org.openrdf.sesame diff --git a/quest-db/src/main/java/it/unibz/krdb/obda/owlrefplatform/questdb/QuestDBVirtualStore.java b/quest-db/src/main/java/it/unibz/krdb/obda/owlrefplatform/questdb/QuestDBVirtualStore.java index f71e8a7251b..e5bdd70947f 100644 --- a/quest-db/src/main/java/it/unibz/krdb/obda/owlrefplatform/questdb/QuestDBVirtualStore.java +++ b/quest-db/src/main/java/it/unibz/krdb/obda/owlrefplatform/questdb/QuestDBVirtualStore.java @@ -8,10 +8,8 @@ */ package it.unibz.krdb.obda.owlrefplatform.questdb; -import it.unibz.krdb.obda.exception.DuplicateMappingException; import it.unibz.krdb.obda.exception.InvalidMappingException; import it.unibz.krdb.obda.io.ModelIOManager; -import it.unibz.krdb.obda.io.R2RMLReader; import it.unibz.krdb.obda.model.OBDADataFactory; import it.unibz.krdb.obda.model.OBDADataSource; import it.unibz.krdb.obda.model.OBDAException; @@ -27,13 +25,16 @@ import it.unibz.krdb.obda.owlrefplatform.core.QuestConnection; import it.unibz.krdb.obda.owlrefplatform.core.QuestConstants; import it.unibz.krdb.obda.owlrefplatform.core.QuestPreferences; +import it.unibz.krdb.obda.sesame.r2rml.R2RMLReader; +import it.unibz.krdb.sql.DBMetadata; import java.io.File; import java.io.IOException; import java.net.URI; -import java.sql.SQLException; +import java.util.Properties; import java.util.Set; +import org.openrdf.model.Graph; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.model.OWLOntology; import org.semanticweb.owlapi.model.OWLOntologyIRIMapper; @@ -55,84 +56,195 @@ public class QuestDBVirtualStore extends QuestDBAbstractStore { private static OBDADataFactory fac = OBDADataFactoryImpl.getInstance(); protected transient OWLOntologyManager man = OWLManager.createOWLOntologyManager(); + private OWLAPI3Translator translator = new OWLAPI3Translator(); public QuestDBVirtualStore(String name, URI obdaURI) throws Exception { this(name, null, obdaURI, null); } public QuestDBVirtualStore(String name, URI obdaURI, QuestPreferences config) throws Exception { - this(name, null, obdaURI, config); } - // constructors String, URI, URI, (Config) public QuestDBVirtualStore(String name, URI tboxFile, URI obdaURI) throws Exception { - this(name, tboxFile, obdaURI, null); - + } + + public QuestDBVirtualStore(String name, QuestPreferences pref) throws Exception { + // direct mapping : no tbox, no obda file, repo in-mem h2 + this(name, (URI)null, null, pref); } + /** + * The method generates the OBDAModel from an + * obda or ttl (r2rml) file + * @param obdaURI - the file URI + * @return the generated OBDAModel + * @throws IOException + * @throws InvalidMappingException + */ public OBDAModel getObdaModel(URI obdaURI) throws IOException, InvalidMappingException { + //create empty model OBDAModel obdaModel = fac.getOBDAModel(); // System.out.println(obdaURI.toString()); if (obdaURI.toString().endsWith(".obda")) { + //read obda file ModelIOManager modelIO = new ModelIOManager(obdaModel); modelIO.load(new File(obdaURI)); } else if (obdaURI.toString().endsWith(".ttl")) { + //read R2RML file R2RMLReader reader = new R2RMLReader(new File(obdaURI)); obdaModel = reader.readModel(obdaURI); - } return obdaModel; } + /** + * The constructor to setup Quest virtual store given + * an owl file URI and an obda or R2rml mapping file URI + * @param name - the name of the triple store + * @param tboxFile - the owl file URI + * @param obdaUri - the obda or ttl file URI + * @param config - QuestPreferences + * @throws Exception + */ public QuestDBVirtualStore(String name, URI tboxFile, URI obdaUri, QuestPreferences config) throws Exception { super(name); + //obtain the model OBDAModel obdaModel = null; if (obdaUri == null) { log.debug("No mappings where given, mappings will be automatically generated."); + //obtain model from direct mapping RDB2RDF method obdaModel = getOBDAModelDM(); } else { + //obtain model from file obdaModel = getObdaModel(obdaUri); } + //set config preferences values if (config == null) { config = new QuestPreferences(); } + //we are working in virtual mode config.setProperty(QuestPreferences.ABOX_MODE, QuestConstants.VIRTUAL); + //obtain the ontology OWLOntology owlontology = null; Ontology tbox; if (tboxFile != null) { - OWLAPI3Translator translator = new OWLAPI3Translator(); - OWLOntologyIRIMapper iriMapper = new AutoIRIMapper(new File(tboxFile).getParentFile(), false); - man.addIRIMapper(iriMapper); - owlontology = man.loadOntologyFromOntologyDocument(new File(tboxFile)); - Set clousure = man.getImportsClosure(owlontology); - - tbox = translator.mergeTranslateOntologies(clousure); + //read owl file + owlontology = getOntologyFromFile(tboxFile); + //get transformation from owlontology into ontology + tbox = getOntologyFromOWLOntology(owlontology); - } else { // create empty ontology + } else { + // create empty ontology owlontology = man.createOntology();// createOntology(OBDADataFactoryImpl.getIRI(name)); tbox = OntologyFactoryImpl.getInstance().createOntology(); if (obdaModel.getSources().size() == 0) obdaModel.addSource(getMemOBDADataSource("MemH2")); } - OBDAModelSynchronizer.declarePredicates(owlontology, obdaModel); - questInstance = new Quest(tbox, obdaModel, config); + //set up Quest + setupQuest(tbox, obdaModel, null, config); + } - questInstance.setupRepository(); + + /** + * Constructor to start Quest given an OWL ontology and an RDF Graph + * representing R2RML mappings + * @param name - the name of the triple store + * @param tbox - the OWLOntology + * @param mappings - the RDF Graph (Sesame API) + * @param pref - QuestPreferences + * @throws Exception + */ + public QuestDBVirtualStore(String name, OWLOntology tbox, Graph mappings, DBMetadata metadata, QuestPreferences config) throws Exception { + //call super constructor -> QuestDBAbstractStore + super(name); + + //obtain ontology + Ontology ontology = getOntologyFromOWLOntology(tbox); + //obtain datasource + OBDADataSource source = getDataSourceFromConfig(config); + //obtain obdaModel + R2RMLReader reader = new R2RMLReader(mappings); + OBDAModel obdaModel = reader.readModel(source.getSourceID()); + //add data source to model + obdaModel.addSource(source); + OBDAModelSynchronizer.declarePredicates(tbox, obdaModel); + //setup Quest + setupQuest(ontology, obdaModel, metadata, config); + } + + +private OBDADataSource getDataSourceFromConfig(QuestPreferences config) { + String id = config.get(QuestPreferences.DBNAME).toString(); + String url = config.get(QuestPreferences.JDBC_URL).toString(); + String username = config.get(QuestPreferences.DBUSER).toString(); + String password = config.get(QuestPreferences.DBPASSWORD).toString(); + String driver = config.get(QuestPreferences.JDBC_DRIVER).toString(); + + OBDADataSource source = OBDADataFactoryImpl.getInstance().getDataSource(URI.create(id)); + source.setParameter(RDBMSourceParameterConstants.DATABASE_URL, url); + source.setParameter(RDBMSourceParameterConstants.DATABASE_USERNAME, username); + source.setParameter(RDBMSourceParameterConstants.DATABASE_PASSWORD, password); + source.setParameter(RDBMSourceParameterConstants.DATABASE_DRIVER, driver); + + return source; } - public QuestDBVirtualStore(String name, QuestPreferences pref) throws Exception { - // direct mapping : no tbox, no obda file, repo in-mem h2 - this(name, null, null, pref); + /** + * Given a URI of an owl file returns the + * translated OWLOntology object + * @param tboxFile - the URI of the file + * @return the translated OWLOntology + * @throws Exception + */ + private OWLOntology getOntologyFromFile(URI tboxFile) throws Exception{ + //get owl ontology from file + OWLOntologyIRIMapper iriMapper = new AutoIRIMapper(new File(tboxFile).getParentFile(), false); + man.addIRIMapper(iriMapper); + OWLOntology owlontology = man.loadOntologyFromOntologyDocument(new File(tboxFile)); + + return owlontology; + } + + /** + * Given an OWL ontology returns the translated Ontology + * of its closure + * @param owlontology + * @return the translated Ontology + * @throws Exception + */ + private Ontology getOntologyFromOWLOntology(OWLOntology owlontology) throws Exception{ + //compute closure first (owlontology might contain include other source declarations) + Set clousure = owlontology.getOWLOntologyManager().getImportsClosure(owlontology); + return translator.mergeTranslateOntologies(clousure); + } + + private void setupQuest(Ontology tbox, OBDAModel obdaModel, DBMetadata metadata, QuestPreferences pref) throws Exception { + //start Quest with the given ontology and model and preferences + if (metadata == null) { + //start up quest by obtaining metadata from given data source + questInstance = new Quest(tbox, obdaModel, pref); + } + else { + //start up quest with given metadata + questInstance = new Quest(tbox, obdaModel, metadata, pref); + } + + questInstance.setupRepository(); } + /** + * Create an in-memory H2 database data source + * @param name - the datasource name + * @return the created OBDADataSource + */ private static OBDADataSource getMemOBDADataSource(String name) { OBDADataSource obdaSource = OBDADataFactoryImpl.getInstance().getDataSource(URI.create(name)); @@ -149,10 +261,14 @@ private static OBDADataSource getMemOBDADataSource(String name) { obdaSource.setParameter(RDBMSourceParameterConstants.DATABASE_USERNAME, username); obdaSource.setParameter(RDBMSourceParameterConstants.IS_IN_MEMORY, "true"); obdaSource.setParameter(RDBMSourceParameterConstants.USE_DATASOURCE_FOR_ABOXDUMP, "true"); + return (obdaSource); - } + /** + * Generate an OBDAModel from Direct Mapping (Bootstrapping) + * @return the OBDAModel + */ private OBDAModel getOBDAModelDM() { DirectMappingEngine dm = new DirectMappingEngine("http://example.org/base", 0); @@ -165,6 +281,10 @@ private OBDAModel getOBDAModelDM() { return null; } + /** + * Get a Quest connection from the Quest instance + * @return the QuestConnection + */ public QuestConnection getQuestConnection() { try { // System.out.println("getquestconn.."); diff --git a/quest-owlapi3/pom.xml b/quest-owlapi3/pom.xml index d7578df6e99..714ec6bba43 100644 --- a/quest-owlapi3/pom.xml +++ b/quest-owlapi3/pom.xml @@ -15,6 +15,11 @@ ch.qos.logback logback-classic + + junit + junit + test + ch.qos.logback logback-core @@ -34,6 +39,11 @@ reformulation-core 1.8 + + inf.unibz.it.obda + obdalib-sesame + 1.8 + net.sourceforge.owlapi owlapi-api diff --git a/quest-rdb2rdf-compliance/pom.xml b/quest-rdb2rdf-compliance/pom.xml index 30d1beaf032..e110c60a813 100644 --- a/quest-rdb2rdf-compliance/pom.xml +++ b/quest-rdb2rdf-compliance/pom.xml @@ -19,6 +19,11 @@ ch.qos.logback logback-core + + junit + junit + test + inf.unibz.it.obda obdalib-core diff --git a/quest-sesame/pom.xml b/quest-sesame/pom.xml index 6020104d86c..61577fadf1c 100644 --- a/quest-sesame/pom.xml +++ b/quest-sesame/pom.xml @@ -8,7 +8,7 @@ quest-sesame quest-sesame - This is the Sesame API implementation basedon Quest + This is the Sesame API implementation based on Quest @@ -19,6 +19,11 @@ ch.qos.logback logback-core + + junit + junit + test + obdalib-core inf.unibz.it.obda @@ -35,6 +40,11 @@ inf.unibz.it.obda 1.8 + + obdalib-sesame + inf.unibz.it.obda + 1.8 + reformulation-core inf.unibz.it.obda diff --git a/quest-sesame/src/main/java/sesameWrapper/QuestSesameMaterializerCMD.java b/quest-sesame/src/main/java/sesameWrapper/QuestSesameMaterializerCMD.java index 3c3e8fd0e07..319247f29f7 100644 --- a/quest-sesame/src/main/java/sesameWrapper/QuestSesameMaterializerCMD.java +++ b/quest-sesame/src/main/java/sesameWrapper/QuestSesameMaterializerCMD.java @@ -10,13 +10,14 @@ import it.unibz.krdb.obda.exception.InvalidMappingException; import it.unibz.krdb.obda.io.ModelIOManager; -import it.unibz.krdb.obda.io.R2RMLReader; import it.unibz.krdb.obda.model.OBDAModel; import it.unibz.krdb.obda.model.impl.OBDADataFactoryImpl; import it.unibz.krdb.obda.ontology.Ontology; import it.unibz.krdb.obda.owlapi3.OBDAModelSynchronizer; import it.unibz.krdb.obda.owlapi3.OWLAPI3Translator; import it.unibz.krdb.obda.owlrefplatform.questdb.QuestDBVirtualStore; +import it.unibz.krdb.obda.sesame.SesameStatementIterator; +import it.unibz.krdb.obda.sesame.r2rml.R2RMLReader; import java.io.BufferedWriter; import java.io.File; diff --git a/quest-sesame/src/main/java/sesameWrapper/SemanticIndexCMD.java b/quest-sesame/src/main/java/sesameWrapper/SemanticIndexCMD.java index 1739d40c421..ff926336585 100644 --- a/quest-sesame/src/main/java/sesameWrapper/SemanticIndexCMD.java +++ b/quest-sesame/src/main/java/sesameWrapper/SemanticIndexCMD.java @@ -29,8 +29,6 @@ import java.net.URI; import java.sql.Connection; -import junit.framework.TestCase; - import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.model.OWLOntology; import org.semanticweb.owlapi.model.OWLOntologyManager; diff --git a/quest-sesame/src/main/java/sesameWrapper/SesameGraphQuery.java b/quest-sesame/src/main/java/sesameWrapper/SesameGraphQuery.java index 513091e28be..09d6758a72e 100644 --- a/quest-sesame/src/main/java/sesameWrapper/SesameGraphQuery.java +++ b/quest-sesame/src/main/java/sesameWrapper/SesameGraphQuery.java @@ -13,6 +13,7 @@ import it.unibz.krdb.obda.ontology.Assertion; import it.unibz.krdb.obda.owlrefplatform.core.QuestDBConnection; import it.unibz.krdb.obda.owlrefplatform.core.QuestDBStatement; +import it.unibz.krdb.obda.sesame.SesameStatement; import java.util.HashMap; import java.util.LinkedList; diff --git a/quest-sesame/src/main/java/sesameWrapper/SesameMaterializer.java b/quest-sesame/src/main/java/sesameWrapper/SesameMaterializer.java index d04193c844f..35a4d8b1c2f 100644 --- a/quest-sesame/src/main/java/sesameWrapper/SesameMaterializer.java +++ b/quest-sesame/src/main/java/sesameWrapper/SesameMaterializer.java @@ -12,6 +12,7 @@ import it.unibz.krdb.obda.ontology.Assertion; import it.unibz.krdb.obda.ontology.Ontology; import it.unibz.krdb.obda.owlrefplatform.core.abox.QuestMaterializer; +import it.unibz.krdb.obda.sesame.SesameStatementIterator; import java.util.Iterator; diff --git a/quest-sesame/src/main/java/sesameWrapper/SesameVirtualRepo.java b/quest-sesame/src/main/java/sesameWrapper/SesameVirtualRepo.java index 9520967fc3d..10d20027f5f 100644 --- a/quest-sesame/src/main/java/sesameWrapper/SesameVirtualRepo.java +++ b/quest-sesame/src/main/java/sesameWrapper/SesameVirtualRepo.java @@ -13,12 +13,18 @@ import it.unibz.krdb.obda.owlrefplatform.core.QuestDBConnection; import it.unibz.krdb.obda.owlrefplatform.core.QuestPreferences; import it.unibz.krdb.obda.owlrefplatform.questdb.QuestDBVirtualStore; +import it.unibz.krdb.sql.DBMetadata; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; import java.net.URI; +import java.util.Properties; +import org.openrdf.model.Graph; import org.openrdf.repository.RepositoryException; +import org.semanticweb.owlapi.model.OWLOntology; public class SesameVirtualRepo extends SesameAbstractRepo { @@ -30,10 +36,60 @@ public SesameVirtualRepo(String name, String obdaFile, boolean existential, Stri this(name, null, obdaFile, existential, rewriting); } + public SesameVirtualRepo(String name, String obdaFile, String configFileName) throws Exception { + this(name, null, obdaFile, configFileName); + } + public SesameVirtualRepo(String name, String tboxFile, String obdaFile, boolean existential, String rewriting) throws Exception { super(); + createRepo(name, tboxFile, obdaFile, getPreferencesFromSettings(existential, rewriting)); + } + + public SesameVirtualRepo(String name, String tboxFile, String obdaFile, String configFileName) throws Exception { + super(); + createRepo(name, tboxFile, obdaFile, getPreferencesFromFile(configFileName)); + } + + public SesameVirtualRepo(String name, OWLOntology tbox, Graph mappings, String configFileName) throws Exception { + super(); + createRepo(name, tbox, mappings, null, getPreferencesFromFile(configFileName)); + } + public SesameVirtualRepo(String name, OWLOntology tbox, Graph mappings, QuestPreferences config) throws Exception { + this(name, tbox, mappings, null, config); + } + public SesameVirtualRepo(String name, OWLOntology tbox, Graph mappings, DBMetadata metadata, QuestPreferences prop) throws Exception { + super(); + createRepo(name, tbox, mappings, metadata, prop); + } + + /** + * Generate QuestPreferences from a config file + * @param configFileName - the path to the config file + * @return the read QuestPreferences object + * @throws FileNotFoundException + * @throws IOException + */ + private QuestPreferences getPreferencesFromFile(String configFileName) throws FileNotFoundException, IOException { + QuestPreferences pref = new QuestPreferences(); + if (!configFileName.isEmpty()) { + File configFile = new File(URI.create(configFileName)); + pref.readDefaultPropertiesFile(new FileInputStream(configFile)); + } else { + pref.readDefaultPropertiesFile(); + } + return pref; + } + + /** + * Generate a QuestPreferences object from some passed + * arguments as settings + * @param existential - boolean to turn existential reasoning on or off (default=false) + * @param rewriting - String to indicate rewriting technique to be used (default=TreeWitness) + * @return the QuestPreferences object + */ + private QuestPreferences getPreferencesFromSettings(boolean existential, String rewriting) { QuestPreferences pref = new QuestPreferences(); pref.setCurrentValueOf(QuestPreferences.ABOX_MODE, QuestConstants.VIRTUAL); if (existential) @@ -44,51 +100,40 @@ public SesameVirtualRepo(String name, String tboxFile, String obdaFile, boolean pref.setCurrentValueOf(QuestPreferences.REFORMULATION_TECHNIQUE, QuestConstants.TW); else if (rewriting.equals("Default")) pref.setCurrentValueOf(QuestPreferences.REFORMULATION_TECHNIQUE, QuestConstants.UCQBASED); - - createRepo(name, tboxFile, obdaFile, pref); + return pref; } - public SesameVirtualRepo(String name, String obdaFile, String configFileName) throws Exception { - - this(name, null, obdaFile, configFileName); - } - - public SesameVirtualRepo(String name, String tboxFile, String obdaFile, String configFileName) throws Exception { - super(); - QuestPreferences pref = new QuestPreferences(); - if (!configFileName.isEmpty()) { - File configFile = new File(URI.create(configFileName)); - pref.readDefaultPropertiesFile(new FileInputStream(configFile)); - } else { - pref.readDefaultPropertiesFile(); - } - - createRepo(name, tboxFile, obdaFile, pref); + private void createRepo(String name, OWLOntology tbox, Graph mappings, DBMetadata metadata, QuestPreferences pref) throws Exception + { + this.virtualStore = new QuestDBVirtualStore(name, tbox, mappings, metadata, pref); } - private void createRepo(String name, String tboxFile, String mappingFile, QuestPreferences pref) throws Exception { if (mappingFile == null) { + //if we have no mappings this.virtualStore = new QuestDBVirtualStore(name, pref); } else { + //generate obdaURI URI obdaURI; if (mappingFile.startsWith("file:")) obdaURI = URI.create(mappingFile); else obdaURI = new File(mappingFile).toURI(); - if (tboxFile == null) + if (tboxFile == null) { + //if we have no owl file this.virtualStore = new QuestDBVirtualStore(name, obdaURI, pref); - else { + } else { + //if we have both owl and mappings file + //generate tboxURI URI tboxURI; if (tboxFile.startsWith("file:")) tboxURI = URI.create(tboxFile); else tboxURI = new File(tboxFile).toURI(); - this.virtualStore = new QuestDBVirtualStore(name, tboxURI, - obdaURI, pref); + this.virtualStore = new QuestDBVirtualStore(name, tboxURI, obdaURI, pref); } } } diff --git a/quest-sesame/src/main/java/sesameWrapper/example/ABoxSesameMaterializerExample.java b/quest-sesame/src/main/java/sesameWrapper/example/ABoxSesameMaterializerExample.java index bf7c99029b6..4df20006541 100644 --- a/quest-sesame/src/main/java/sesameWrapper/example/ABoxSesameMaterializerExample.java +++ b/quest-sesame/src/main/java/sesameWrapper/example/ABoxSesameMaterializerExample.java @@ -12,6 +12,7 @@ import it.unibz.krdb.obda.model.OBDADataFactory; import it.unibz.krdb.obda.model.OBDAModel; import it.unibz.krdb.obda.model.impl.OBDADataFactoryImpl; +import it.unibz.krdb.obda.sesame.SesameStatementIterator; import java.io.BufferedWriter; import java.io.File; @@ -23,7 +24,6 @@ import org.openrdf.rio.n3.N3Writer; import sesameWrapper.SesameMaterializer; -import sesameWrapper.SesameStatementIterator; public class ABoxSesameMaterializerExample { diff --git a/quest-sesame/src/main/java/sesameWrapper/example/QuestSesameVirtualExample.java b/quest-sesame/src/main/java/sesameWrapper/example/QuestSesameVirtualExample.java index 92838cce13d..7131b43578f 100644 --- a/quest-sesame/src/main/java/sesameWrapper/example/QuestSesameVirtualExample.java +++ b/quest-sesame/src/main/java/sesameWrapper/example/QuestSesameVirtualExample.java @@ -8,8 +8,19 @@ */ package sesameWrapper.example; +import it.unibz.krdb.obda.io.ModelIOManager; +import it.unibz.krdb.obda.model.OBDAModel; +import it.unibz.krdb.obda.model.impl.OBDADataFactoryImpl; +import it.unibz.krdb.obda.owlrefplatform.core.QuestConstants; +import it.unibz.krdb.obda.owlrefplatform.core.QuestPreferences; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URL; import java.util.List; +import org.openrdf.model.Graph; import org.openrdf.model.Value; import org.openrdf.query.BindingSet; import org.openrdf.query.QueryLanguage; @@ -17,6 +28,15 @@ import org.openrdf.query.TupleQueryResult; import org.openrdf.repository.Repository; import org.openrdf.repository.RepositoryConnection; +import org.openrdf.rio.RDFFormat; +import org.openrdf.rio.RDFParser; +import org.openrdf.rio.Rio; +import org.openrdf.rio.helpers.StatementCollector; +import org.semanticweb.owlapi.apibinding.OWLManager; +import org.semanticweb.owlapi.model.OWLOntology; +import org.semanticweb.owlapi.model.OWLOntologyIRIMapper; +import org.semanticweb.owlapi.model.OWLOntologyManager; +import org.semanticweb.owlapi.util.AutoIRIMapper; import sesameWrapper.SesameVirtualRepo; @@ -28,6 +48,7 @@ public class QuestSesameVirtualExample { */ final String owlFile = "src/main/resources/example/exampleBooks.owl"; final String obdaFile = "src/main/resources/example/exampleBooks.obda"; + final String ttlFile = "src/main/resources/example/Books-mappings.ttl"; public void runQuery() throws Exception { @@ -37,6 +58,7 @@ public void runQuery() throws Exception { * TreeWitness algorithm. */ Repository repo = new SesameVirtualRepo("virtualExample", owlFile, obdaFile, false, "TreeWitness"); + /* * Repository must be always initialized first @@ -95,10 +117,103 @@ public void runQuery() throws Exception { } } + public void runR2RML() throws Exception { + /* + * Create a Quest Sesame repository with additional setup that uses no + * existential reasoning and the rewriting technique is using + * TreeWitness algorithm. + */ + + //create owlontology from file + OWLOntologyManager man = OWLManager.createOWLOntologyManager(); + OWLOntologyIRIMapper iriMapper = new AutoIRIMapper(new File(owlFile).getParentFile(), false); + man.addIRIMapper(iriMapper); + OWLOntology owlontology = man.loadOntologyFromOntologyDocument(new File(owlFile)); + + //create RDF Graph from ttl file + RDFParser parser = Rio.createParser(RDFFormat.TURTLE); + InputStream in = new FileInputStream(ttlFile); + URL documentUrl = new URL("file://" + ttlFile); + Graph myGraph = new org.openrdf.model.impl.GraphImpl(); + StatementCollector collector = new StatementCollector(myGraph); + parser.setRDFHandler(collector); + parser.parse(in, documentUrl.toString()); + + QuestPreferences pref = new QuestPreferences(); + pref.setCurrentValueOf(QuestPreferences.ABOX_MODE, QuestConstants.VIRTUAL); + pref.setCurrentValueOf(QuestPreferences.REWRITE, "true"); + pref.setCurrentValueOf(QuestPreferences.REFORMULATION_TECHNIQUE, QuestConstants.TW); + //set jdbc params in config + pref.setCurrentValueOf(QuestPreferences.DBNAME, "books"); + pref.setCurrentValueOf(QuestPreferences.JDBC_URL, "jdbc:mysql://10.7.20.39/books?sessionVariables=sql_mode='ANSI'"); + pref.setCurrentValueOf(QuestPreferences.DBUSER, "fish"); + pref.setCurrentValueOf(QuestPreferences.DBPASSWORD, "fish"); + pref.setCurrentValueOf(QuestPreferences.JDBC_DRIVER, "com.mysql.jdbc.Driver"); + + Repository repo = new SesameVirtualRepo("virtualExample2", owlontology, myGraph, pref); + + System.out.println(myGraph); + /* + * Repository must be always initialized first + */ + repo.initialize(); + + /* + * Get the repository connection + */ + RepositoryConnection con = repo.getConnection(); + + /* + * Sample query: show all books with their title. + */ + String sparqlQuery = + "PREFIX : \n" + + "SELECT ?x ?y \n" + + "WHERE {?x a :Book; :hasEdition ?y}"; + + try { + TupleQuery tupleQuery = con.prepareTupleQuery(QueryLanguage.SPARQL, sparqlQuery); + TupleQueryResult result = tupleQuery.evaluate(); + + /* + * Print out the results to the standard output + */ + List bindingNames = result.getBindingNames(); + System.out.println(bindingNames); + + while (result.hasNext()) { + BindingSet bindingSet = result.next(); + boolean needSeparator = false; + for (String binding : bindingNames) { + if (needSeparator) { + System.out.print(", "); + } + Value value = bindingSet.getValue(binding); + System.out.print(value.toString()); + needSeparator = true; + } + System.out.println(); + } + + /* + * Close result set to release resources + */ + result.close(); + } finally { + + /* + * Finally close the connection to release resources + */ + if (con != null && con.isOpen()) { + con.close(); + } + } + } public static void main(String[] args) { try { QuestSesameVirtualExample example = new QuestSesameVirtualExample(); - example.runQuery(); + // example.runQuery(); + example.runR2RML(); } catch (Exception e) { e.printStackTrace(); } diff --git a/quest-sesame/src/main/resources/example/Books-mappings.ttl b/quest-sesame/src/main/resources/example/Books-mappings.ttl new file mode 100644 index 00000000000..719939f7680 --- /dev/null +++ b/quest-sesame/src/main/resources/example/Books-mappings.ttl @@ -0,0 +1,119 @@ +@prefix rr: . +@prefix xsd: . +@prefix : . +@prefix owl: . +@prefix rdf: . +@prefix xsd: . +@prefix rdfs: . +@prefix quest: . +@prefix owl2xml: . +@base . + + + a rr:TriplesMap; + rr:logicalTable [ rr:sqlQuery """ + select wr_code, wr_name from tb_affiliated_writers + """ ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#author/{\"wr_code\"}/"; + rr:class + ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:column "\"wr_name\"" ] + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:tableName "tb_books" ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#book/{\"bk_code\"}/"; + rr:class + ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:column "\"bk_title\"" ] + ]; + + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ + a rr:RefObjectMap; + rr:parentTriplesMap ; + rr:joinCondition [ + rr:child "\"bk_code\""; + rr:parent "\"bk_id\""; + ]; + ]; + ]. + + + + a rr:TriplesMap; + rr:logicalTable [ rr:sqlQuery """ + select ed_code, ed_name from tb_editor + """ ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#editor/{\"ed_code\"}/"; + rr:class + ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:column "\"ed_name\"" ] + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:tableName "tb_edition" ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#edition/{\"ed_code\"}/"; + rr:class + ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:column "\"pub_date\"" ] + ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:column "\"n_edt\"" ] + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:sqlQuery """ + select bk_code, bk_title from tb_books where bk_type='A' + """ ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#book/{\"bk_code\"}/"; + rr:class + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:sqlQuery """ + select wr_code,wr_name from tb_on_prob_wr + """ ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#author/{\"wr_code\"}/"; + rr:class + ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:column "\"wr_name\"" ] + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:sqlQuery """ + select ed_code,pub_date,n_edt from tb_edition where ed_type='S' + """ ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#edition/{\"ed_code\"}/"; + rr:class + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:sqlQuery """ + select id_bk,gen_name from tb_bk_gen + """ ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#book/{\"id_bk\"}/" ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:column "\"gen_name\"" ] + ]. + + diff --git a/quest-sesame/src/main/resources/example/exampleBooks.obda b/quest-sesame/src/main/resources/example/exampleBooks.obda index 1155d5164b7..e2b79dfd554 100644 --- a/quest-sesame/src/main/resources/example/exampleBooks.obda +++ b/quest-sesame/src/main/resources/example/exampleBooks.obda @@ -1,5 +1,5 @@ [PrefixDeclaration] -: http://meraka/moss/exampleBooks.owl# +: http://meraka/moss/exampleBooks.owl# owl: http://www.w3.org/2002/07/owl# rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# xsd: http://www.w3.org/2001/XMLSchema# @@ -8,10 +8,10 @@ quest: http://obda.org/quest# [SourceDeclaration] sourceUri Books -connectionUrl jdbc:h2:tcp://localhost/books -username sa -password -driverClass org.h2.Driver +connectionUrl jdbc:postgresql://10.7.20.39/books +username postgres +password postgres +driverClass org.postgresql.Driver [MappingDeclaration] @collection [[ mappingId cl_Authors @@ -31,7 +31,7 @@ target :edition/{ed_code}/ a :Edition ; :dateOfPublication {pub_date} ; :editio source select ed_code, pub_date, n_edt from tb_edition mappingId cl_AudioBook -target :book/{bk_code}/ a :AudioBook . +target :book/{t.bk_code}/ a :AudioBook . source select bk_code, bk_title from tb_books where bk_type='A' mappingId cl_EmergingWriter diff --git a/quest-sesame/src/main/resources/example/exampleBooks.ttl b/quest-sesame/src/main/resources/example/exampleBooks.ttl new file mode 100644 index 00000000000..e3321b82532 --- /dev/null +++ b/quest-sesame/src/main/resources/example/exampleBooks.ttl @@ -0,0 +1,118 @@ +@prefix rr: . +@prefix xsd: . +@prefix : . +@prefix owl: . +@prefix rdf: . +@prefix xsd: . +@prefix rdfs: . +@prefix quest: . +@prefix owl2xml: . +@base . + + + a rr:TriplesMap; + rr:logicalTable [ rr:tableName "tb_affiliated_writers" ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#author/{\"wr_code\"}/"; + rr:class + ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:column "\"wr_name\"" ] + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:tableName "tb_books" ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#book/{\"bk_code\"}/"; + rr:class + ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:column "\"bk_title\"" ] + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:tableName "tb_editor" ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#editor/{\"ed_code\"}/"; + rr:class + ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:column "\"ed_name\"" ] + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:tableName "tb_edition" ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#edition/{\"ed_code\"}/"; + rr:class + ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:column "\"pub_date\"" ] + ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:column "\"n_edt\"" ] + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:sqlQuery """ + select bk_code, bk_title from tb_books where bk_type='A' + """ ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#book/{\"bk_code\"}/"; + rr:class + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:sqlQuery """ + select wr_code,wr_name from tb_on_prob_wr + """ ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#author/{\"wr_code\"}/"; + rr:class + ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:column "\"wr_name\"" ] + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:sqlQuery """ + select ed_code,pub_date,n_edt from tb_edition where ed_type='S' + """ ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#edition/{\"ed_code\"}/"; + rr:class + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:sqlQuery """ + select id_bk,gen_name from tb_bk_gen + """ ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#book/{\"id_bk\"}/" ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:column "\"gen_name\"" ] + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:sqlQuery """select * from (select * from tb_books) as CHILD, (select * from tb_edition) as PARENT WHERE CHILD.bk_code = PARENT.bk_id""" ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#book/{\"CHILD.bk_code\"}/" ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:template "http://meraka/moss/exampleBooks.owl#edition/{\"PARENT.ed_code\"}/" ] + ]. + + + a rr:TriplesMap; + rr:logicalTable [ rr:sqlQuery """select * from (select * from tb_books) as CHILD, (select * from tb_authors) as PARENT WHERE CHILD.bk_code = PARENT.bk_code""" ]; + rr:subjectMap [ rr:template "http://meraka/moss/exampleBooks.owl#book/{\"CHILD.bk_code\"}/" ]; + rr:predicateObjectMap [ + rr:predicate ; + rr:objectMap [ rr:template "http://meraka/moss/exampleBooks.owl#author/{\"PARENT.wr_id\"}/" ] + ]. diff --git a/quest-sesame/src/test/java/inf/unibz/ontop/sesame/tests/general/R2RMLWriterTest.java b/quest-sesame/src/test/java/inf/unibz/ontop/sesame/tests/general/R2RMLWriterTest.java deleted file mode 100644 index 18b7a544d9c..00000000000 --- a/quest-sesame/src/test/java/inf/unibz/ontop/sesame/tests/general/R2RMLWriterTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2009-2013, Free University of Bozen Bolzano - * This source code is available under the terms of the Affero General Public - * License v3. - * - * Please see LICENSE.txt for full license terms, including the availability of - * proprietary exceptions. - */ -package inf.unibz.ontop.sesame.tests.general; - -import it.unibz.krdb.obda.io.R2RMLWriter; -import it.unibz.krdb.obda.model.OBDAModel; - -import java.io.File; -import java.net.URI; - -public class R2RMLWriterTest { - - /** - * @param args - */ - public static void main(String[] args) { - try { - - String owlfile = "C:/Project/Test Cases/Book.owl"; - String obdafile = "C:/Project/Test Cases/Book.obda"; - - URI owlURI = new File(owlfile).toURI(); - URI obdaURI = new File(obdafile).toURI(); - it.unibz.krdb.obda.owlrefplatform.questdb.QuestDBVirtualStore store; - store = new it.unibz.krdb.obda.owlrefplatform.questdb.QuestDBVirtualStore("test", owlURI, obdaURI); - - OBDAModel model = store.getObdaModel(obdaURI); - R2RMLWriter writer = new R2RMLWriter(model, URI.create("simple-h2")); - File out = new File("C:/Project/Test Cases/mapping1.ttl"); - //"C:/Project/Timi/Workspace/obdalib-parent/quest-rdb2rdf-compliance/src/main/resources/D004/WRr2rmlb.ttl"); - writer.write(out); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - -} diff --git a/quest-sesame/src/test/java/inf/unibz/ontop/sesame/tests/general/SesameVirtualTest.java b/quest-sesame/src/test/java/inf/unibz/ontop/sesame/tests/general/SesameVirtualTest.java index 041699f62c5..0bd9855b3c0 100644 --- a/quest-sesame/src/test/java/inf/unibz/ontop/sesame/tests/general/SesameVirtualTest.java +++ b/quest-sesame/src/test/java/inf/unibz/ontop/sesame/tests/general/SesameVirtualTest.java @@ -38,8 +38,8 @@ public void test() throws Exception try { - String owlfile = "C:/Project/Test Cases/Book.owl"; - String obdafile = "C:/Project/Test Cases/Book.obda"; + String owlfile = "/Users/timi/Documents/hdd/Project/Test Cases/Book.owl"; + String obdafile = "/Users/timi/Documents/hdd/Project/Test Cases/Books-mappings.ttl"; //"/home/timi/ontologies/helloworld/helloworld.owl"; repo = new SesameVirtualRepo("my_name", owlfile, obdafile, false, "TreeWitness"); @@ -49,7 +49,7 @@ public void test() throws Exception ///query repo try { - String queryString = "select * where { ?z ?y }"; + String queryString = "select * where {?x ?z ?y }"; //"}"; TupleQuery tupleQuery = con.prepareTupleQuery(QueryLanguage.SPARQL, queryString); TupleQueryResult result = tupleQuery.evaluate(); diff --git a/quest-sesame/src/test/java/inf/unibz/ontp/sesame/repository/test/SesameMaterializerCmdTest.java b/quest-sesame/src/test/java/inf/unibz/ontp/sesame/repository/test/SesameMaterializerCmdTest.java index a8cd7acf832..ab66b790218 100644 --- a/quest-sesame/src/test/java/inf/unibz/ontp/sesame/repository/test/SesameMaterializerCmdTest.java +++ b/quest-sesame/src/test/java/inf/unibz/ontp/sesame/repository/test/SesameMaterializerCmdTest.java @@ -17,6 +17,7 @@ import it.unibz.krdb.obda.owlapi3.OWLAPI3Translator; import it.unibz.krdb.obda.owlapi3.QuestOWLIndividualIterator; import it.unibz.krdb.obda.owlrefplatform.owlapi3.OWLAPI3Materializer; +import it.unibz.krdb.obda.sesame.SesameStatementIterator; import java.io.BufferedOutputStream; import java.io.BufferedWriter; @@ -41,7 +42,6 @@ import org.semanticweb.owlapi.model.OWLOntologyManager; import sesameWrapper.SesameMaterializer; -import sesameWrapper.SesameStatementIterator; public class SesameMaterializerCmdTest extends TestCase { diff --git a/reformulation-core/pom.xml b/reformulation-core/pom.xml index 6ad2eef7cbc..3d14c53743a 100644 --- a/reformulation-core/pom.xml +++ b/reformulation-core/pom.xml @@ -35,6 +35,10 @@ slf4j-api jar + + org.openrdf.sesame + sesame-model + postgresql postgresql diff --git a/reformulation-core/src/main/java/it/unibz/krdb/obda/owlrefplatform/core/Quest.java b/reformulation-core/src/main/java/it/unibz/krdb/obda/owlrefplatform/core/Quest.java index 1c8358a7578..b9e38cfc5bb 100644 --- a/reformulation-core/src/main/java/it/unibz/krdb/obda/owlrefplatform/core/Quest.java +++ b/reformulation-core/src/main/java/it/unibz/krdb/obda/owlrefplatform/core/Quest.java @@ -285,6 +285,11 @@ public Quest(Ontology tbox, OBDAModel mappings, Properties config) { loadOBDAModel(mappings); } + + public Quest(Ontology tbox, OBDAModel mappings, DBMetadata metadata, Properties config) { + this(tbox, mappings, config); + this.metadata = metadata; + } protected Map getSQLCache() { return querycache; @@ -652,13 +657,21 @@ public void setupRepository() throws Exception { OBDADataSource datasource = unfoldingOBDAModel.getSources().get(0); URI sourceId = datasource.getSourceID(); - metadata = JDBCConnectionManager.getMetaData(localConnection); - - SQLDialectAdapter sqladapter = SQLAdapterFactory.getSQLDialectAdapter(datasource - .getParameter(RDBMSourceParameterConstants.DATABASE_DRIVER)); + //if the metadata was not already set + if (metadata == null) { - JDBCUtility jdbcutil = new JDBCUtility(datasource.getParameter(RDBMSourceParameterConstants.DATABASE_DRIVER)); - datasourceQueryGenerator = new SQLGenerator(metadata, jdbcutil, sqladapter); + metadata = JDBCConnectionManager.getMetaData(localConnection); + } + + SQLDialectAdapter sqladapter = SQLAdapterFactory + .getSQLDialectAdapter(datasource + .getParameter(RDBMSourceParameterConstants.DATABASE_DRIVER)); + + JDBCUtility jdbcutil = new JDBCUtility( + datasource + .getParameter(RDBMSourceParameterConstants.DATABASE_DRIVER)); + datasourceQueryGenerator = new SQLGenerator(metadata, jdbcutil, + sqladapter); if (isSemanticIdx) { datasourceQueryGenerator.setUriIds(uriRefIds); } @@ -1005,9 +1018,7 @@ private void preprocessProjection(Connection localConnection, ArrayList