Updated Branches: refs/heads/develop 8f79ef1a8 -> 430b45a16
more SPARQL improvements (implemented additional value expressions and tests) Project: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/commit/430b45a1 Tree: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/tree/430b45a1 Diff: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/diff/430b45a1 Branch: refs/heads/develop Commit: 430b45a1664e837a3071a77539f238794666950c Parents: 8f79ef1 Author: Sebastian Schaffert <[email protected]> Authored: Mon Apr 29 17:12:50 2013 +0200 Committer: Sebastian Schaffert <[email protected]> Committed: Mon Apr 29 17:12:50 2013 +0200 ---------------------------------------------------------------------- .../evaluation/KiWiEvaluationStrategyImpl.java | 12 +++- .../sparql/persistence/KiWiSparqlConnection.java | 62 ++++++++++++++- .../kiwi/sparql/test/KiWiSparqlJoinTest.java | 26 ++++++- .../marmotta/kiwi/sparql/test/demo-data.foaf | 1 + .../marmotta/kiwi/sparql/test/query10.sparql | 10 +++ .../apache/marmotta/kiwi/sparql/test/query5.sparql | 2 +- .../apache/marmotta/kiwi/sparql/test/query6.sparql | 2 +- .../apache/marmotta/kiwi/sparql/test/query7.sparql | 8 ++ .../apache/marmotta/kiwi/sparql/test/query8.sparql | 8 ++ .../apache/marmotta/kiwi/sparql/test/query9.sparql | 8 ++ 10 files changed, 134 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java index 5e2fda0..9fab185 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java @@ -122,7 +122,7 @@ public class KiWiEvaluationStrategyImpl extends EvaluationStrategyImpl{ if(expr instanceof Compare) { return isSupported(((Compare) expr).getLeftArg()) && isSupported(((Compare) expr).getRightArg()); } else if(expr instanceof MathExpr) { - return isSupported(((MathExpr) expr).getLeftArg()) && isSupported(((MathExpr) expr).getRightArg()); + return isSupported(((MathExpr) expr).getLeftArg()) && isSupported(((MathExpr) expr).getRightArg()); } else if(expr instanceof And) { return isSupported(((And) expr).getLeftArg()) && isSupported(((And) expr).getRightArg()); } else if(expr instanceof Or) { @@ -133,6 +133,16 @@ public class KiWiEvaluationStrategyImpl extends EvaluationStrategyImpl{ return true; } else if(expr instanceof Str) { return isAtomic(((Str) expr).getArg()); + } else if(expr instanceof Label) { + return isAtomic(((UnaryValueOperator) expr).getArg()); + } else if(expr instanceof IsResource) { + return isAtomic(((UnaryValueOperator) expr).getArg()); + } else if(expr instanceof IsURI) { + return isAtomic(((UnaryValueOperator) expr).getArg()); + } else if(expr instanceof IsBNode) { + return isAtomic(((UnaryValueOperator) expr).getArg()); + } else if(expr instanceof IsLiteral) { + return isAtomic(((UnaryValueOperator) expr).getArg()); } else if(expr instanceof Lang) { return isAtomic(((Lang) expr).getArg()); } else if(expr instanceof LangMatches) { http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java index 6a8566c..1bd1227 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java @@ -27,7 +27,9 @@ import org.apache.marmotta.kiwi.persistence.KiWiConnection; import org.apache.marmotta.kiwi.persistence.util.ResultSetIteration; import org.apache.marmotta.kiwi.persistence.util.ResultTransformerFunction; import org.apache.marmotta.kiwi.sail.KiWiValueFactory; +import org.openrdf.model.BNode; import org.openrdf.model.Literal; +import org.openrdf.model.URI; import org.openrdf.model.Value; import org.openrdf.query.Binding; import org.openrdf.query.BindingSet; @@ -321,6 +323,14 @@ public class KiWiSparqlConnection { } else if(str.getArg() instanceof ValueConstant) { return "'" + ((ValueConstant) str.getArg()).getValue().stringValue() + "'"; } + } else if(expr instanceof Label) { + Label str = (Label)expr; + // get value of argument and express it as string + if(str.getArg() instanceof Var) { + return queryVariables.get(str.getArg()).get(0) + ".svalue"; + } else if(str.getArg() instanceof ValueConstant) { + return "'" + ((ValueConstant) str.getArg()).getValue().stringValue() + "'"; + } } else if(expr instanceof Lang) { Lang lang = (Lang)expr; @@ -333,6 +343,12 @@ public class KiWiSparqlConnection { OPTypes ot = determineOpType(cmp.getLeftArg(), cmp.getRightArg()); return evaluateExpression(cmp.getLeftArg(),queryVariables, ot) + getSQLOperator(cmp.getOperator()) + evaluateExpression(cmp.getRightArg(),queryVariables, ot); + } else if(expr instanceof MathExpr) { + MathExpr cmp = (MathExpr)expr; + + OPTypes ot = determineOpType(cmp.getLeftArg(), cmp.getRightArg()); + + return evaluateExpression(cmp.getLeftArg(),queryVariables, ot) + getSQLOperator(cmp.getOperator()) + evaluateExpression(cmp.getRightArg(),queryVariables, ot); } else if(expr instanceof Regex) { Regex re = (Regex)expr; @@ -351,6 +367,50 @@ public class KiWiSparqlConnection { } else { return "(" + value + " = '"+pattern.getValue().stringValue()+"' OR " + parent.getDialect().getILike(value, "'" + pattern.getValue().stringValue() + "-%' )"); } + } else if(expr instanceof IsResource) { + ValueExpr arg = ((UnaryValueOperator)expr).getArg(); + + // operator must be a variable or a constant + if(arg instanceof ValueConstant) { + return Boolean.toString(((ValueConstant) arg).getValue() instanceof URI || ((ValueConstant) arg).getValue() instanceof BNode); + } else if(arg instanceof Var) { + String var = queryVariables.get(arg).get(0); + + return "(" + var + ".ntype = 'uri' OR " + var + ".ntype = 'bnode')"; + } + } else if(expr instanceof IsURI) { + ValueExpr arg = ((UnaryValueOperator)expr).getArg(); + + // operator must be a variable or a constant + if(arg instanceof ValueConstant) { + return Boolean.toString(((ValueConstant) arg).getValue() instanceof URI); + } else if(arg instanceof Var) { + String var = queryVariables.get(arg).get(0); + + return var + ".ntype = 'uri'"; + } + } else if(expr instanceof IsBNode) { + ValueExpr arg = ((UnaryValueOperator)expr).getArg(); + + // operator must be a variable or a constant + if(arg instanceof ValueConstant) { + return Boolean.toString(((ValueConstant) arg).getValue() instanceof BNode); + } else if(arg instanceof Var) { + String var = queryVariables.get(arg).get(0); + + return var + ".ntype = 'bnode'"; + } + } else if(expr instanceof IsLiteral) { + ValueExpr arg = ((UnaryValueOperator)expr).getArg(); + + // operator must be a variable or a constant + if(arg instanceof ValueConstant) { + return Boolean.toString(((ValueConstant) arg).getValue() instanceof Literal); + } else if(arg instanceof Var) { + String var = queryVariables.get(arg).get(0); + + return "(" + var + ".ntype = 'string' OR " + var + ".ntype = 'int' OR " + var + ".ntype = 'double' OR " + var + ".ntype = 'date' OR " + var + ".ntype = 'boolean')"; + } } else if(expr instanceof Var) { String var = queryVariables.get(expr).get(0); @@ -362,7 +422,7 @@ public class KiWiSparqlConnection { case INT: return var + ".ivalue"; case DOUBLE: return var + ".dvalue"; case DATE: return var + ".tvalue"; - default: throw new IllegalArgumentException("unsupported value type: " + optype); + case ANY: return var + ".id"; } } } else if(expr instanceof ValueConstant) { http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java b/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java index 59455b8..861c564 100644 --- a/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java +++ b/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java @@ -221,7 +221,7 @@ public class KiWiSparqlJoinTest { testQuery("query4.sparql"); } - // numeric operator + // numeric comparison @Test public void testQuery5() throws Exception { testQuery("query5.sparql"); @@ -233,6 +233,30 @@ public class KiWiSparqlJoinTest { testQuery("query6.sparql"); } + // math expression + @Test + public void testQuery7() throws Exception { + testQuery("query7.sparql"); + } + + // isLiteral + @Test + public void testQuery8() throws Exception { + testQuery("query8.sparql"); + } + + // isURI + @Test + public void testQuery9() throws Exception { + testQuery("query9.sparql"); + } + + // term comparison + @Test + public void testQuery10() throws Exception { + testQuery("query10.sparql"); + } + private void testQuery(String filename) throws Exception { String queryString = IOUtils.toString(this.getClass().getResourceAsStream(filename), "UTF-8"); http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/demo-data.foaf ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/demo-data.foaf b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/demo-data.foaf index bde1322..219c341 100644 --- a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/demo-data.foaf +++ b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/demo-data.foaf @@ -63,6 +63,7 @@ <foaf:Person rdf:about="http://localhost:8080/LMF/resource/anna_schmidt" xmlns:foaf="http://xmlns.com/foaf/0.1/"> <foaf:name>Anna Schmidt</foaf:name> <dc:description xml:lang="en">Anna Schmidt is working as PR manager for mountaineers coming from Garmisch-Partenkirchen. She likes mountaineering and is also a Linux enthusiast.</dc:description> + <foaf:interest>Literal Interest</foaf:interest> <foaf:interest rdf:resource="http://dbpedia.org/resource/Mountaineering"/> <foaf:interest rdf:resource="http://dbpedia.org/resource/Linux"/> <foaf:interest rdf:resource="http://localhost:8080/LMF/resource/Chess" /> http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query10.sparql ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query10.sparql b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query10.sparql new file mode 100644 index 0000000..ef5158c --- /dev/null +++ b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query10.sparql @@ -0,0 +1,10 @@ +PREFIX foaf: <http://xmlns.com/foaf/0.1/> +PREFIX dc: <http://purl.org/dc/elements/1.1/> + +SELECT ?fn1 ?fn2 WHERE { + ?p1 foaf:name ?fn1 . + ?p1 foaf:interest ?interest1 . + ?p2 foaf:name ?fn2 . + ?p2 foaf:interest ?interest2 . + FILTER( ?interest1 = ?interest2 ) +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query5.sparql ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query5.sparql b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query5.sparql index 325bb6b..791b163 100644 --- a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query5.sparql +++ b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query5.sparql @@ -1,7 +1,7 @@ PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX dc: <http://purl.org/dc/elements/1.1/> -SELECT ?p1 ?fn ?desc ?friend WHERE { +SELECT ?p1 ?fn ?age WHERE { ?p1 foaf:name ?fn . ?p1 foaf:age ?age . FILTER( ?age > 30 ) http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query6.sparql ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query6.sparql b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query6.sparql index 1a953df..5f82b49 100644 --- a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query6.sparql +++ b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query6.sparql @@ -1,7 +1,7 @@ PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX dc: <http://purl.org/dc/elements/1.1/> -SELECT ?p1 ?fn ?desc ?friend WHERE { +SELECT ?p1 ?fn ?d WHERE { ?p1 foaf:name ?fn . ?p1 dc:description ?d . FILTER( langMatches(lang(?d), "de") ) http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query7.sparql ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query7.sparql b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query7.sparql new file mode 100644 index 0000000..2fbf3bc --- /dev/null +++ b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query7.sparql @@ -0,0 +1,8 @@ +PREFIX foaf: <http://xmlns.com/foaf/0.1/> +PREFIX dc: <http://purl.org/dc/elements/1.1/> + +SELECT ?p1 ?fn ?age WHERE { + ?p1 foaf:name ?fn . + ?p1 foaf:age ?age . + FILTER( 2013 - ?age > 1983 ) +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query8.sparql ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query8.sparql b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query8.sparql new file mode 100644 index 0000000..1c94f8f --- /dev/null +++ b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query8.sparql @@ -0,0 +1,8 @@ +PREFIX foaf: <http://xmlns.com/foaf/0.1/> +PREFIX dc: <http://purl.org/dc/elements/1.1/> + +SELECT ?p1 ?fn ?interest WHERE { + ?p1 foaf:name ?fn . + ?p1 foaf:interest ?interest . + FILTER( isLiteral(?interest) ) +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query9.sparql ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query9.sparql b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query9.sparql new file mode 100644 index 0000000..a14fded --- /dev/null +++ b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query9.sparql @@ -0,0 +1,8 @@ +PREFIX foaf: <http://xmlns.com/foaf/0.1/> +PREFIX dc: <http://purl.org/dc/elements/1.1/> + +SELECT ?p1 ?fn ?interest WHERE { + ?p1 foaf:name ?fn . + ?p1 foaf:interest ?interest . + FILTER( isURI(?interest) ) +} \ No newline at end of file
