Discussion:
NullPointerException in TransformFilterEquality optimizer
Jérémy Coulon
2016-06-30 14:09:06 UTC
Permalink
Hi,

I have the following dataset (stored in file trees.nt):
<http://www.example.com/poi#tree1> <
http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <
http://www.example.com/poi#tree> .
<http://www.example.com/poi#tree1> <http://www.example.com/info#height>
"10"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://www.example.com/poi#tree2> <
http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <
http://www.example.com/poi#tree> .
<http://www.example.com/poi#tree2> <http://www.example.com/info#height>
"20"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://www.example.com/poi#tree3> <
http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <
http://www.example.com/poi#tree> .
<http://www.example.com/poi#tree3> <http://www.example.com/info#height>
"30"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://www.example.com/poi#tree4> <
http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <
http://www.example.com/poi#tree> .
<http://www.example.com/poi#tree4> <http://www.example.com/info#height>
"30"^^<http://www.w3.org/2001/XMLSchema#integer> .

and I want to execute the following sparql query (stored in file q1.txt) (I
know the filter is stupid):
SELECT ?x WHERE {
?x <http://www.example.com/info#height> ?z
FILTER(10 * (1 + 2)=?z)
}

when running:
sparql --data=trees.nt --query=q1.txt --optimize=off

I get the correct answer.
However, when running the same query with optimizations turned on:
sparql --data=trees.nt --query=q1.txt --optimize=on

I received the following exception:
Exception
java.lang.NullPointerException
at java.util.Objects.requireNonNull(Objects.java:203)
at org.apache.jena.rdf.model.impl.Util.isSimpleString(Util.java:205)
at
org.apache.jena.sparql.algebra.optimize.TransformFilterEquality.preprocess(TransformFilterEquality.java:219)
at
org.apache.jena.sparql.algebra.optimize.TransformFilterEquality.preprocessFilterEquality(TransformFilterEquality.java:163)
at
org.apache.jena.sparql.algebra.optimize.TransformFilterEquality.apply(TransformFilterEquality.java:96)
at
org.apache.jena.sparql.algebra.optimize.TransformFilterEquality.transform(TransformFilterEquality.java:88)
at
org.apache.jena.sparql.algebra.TransformWrapper.transform(TransformWrapper.java:59)
at org.apache.jena.sparql.algebra.op.OpFilter.apply(OpFilter.java:100)
at
org.apache.jena.sparql.algebra.Transformer$ApplyTransformVisitor.visitFilter(Transformer.java:401)
at
org.apache.jena.sparql.algebra.OpVisitorByType.visit(OpVisitorByType.java:110)
at org.apache.jena.sparql.algebra.op.OpFilter.visit(OpFilter.java:103)
at
org.apache.jena.sparql.algebra.OpWalker$WalkerVisitor.visit1(OpWalker.java:85)
at
org.apache.jena.sparql.algebra.OpWalker$WalkerVisitor.visitFilter(OpWalker.java:91)
at
org.apache.jena.sparql.algebra.OpVisitorByType.visit(OpVisitorByType.java:110)
at org.apache.jena.sparql.algebra.op.OpFilter.visit(OpFilter.java:103)
at
org.apache.jena.sparql.algebra.OpWalker$WalkerVisitor.visit1(OpWalker.java:83)
at
org.apache.jena.sparql.algebra.OpVisitorByType.visitModifer(OpVisitorByType.java:42)
at
org.apache.jena.sparql.algebra.OpVisitorByType.visit(OpVisitorByType.java:158)
at org.apache.jena.sparql.algebra.op.OpProject.visit(OpProject.java:47)
at org.apache.jena.sparql.algebra.OpWalker.walk(OpWalker.java:43)
at org.apache.jena.sparql.algebra.OpWalker.walk(OpWalker.java:38)
at
org.apache.jena.sparql.algebra.Transformer.applyTransformation(Transformer.java:147)
at
org.apache.jena.sparql.algebra.Transformer.transformation(Transformer.java:140)
at
org.apache.jena.sparql.algebra.Transformer.transformation(Transformer.java:129)
at
org.apache.jena.sparql.algebra.Transformer.transformation(Transformer.java:123)
at
org.apache.jena.sparql.algebra.Transformer.transform(Transformer.java:56)
at
org.apache.jena.sparql.algebra.Transformer.transformSkipService(Transformer.java:86)
at
org.apache.jena.sparql.algebra.Transformer.transformSkipService(Transformer.java:68)
at
org.apache.jena.sparql.algebra.optimize.Optimize.apply(Optimize.java:282)
at
org.apache.jena.sparql.algebra.optimize.Optimize.rewrite(Optimize.java:234)
at
org.apache.jena.sparql.algebra.optimize.Optimize.optimize(Optimize.java:78)
at org.apache.jena.sparql.algebra.Algebra.optimize(Algebra.java:65)
at
org.apache.jena.sparql.engine.main.QueryEngineMain.modifyOp(QueryEngineMain.java:67)
at
org.apache.jena.sparql.engine.QueryEngineBase.createPlan(QueryEngineBase.java:101)
at
org.apache.jena.sparql.engine.QueryEngineBase.getPlan(QueryEngineBase.java:87)
at
org.apache.jena.sparql.engine.main.QueryEngineMain$QueryEngineMainFactory.create(QueryEngineMain.java:91)
at
org.apache.jena.sparql.engine.QueryExecutionBase.getPlan(QueryExecutionBase.java:524)
at
org.apache.jena.sparql.engine.QueryExecutionBase.startQueryIterator(QueryExecutionBase.java:472)
at
org.apache.jena.sparql.engine.QueryExecutionBase.execResultSet(QueryExecutionBase.java:511)
at
org.apache.jena.sparql.engine.QueryExecutionBase.execSelect(QueryExecutionBase.java:172)
at
org.apache.jena.sparql.util.QueryExecUtils.doSelectQuery(QueryExecUtils.java:196)
at
org.apache.jena.sparql.util.QueryExecUtils.executeQuery(QueryExecUtils.java:78)
at arq.query.queryExec(query.java:216)
at arq.query.exec(query.java:153)
at jena.cmd.CmdMain.mainMethod(CmdMain.java:93)
at jena.cmd.CmdMain.mainRun(CmdMain.java:58)
at jena.cmd.CmdMain.mainRun(CmdMain.java:45)
at arq.sparql.main(sparql.java:28)

Thank you for your help.
--
Jeremy
Andy Seaborne
2016-06-30 17:18:12 UTC
Permalink
Hi Jérémy,

Thank you for a complete and focused report. A fine example.

It is recorded as:

https://issues.apache.org/jira/browse/JENA-1202

It occurs if one side of the "=" is a constant expression which an
earlier optimizer step has folded to a pre-computed value.

I've pushed a fix which will show up in the next development build.

Andy
Post by Jérémy Coulon
Hi,
<http://www.example.com/poi#tree1> <
http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <
http://www.example.com/poi#tree> .
<http://www.example.com/poi#tree1> <http://www.example.com/info#height>
"10"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://www.example.com/poi#tree2> <
http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <
http://www.example.com/poi#tree> .
<http://www.example.com/poi#tree2> <http://www.example.com/info#height>
"20"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://www.example.com/poi#tree3> <
http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <
http://www.example.com/poi#tree> .
<http://www.example.com/poi#tree3> <http://www.example.com/info#height>
"30"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://www.example.com/poi#tree4> <
http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <
http://www.example.com/poi#tree> .
<http://www.example.com/poi#tree4> <http://www.example.com/info#height>
"30"^^<http://www.w3.org/2001/XMLSchema#integer> .
and I want to execute the following sparql query (stored in file q1.txt) (I
SELECT ?x WHERE {
?x <http://www.example.com/info#height> ?z
FILTER(10 * (1 + 2)=?z)
}
sparql --data=trees.nt --query=q1.txt --optimize=off
I get the correct answer.
sparql --data=trees.nt --query=q1.txt --optimize=on
Exception
java.lang.NullPointerException
at java.util.Objects.requireNonNull(Objects.java:203)
at org.apache.jena.rdf.model.impl.Util.isSimpleString(Util.java:205)
at
org.apache.jena.sparql.algebra.optimize.TransformFilterEquality.preprocess(TransformFilterEquality.java:219)
at
org.apache.jena.sparql.algebra.optimize.TransformFilterEquality.preprocessFilterEquality(TransformFilterEquality.java:163)
at
org.apache.jena.sparql.algebra.optimize.TransformFilterEquality.apply(TransformFilterEquality.java:96)
at
org.apache.jena.sparql.algebra.optimize.TransformFilterEquality.transform(TransformFilterEquality.java:88)
at
org.apache.jena.sparql.algebra.TransformWrapper.transform(TransformWrapper.java:59)
at org.apache.jena.sparql.algebra.op.OpFilter.apply(OpFilter.java:100)
at
org.apache.jena.sparql.algebra.Transformer$ApplyTransformVisitor.visitFilter(Transformer.java:401)
at
org.apache.jena.sparql.algebra.OpVisitorByType.visit(OpVisitorByType.java:110)
at org.apache.jena.sparql.algebra.op.OpFilter.visit(OpFilter.java:103)
at
org.apache.jena.sparql.algebra.OpWalker$WalkerVisitor.visit1(OpWalker.java:85)
at
org.apache.jena.sparql.algebra.OpWalker$WalkerVisitor.visitFilter(OpWalker.java:91)
at
org.apache.jena.sparql.algebra.OpVisitorByType.visit(OpVisitorByType.java:110)
at org.apache.jena.sparql.algebra.op.OpFilter.visit(OpFilter.java:103)
at
org.apache.jena.sparql.algebra.OpWalker$WalkerVisitor.visit1(OpWalker.java:83)
at
org.apache.jena.sparql.algebra.OpVisitorByType.visitModifer(OpVisitorByType.java:42)
at
org.apache.jena.sparql.algebra.OpVisitorByType.visit(OpVisitorByType.java:158)
at org.apache.jena.sparql.algebra.op.OpProject.visit(OpProject.java:47)
at org.apache.jena.sparql.algebra.OpWalker.walk(OpWalker.java:43)
at org.apache.jena.sparql.algebra.OpWalker.walk(OpWalker.java:38)
at
org.apache.jena.sparql.algebra.Transformer.applyTransformation(Transformer.java:147)
at
org.apache.jena.sparql.algebra.Transformer.transformation(Transformer.java:140)
at
org.apache.jena.sparql.algebra.Transformer.transformation(Transformer.java:129)
at
org.apache.jena.sparql.algebra.Transformer.transformation(Transformer.java:123)
at
org.apache.jena.sparql.algebra.Transformer.transform(Transformer.java:56)
at
org.apache.jena.sparql.algebra.Transformer.transformSkipService(Transformer.java:86)
at
org.apache.jena.sparql.algebra.Transformer.transformSkipService(Transformer.java:68)
at
org.apache.jena.sparql.algebra.optimize.Optimize.apply(Optimize.java:282)
at
org.apache.jena.sparql.algebra.optimize.Optimize.rewrite(Optimize.java:234)
at
org.apache.jena.sparql.algebra.optimize.Optimize.optimize(Optimize.java:78)
at org.apache.jena.sparql.algebra.Algebra.optimize(Algebra.java:65)
at
org.apache.jena.sparql.engine.main.QueryEngineMain.modifyOp(QueryEngineMain.java:67)
at
org.apache.jena.sparql.engine.QueryEngineBase.createPlan(QueryEngineBase.java:101)
at
org.apache.jena.sparql.engine.QueryEngineBase.getPlan(QueryEngineBase.java:87)
at
org.apache.jena.sparql.engine.main.QueryEngineMain$QueryEngineMainFactory.create(QueryEngineMain.java:91)
at
org.apache.jena.sparql.engine.QueryExecutionBase.getPlan(QueryExecutionBase.java:524)
at
org.apache.jena.sparql.engine.QueryExecutionBase.startQueryIterator(QueryExecutionBase.java:472)
at
org.apache.jena.sparql.engine.QueryExecutionBase.execResultSet(QueryExecutionBase.java:511)
at
org.apache.jena.sparql.engine.QueryExecutionBase.execSelect(QueryExecutionBase.java:172)
at
org.apache.jena.sparql.util.QueryExecUtils.doSelectQuery(QueryExecUtils.java:196)
at
org.apache.jena.sparql.util.QueryExecUtils.executeQuery(QueryExecUtils.java:78)
at arq.query.queryExec(query.java:216)
at arq.query.exec(query.java:153)
at jena.cmd.CmdMain.mainMethod(CmdMain.java:93)
at jena.cmd.CmdMain.mainRun(CmdMain.java:58)
at jena.cmd.CmdMain.mainRun(CmdMain.java:45)
at arq.sparql.main(sparql.java:28)
Thank you for your help.
--
Jeremy
Loading...