You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jena.apache.org by "Rick (JIRA)" <ji...@apache.org> on 2018/01/19 13:17:00 UTC

[jira] [Updated] (JENA-1468) Empty VALUES clauses lose variable bindings when compiled to a SSE

     [ https://issues.apache.org/jira/browse/JENA-1468?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Rick updated JENA-1468:
-----------------------
    Description: 
Given a SPARQL query like this:

SELECT ?foo WHERE {

   ?foo ?bar ?baz . # Not essential for problem just to show we can't optimise it away. 

   VALUES ?foo \{ }

}

If you compile it into an SSE with something like this:

{{Algebra.compile(QueryFactory.create("SELECT ?foo WHERE \{ ?foo ?bar ?baz . VALUES ?foo { }}"));}}

You end up with a semantically different SSE:

{{(project (?foo)}}
 {{  (join}}
 {{    (bgp (triple ?foo ?bar ?baz))}}
 {{    (table empty)))}} 

Note how "(table empty)" has lost the ?foo binding, which means that this query returns all results for ?foo, where it should return no results.

I'm not sure how this query should be expressed in SSE form I'd suggest:

{{(table (vars ?foo) empty)}}

Though currently this will get simplified in [code like this|https://github.com/apache/jena/blob/94eb3fc99ba1ff3991a629fffa6e6cf8b52d6c53/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderTable.java#L55-L64] into an EmptyTable if you do something like:

{{BuilderTable.build(Item.createList((SSE.parse("(table (vars ?foo) empty)")));}}

Additionally it appears quite a bit of code carries through this assumption that an [empty table will never have a binding|https://github.com/apache/jena/blob/94eb3fc99ba1ff3991a629fffa6e6cf8b52d6c53/jena-arq/src/main/java/org/apache/jena/sparql/algebra/table/TableEmpty.java#L57].

As far as I can tell this issue effects many prior versions of JENA including 3.6.0.

  was:
Given a SPARQL query like this:

{{SELECT ?foo WHERE }}{{{}}

{{   ?foo ?bar ?baz . # Not essential for problem just to show we can't optimise it away. }}

{{   VALUES ?foo \{ }}}

{{}}}

If you compile it into an SSE with something like this: 

{{Algebra.compile(QueryFactory.create("SELECT ?foo WHERE \{ ?foo ?bar ?baz . VALUES ?foo { }}"));}}

You end up with a semantically different SSE:

{{(project (?foo)}}
 {{  (join}}
 {{    (bgp (triple ?foo ?bar ?baz))}}
 {{    (table empty)))}} 

Note how "(table empty)" has lost the ?foo binding, which means that this query returns all results for ?foo, where it should return no results.

I'm not sure how this query should be expressed in SSE form I'd suggest:

{{(table (vars ?foo) empty)}}

Though currently this will get simplified in [code like this|https://github.com/apache/jena/blob/94eb3fc99ba1ff3991a629fffa6e6cf8b52d6c53/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderTable.java#L55-L64] into an EmptyTable if you do something like:

{{BuilderTable.build(Item.createList((SSE.parse("(table (vars ?foo) empty)")));}}

Additionally it appears quite a bit of code carries through this assumption that an [empty table will never have a binding|https://github.com/apache/jena/blob/94eb3fc99ba1ff3991a629fffa6e6cf8b52d6c53/jena-arq/src/main/java/org/apache/jena/sparql/algebra/table/TableEmpty.java#L57].

As far as I can tell this issue effects many prior versions of JENA including 3.6.0.


> Empty VALUES clauses lose variable bindings when compiled to a SSE
> ------------------------------------------------------------------
>
>                 Key: JENA-1468
>                 URL: https://issues.apache.org/jira/browse/JENA-1468
>             Project: Apache Jena
>          Issue Type: Bug
>          Components: ARQ
>    Affects Versions: Jena 3.1.1, Jena 3.2.0, Jena 3.3.0, Jena 3.4.0, Jena 3.5.0, Jena 3.6.0
>            Reporter: Rick
>            Priority: Major
>              Labels: SPARQL, sse
>
> Given a SPARQL query like this:
> SELECT ?foo WHERE {
>    ?foo ?bar ?baz . # Not essential for problem just to show we can't optimise it away. 
>    VALUES ?foo \{ }
> }
> If you compile it into an SSE with something like this:
> {{Algebra.compile(QueryFactory.create("SELECT ?foo WHERE \{ ?foo ?bar ?baz . VALUES ?foo { }}"));}}
> You end up with a semantically different SSE:
> {{(project (?foo)}}
>  {{  (join}}
>  {{    (bgp (triple ?foo ?bar ?baz))}}
>  {{    (table empty)))}} 
> Note how "(table empty)" has lost the ?foo binding, which means that this query returns all results for ?foo, where it should return no results.
> I'm not sure how this query should be expressed in SSE form I'd suggest:
> {{(table (vars ?foo) empty)}}
> Though currently this will get simplified in [code like this|https://github.com/apache/jena/blob/94eb3fc99ba1ff3991a629fffa6e6cf8b52d6c53/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderTable.java#L55-L64] into an EmptyTable if you do something like:
> {{BuilderTable.build(Item.createList((SSE.parse("(table (vars ?foo) empty)")));}}
> Additionally it appears quite a bit of code carries through this assumption that an [empty table will never have a binding|https://github.com/apache/jena/blob/94eb3fc99ba1ff3991a629fffa6e6cf8b52d6c53/jena-arq/src/main/java/org/apache/jena/sparql/algebra/table/TableEmpty.java#L57].
> As far as I can tell this issue effects many prior versions of JENA including 3.6.0.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)