Hi,
today, I colleague of mine was trying to use SERVICE in a SPARQL query against a
SPARQL endpoint which requires some additional parameters (i.e. for example, an
apikey=... for authentication).

So, he has this in his query:

   SERVICE <http://.../sparql?apikey=...> {
       [...]
   }

This is the exception he gets (for example, running the query via arq.query
command line):

HttpException: -1 URL already has a query string (http://.../sparql?apikey=...)
        at com.hp.hpl.jena.sparql.engine.http.HttpQuery.init(HttpQuery.java:100)
        at 
com.hp.hpl.jena.sparql.engine.http.HttpQuery.<init>(HttpQuery.java:80)
        at com.hp.hpl.jena.sparql.engine.http.Service.exec(Service.java:68)
        at
com.hp.hpl.jena.sparql.engine.main.iterator.QueryIterService.nextStage(QueryIterService.java:53)
        at
com.hp.hpl.jena.sparql.engine.iterator.QueryIterRepeatApply.makeNextStage(QueryIterRepeatApply.java:113)
        at
com.hp.hpl.jena.sparql.engine.iterator.QueryIterRepeatApply.hasNextBinding(QueryIterRepeatApply.java:65)
        at
com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:108)
        at
com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorWrapper.hasNextBinding(QueryIteratorWrapper.java:40)
        at
com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:108)
        at
com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorWrapper.hasNextBinding(QueryIteratorWrapper.java:40)
        at
com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:108)
        at 
com.hp.hpl.jena.sparql.engine.ResultSetStream.hasNext(ResultSetStream.java:72)
        at 
com.hp.hpl.jena.sparql.resultset.ResultSetMem.<init>(ResultSetMem.java:95)
        at 
com.hp.hpl.jena.sparql.resultset.TextOutput.write(TextOutput.java:147)
        at 
com.hp.hpl.jena.sparql.resultset.TextOutput.write(TextOutput.java:130)
        at 
com.hp.hpl.jena.sparql.resultset.TextOutput.write(TextOutput.java:118)
        at 
com.hp.hpl.jena.sparql.resultset.TextOutput.format(TextOutput.java:65)
        at 
com.hp.hpl.jena.query.ResultSetFormatter.out(ResultSetFormatter.java:134)
        at
com.hp.hpl.jena.sparql.util.QueryExecUtils.outputResultSet(QueryExecUtils.java:169)
        at
com.hp.hpl.jena.sparql.util.QueryExecUtils.doSelectQuery(QueryExecUtils.java:211)
        at 
com.hp.hpl.jena.sparql.util.QueryExecUtils.executeQuery(QueryExecUtils.java:75)
        at arq.query.queryExec(query.java:186)
        at arq.query.exec(query.java:145)
        at arq.cmdline.CmdMain.mainMethod(CmdMain.java:97)
        at arq.cmdline.CmdMain.mainRun(CmdMain.java:59)
        at arq.cmdline.CmdMain.mainRun(CmdMain.java:46)
        at arq.query.main(query.java:65)

Would it be possible to relax the check in HttpQuery.java?

        if ( serviceURL.indexOf('?') >= 0 )
            throw new QueryExceptionHTTP(-1, "URL already has a query string
("+serviceURL+")") ;

Or, the SPARQL specs explicitly forbid that... probably here, isn't it?
http://www.w3.org/TR/sparql11-query/#rIRI_REF

Luckily, QueryEngineHTTP has an addParam(...) method. However, I did not find
a way do go around this within a SPARQL query using SERVICE.

Any comment/suggestion?

Thanks in advance,
Paolo

Reply via email to