On 19/01/12 08:40, Paolo Castagna wrote:
Andy Seaborne wrote:
My colleague was using arq.query command line, so he was trying to
specify
additional query parameters in his SPARQL queries writing:
SELECT ... WHERE {
SERVICE<...?name1=value1> { ... }
SERVICE<...?name2=value2> { ... }
}
I don't think this is allowed by the SPARQL grammar. Is it?
Have you tried the online query validator?
http://www.sparql.org/query-validator.html
Hi Andy,
at first, I did not try the validator (I should have).
I looked at the SPARQL grammar [1] instead.
In particular, the thing I am still not sure is if<http://.../?name=value>
is ok as IRI_REF [2].
It is. IRI_REF is any RFC 3986/3987 IRI. Well, it's more general than
that - it's any legal chars. The IRI library is used to parse the IRI
for further checking. <?a=b> is a levgal (relative) IRI.
The on-line validator has no problems with SPARQL queries containing:
SERVICE<http://.../?name=value>. Good.
ARQ currently throws an exception if someone attempts to use query
parameters in a SERVICE<IRI>.
You mentioned this before.
We now have a patch [3] which, instead of throwing an exception when '?'
is found in the SERVICE<IRI>, keep the query string parameters and send
them to the remote SPARQL endpoint as is. Here is the relevant bit:
Index: src/main/java/com/hp/hpl/jena/sparql/engine/http/HttpQuery.java
===================================================================
--- src/main/java/com/hp/hpl/jena/sparql/engine/http/HttpQuery.java
(revision
1232106)
+++ src/main/java/com/hp/hpl/jena/sparql/engine/http/HttpQuery.java
(working copy)
@@ -68,6 +68,7 @@
String responseMessage = null ;
boolean forcePOST = false ;
String queryString = null ;
+ boolean serviceParams = false ;
//static final String ENC_UTF8 = "UTF-8" ;
@@ -97,7 +98,7 @@
log.trace("URL: "+serviceURL) ;
if ( serviceURL.indexOf('?')>= 0 )
(old code)
A prize for anyone who a problem with that test ... something quite
obscure ... affects the current code ... :-)
- throw new QueryExceptionHTTP(-1, "URL already has a query string
("+serviceURL+")") ;
+ serviceParams = true ;
this.serviceURL = serviceURL ;
}
@@ -178,7 +179,7 @@
if ( count() == 0 )
target = new URL(serviceURL) ;
else
- target = new URL(serviceURL+"?"+qs) ;
+ target = new URL(serviceURL+(serviceParams ? "&" : "?")+qs) ;
}
catch (MalformedURLException malEx)
{ throw new QueryExceptionHTTP(0, "Malformed URL: "+malEx) ; }
This would solve the problems for people wanting to run SPARQL queries
against SPARQL endpoints which support/require additional query parameters.
The JENA-195 [4] has more details on this and the latest patch attached
has more changes (the change above is just for HttpQuery.java).
Pending some feedback, I'd like to commit that. I think now it is in a
much better shape (but if there are better ways, I am happy to further
improve it).
Discussion on [email protected].
Let me know what you think.
Thanks,
Paolo
[1] http://www.w3.org/TR/sparql11-query/#sparqlGrammar
[2] http://www.w3.org/TR/sparql11-query/#rIRI_REF
[3] https://issues.apache.org/jira/secure/attachment/12510753/JENA-195.patch
[4] https://issues.apache.org/jira/browse/JENA-195
Andy