On 24/10/12 10:21, Bjørnar Tessem wrote:
I want to do a nested query towards dbpedia with a select expression in the 
results part.
This works well when I use the dbpedia online query service, but will not work 
with jena.
But jena's parser called in QueryFactory.create() does not seem to like SELECT 
in the results part.

Indeed - the syntax is illegal for SPARQL. You also have expressions with non-group keys which SPARQL is quite strict about (some SQL databases are, some are not)

SPARQL does not have sub-SELECT in the SELECT clause.


According to what I have read, this should be allowed in SPARQL 1.1  and in 
ARQ, so what is the problem.

Where did you read that?

Doesn't jena support the full language?

Normally, Jena is just one implementation of SPARQL and subject to all the bugs and misunderstandings of the spec that can arise.

But the grammar is different - the JavaCC grammar that makes the Jena parser is also the source of the HTML that goes into the spec.

A simplified version of the query I build and try to send is:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX : <http://dbpedia.org/resource/>
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX dbpediaont: <http://dbpedia.org/ontology/>
SELECT  distinct ?y
         ((SELECT count(*) WHERE {?y ?r1 ?z}) as ?c1)

You will need to add another subselect into the query (which is effectively what your query would do in SQL)

I'm not quite sure what the query is doing but something like:

{ SELECT (count(*) AS ?c1) WHERE {?y ?r1 ?z} GROUP BY ?y }

so would this query be close to what you are looking for:

PREFIX  :     <http://dbpedia.org/resource/>
PREFIX  rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX  geo:  <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX  dbpediaont: <http://dbpedia.org/ontology/>
PREFIX  foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?y ?c3 ?c1 ?slabel
WHERE
  { { SELECT  ?y (count(?r3) AS ?c3) (sample(?label) AS ?slabel)
      WHERE
        { <http://dbpedia.org/resource/Simpson,_Milton_Keynes> ?r3 ?y .
          ?y rdfs:label ?label
          FILTER ( lang(?label) = "en" )
        }
      GROUP BY ?y
    }
    { SELECT ?y ( count(*) AS ?c1) WHERE {?y ?r1 ?z} GROUP BY ?y }
  }


        Andy

         ?c3 ?label WHERE
        {{SELECT ?y
                         (count(?r3) as ?c3)
                         ?label WHERE {
                 <http://dbpedia.org/resource/Simpson,_Milton_Keynes> ?r3 ?y .
                 ?y rdfs:label ?label.
                 FILTER (lang(?label) = "en")}}}

Adds Java code (this has nothing to do with it I believe, as I have tried all 
variants of syntaxes in the parameter list of the QueryFactory.create()):
                 ...
                String dbpediaEndpointUri = "http://dbpedia.org/sparql";;
                // Builds query.
                Query query = 
QueryFactory.create(buildQuery(lt.getSubject()),Syntax.syntaxSPARQL);
                QueryExecution qe = QueryExecutionFactory.sparqlService(
                                dbpediaEndpointUri, query, 
"http://dbpedia.org";);
                ResultSet resSet = qe.execSelect();

According to what I have read, this should be allowed in SPARQL 1.1  and in 
ARQ, so what is the problem.
Doesn't jena support the full language?

The error message I get  is (which is exactly the same as for the larger query 
asking for some more data):

Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Encountered " "select" 
"SELECT "" at line 7, column 11.
Was expecting one of:
     <IRIref> ...
     <PNAME_NS> ...
     <PNAME_LN> ...
     <VAR1> ...
     <VAR2> ...
     "exists" ...
     "not" ...
    etc....

Bjørnar Tessem


Reply via email to