I've written an example and attached it to JENA-954

Rick: could you check we are agreed here please?

        Andy

On 04/06/15 12:56, Andy Seaborne wrote:
On 04/06/15 12:28, Rob Vesse wrote:
Rick

Yes this does look like a bug

Agreed.  If the DISTINCT is being pulled up, it's wrong.
LIMIT is missing as well.

A slight but though ...

Where does "?tripod_count_var" come from?

The algebra shown names a variable not in the query.

The input query has algebra:

(project (?count)
   (extend ((?count ?.0))
     (group () ((?.0 (count)))
       (slice _ 1
         (distinct
           (project (?uri ?graph)
             (graph ?graph
               (bgp (triple ?uri ?p ?o)))))))))

     Andy


Please bear in mind however that conversion to algebra does NOT guarantee
to round trip because some parts of a query do not end up in the algebra
and so OpAsQuery has simply no way to reconstruct the exact original
query

For example:

SELECT * {
   SELECT ?x { ?x a ?type }
}

Would round trip back to just:

SELECT ?x { ?x a ?type }


There are also other cases where things could move around slightly, for
example a BIND is potentially indistinguishable from a SELECT expression
depending on the structure of the query.

I have filed this as JENA-954 -
https://issues.apache.org/jira/browse/JENA-954

Thanks for reporting this,

Rob

On 04/06/2015 11:45, "Rick Moynihan" <[email protected]> wrote:

Hi all,

I have been playing around using ARQ to rewrite queries with Jena 2.13.0
and have encountered what appears to be a bug when roundtripping a valid
SPARQL query through to an SSE and back out as SPARQL.

The original SPARQL query is this:

SELECT (COUNT(*) as ?count) {
  SELECT DISTINCT ?uri ?graph WHERE {
    GRAPH ?graph {
      ?uri ?p ?o .
      }
    } LIMIT 1
}

This parses into the following SSE by going through
QueryFactory.create ->
Algebra.compile :

#<OpProject (project (?tripod_count_var)
  (extend ((?tripod_count_var ?.0))
    (group () ((?.0 (count)))
      (distinct
        (project (?uri ?graph)
          (graph ?graph
            (bgp (triple ?uri ?p ?o))))))))

To my eye this looks correct so far... next we round trip it back into a
SPARQL query by using OpAsQuery.asQuery that results in:

#<Query SELECT DISTINCT  (count(*) AS ?tripod_count_var)
WHERE
  { { SELECT  ?uri ?graph
      WHERE
        { GRAPH ?graph
            { ?uri ?p ?o}
        }
    }
  }


This now seems broken...  asQuery has mixed the inner select distinct
onto
the outer one.  This appears to happen with all sub selects.  I
suspect it
might be due to OpAsQuery.asQuery building only Query object which is
somehow being reused for all sub queries.

I took a look in the unit tests and found that some of the test
queries in
TestOpAsQuery are also subject to this bug e.g. the query on line 223:

SELECT ?key ?agg WHERE { { SELECT ?key (COUNT(*) AS ?agg) { ?key ?p ?o }
GROUP BY ?key } }

Though the tests don't seem to currently test for this kind of thing.

Can anyone confirm that this is a bug?

Kind regards,

R.






Reply via email to