[
https://issues.apache.org/jira/browse/JENA-445?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Rob Vesse resolved JENA-445.
----------------------------
Resolution: Fixed
I am marking this as resolved, note however that there are still some provisos
here. It is perfectly possible to write a query containing sub-queries that
cannot round trip from algebra back into a query because there are some ways in
which the algebra can be lossy e.g
SELECT * WHERE { { subquery } { subquery } }
Won't round trip because the resulting algebra has insufficient algebra for the
code to realize that there are two sub-queries
Equally some algebras with sub-queries can round trip as semantically
equivalent but visually different queries e.g.
SELECT * WHERE { { subquery } } -> subquery
In general don't use an outer SELECT * if you have sub-queries or you can run
afoul of this.
> a problem in rewriting nested query by AlgebraGenerator
> -------------------------------------------------------
>
> Key: JENA-445
> URL: https://issues.apache.org/jira/browse/JENA-445
> Project: Apache Jena
> Issue Type: Bug
> Affects Versions: Jena 2.10.0
> Environment: Windows
> Reporter: John Liu
> Assignee: Rob Vesse
>
> I found a problem when rewriting a nested query by AlgebraGenerator, the
> generated query becomes syntax incorrect query. The version of JENA I tested
> is 2.7.1 and 2.10.1
>
> The code I rewrite the query is:
> Query query = QueryFactory.create(queryString);
> AlgebraGenerator ag =
> new AlgebraGenerator();
> Op op = ag.compile(query);
> Query query2 = OpAsQuery.asQuery(op);
> The original query is:
> PREFIX dcterms: <http://purl.org/dc/terms/>
> PREFIX dbpedia: <http://dbpedia.org/resource/>
> SELECT ?num_of_holidays ?celebrate_Chinese_New_Year WHERE {
> {SELECT ?country_cat (COUNT(?holiday) as ?num_of_holidays)
> WHERE {?country_cat <http://www.w3.org/2004/02/skos/core#broader>
> <http://dbpedia.org/resource/Category:Public_holidays_by_country>.
> ?holiday dcterms:subject ?country_cat
> }GROUP by ?country_cat
> }
> {
> SELECT ?country_cat (COUNT(?holiday) as ?celebrate_Chinese_New_Year)
> WHERE {
> ?country_cat <http://www.w3.org/2004/02/skos/core#broader>
> <http://dbpedia.org/resource/Category:Public_holidays_by_country>.
> ?holiday dcterms:subject ?country_cat
> FILTER(?holiday="http://dbpedia.org/resource/Lunar_New_Year's_Day")
> }GROUP by ?country_cat
> }
> }
> The generated query is:
> SELECT ?country_cat ?celebrate_Chinese_New_Year
> WHERE
> { { ?country_cat <http://www.w3.org/2004/02/skos/core#broader>
> <http://dbpedia.org/resource/Category:Public_holidays_by_country> .
> ?holiday <http://purl.org/dc/terms/subject> ?country_cat
> BIND(count(?holiday) AS ?num_of_holidays)
> }
> { ?country_cat <http://www.w3.org/2004/02/skos/core#broader>
> <http://dbpedia.org/resource/Category:Public_holidays_by_country> .
> ?holiday <http://purl.org/dc/terms/subject> ?country_cat
> FILTER ( ?holiday = "http://dbpedia.org/resource/Lunar_New_Year's_Day" )
> BIND(count(?holiday) AS ?celebrate_Chinese_New_Year)
> }
> }
> GROUP BY ?country_cat
> The generated query has a syntax error: "Line 5, column 12: Aggregate
> expression not legal at this point".
> The following is a java class to demonstrate the problem:
> import com.hp.hpl.jena.query.Query;
> import com.hp.hpl.jena.query.QueryFactory;
> import com.hp.hpl.jena.sparql.algebra.AlgebraGenerator;
> import com.hp.hpl.jena.sparql.algebra.Op;
> import com.hp.hpl.jena.sparql.algebra.OpAsQuery;
> public class TestJena {
> /**
> * @param args
> */
> public static void main(String[] args) {
>
> String queryString =
> "PREFIX dcterms: <http://purl.org/dc/terms/> \n" +
> "PREFIX dbpedia: <http://dbpedia.org/resource/> \n" +
>
> "SELECT ?num_of_holidays
> ?celebrate_Chinese_New_Year WHERE { \n" +
> "{" +
> "SELECT ?country_cat
> (COUNT(?holiday) as ?num_of_holidays) \n" +
> "WHERE {" +
> "?country_cat
> <http://www.w3.org/2004/02/skos/core#broader>
> <http://dbpedia.org/resource/Category:Public_holidays_by_country>. \n" +
> "?holiday
> dcterms:subject ?country_cat \n" +
> "}GROUP by ?country_cat
> \n" +
> "} \n" +
> "{ \n" +
> "SELECT ?country_cat (COUNT(?holiday)
> as ?celebrate_Chinese_New_Year) \n" +
> "WHERE { \n" +
> "?country_cat
> <http://www.w3.org/2004/02/skos/core#broader>
> <http://dbpedia.org/resource/Category:Public_holidays_by_country>. \n" +
> "?holiday
> dcterms:subject ?country_cat \n" +
>
> "FILTER(?holiday=\"http://dbpedia.org/resource/Lunar_New_Year\'s_Day\") \n" +
> "}GROUP by ?country_cat \n" +
> "} \n" +
> "}\n";
>
> System.out.println("Original query: \n" + queryString);
>
> Query query = QueryFactory.create(queryString);
>
> AlgebraGenerator ag = new AlgebraGenerator();
> Op op = ag.compile(query);
>
> Query query2 = OpAsQuery.asQuery(op);
>
> String queryString2 = query2.toString();
>
> System.out.println("Update query: \n" + queryString2);
>
> Query newQuery2 = QueryFactory.create(queryString2);
>
>
>
> }
> }
>
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira