On 18/01/12 19:09, Stephan Zednik wrote:

On Jan 18, 2012, at 6:08 AM, Andy Seaborne wrote:

On 18/01/12 08:22, Stephan Zednik wrote:
Hi,

I would like to execute a describe query on a variable that is determined by 
its id, which I would like to pass to the query programmatically using ARQ.

Lets say the query would look something like this:

PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
PREFIX dc:<http://purl.org/dc/elements/1.1/>
PREFIX dcterms:<http://purl.org/dc/terms/>
PREFIX ex:<http://example.com/example>

DESCRIBE ?foo
WHERE { ?foo a ex:Foo .
        ?foo dcterms:identifier ?id .
}

and I would like to load the query from a file and pass a value in for ?id.

What is the best way to do this?

I looked at setInitialBinding( ...) on the QueryExecution but I am not sure it 
will do what I want.
from the javadoc:
void setInitialBinding(QuerySolution binding)
Set the initial association of variables and values. May not be supported by 
all QueryExecution implementations.
I am not sure setInitialBinding( ... ) is supported by execDescribe( ... ) 
because I don't think it makes sense for the ?id to be a variable in a describe 
query that resolves to a datatype.  That, and also because execDescribe( ... ) 
does not return a ResultSet.

The QueryExecution that does not suppor tit is the remote one (because the app 
probably should be using BINDINDS).

Do you mean a Binding?

BINDINGS is a keyword in SPARQL 1.1

http://www.w3.org/TR/sparql11-query/#bindings

ARQ's Binding interface is internal and low level.

        Andy

Like BindingHashMap? 
http://incubator.apache.org/jena/documentation/javadoc/arq/com/hp/hpl/jena/sparql/engine/binding/BindingHashMap.html

Do you know of an example where this is used?  I found the javadoc, but I am 
not sure in what situation I would use this, especially since the javadoc says 
Bindings are immutable.

I made a quick implementation of the string-replace suggestion like this:

public Model execDescribe(String sparql, Map<String, String>  params) {
                                
        if(params != null) {
                for(Map.Entry<String, String>  entry : params.entrySet() ) {
                        sparql = sparql.replaceAll("{"+entry.getKey()+"}", 
entry.getValue());
                }
        }
                
        Query query = QueryFactory.create(sparql);
        QueryExecution qe = QueryExecutionFactory.create(query, model);
                
        try {
                return qe.execDescribe();
        } finally {
                qe.close();
        }
}

How could I easily modify this code to internally use a Binding?



Will using a QuerySolution with an mapping of "id" to the application 
determined value work?

Have you tried?  It should work.



Thanks,
--Stephan

The other approach is to store a query template:  example:

DESCRIBE ?foo
WHERE { ?foo a ex:Foo .
        ?foo dcterms:identifier ?{id} .
}

and do a string replacement on on "?{id}"

I like this idea as it is similar to the parameterized ResponseMappings in 
Spring.  Does Jena have any existing support for this?  It was easy to 
implement but I would rather use existing functionality if it is there.

--Stephan


        Andy




Reply via email to