You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by Phil Ashworth <pa...@gmail.com> on 2013/09/06 23:11:22 UTC

Re: Binding Variables for sparqlService

Hi Joshua
Sorry to revisit this thread
In one of the links you kindly provided there is a great example for using
PSS in a construct ( see below)
I really like the example. It's neat that you combine the models together
in a new model before writing it out.

I have a similar problem but I want to run a series of select queries
combing the results of the resultsets before doing something with all the
results.

I've tried a couple ways of doing this but I keep hitting hurdles.
The obvious way is to add each resultset querysolution into a
list<querysolution> and then use an iterator over the list.
But then I can't cast the list Iterator as a resultset which I would like
to do to try and reuse variables in the code whether the it is running
multiple selects or just one.

Is using a list<querysolution>.iterator() the best way to achieve the
outcome?
Cheers
Phil


public class DBPediaQuery {
  public static void main( String[] args ) {
    final String dbpedia = "http://dbpedia.org/sparql";
    final ParameterizedSparqlString queryString
      = new ParameterizedSparqlString(
            "PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>"+
            "PREFIX dbo: <http://dbpedia.org/ontology/>" +
            "CONSTRUCT WHERE {" +
            "  ?s a dbo:Place ." +
            "  ?s geo:lat ?lat ." +
            "  ?s geo:long ?long ." +
            "}" );
    Model allResults = ModelFactory.createDefaultModel();
    for ( String mountain : new String[] { "Mount_Monadnock",
"Mount_Lafayette" } ) {
      queryString.setIri( "?s", "http://dbpedia.org/resource/" + mountain );
      QueryExecution exec = QueryExecutionFactory.sparqlService(
dbpedia, queryString.toString() );
      Model results = exec.execConstruct();
      allResults.add( results );
    }
    allResults.setNsPrefix( "geo", "http://www.w3.org/2003/01/geo/wgs84_pos#" );
    allResults.setNsPrefix( "dbo", "http://dbpedia.org/ontology/" );
    allResults.setNsPrefix( "dbr", "http://dbpedia.org/resource/" );
    allResults.write( System.out, "N3" );
  }}




On Thu, Aug 22, 2013 at 5:42 PM, Joshua TAYLOR <jo...@gmail.com>wrote:

> > On 8/22/13 9:19 AM, "Phil Ashworth" <pa...@gmail.com> wrote:
> >
> >>Hi Guys
> >>I noticed the documentation states*
> >>"
> >>QuerySolutionMap initialBinding = new
> >>QuerySolutionMap();initialBinding.add("name", personResource);qe =
> >>QueryExecutionFactory.create(query, dataset, initialBinding);*
> >>
> >>* *
> >>
> >>*This is often much simpler than the string equivalent since you don't
> >>have
> >>to escape quotes in literals. (Beware that this doesn't work for
> >>sparqlService, which is a great shame. It would be nice to spend some
> time
> >>remedying that.) "*
> >>
> >>I'm actually in the situation that I would like to bind variables for a
> >>sparqlService.
>
> On Thu, Aug 22, 2013 at 12:27 PM, Rob Vesse <rv...@yarcdata.com> wrote:
> > See ParamaterizedSparqlString -
> >
> http://jena.apache.org/documentation/query/parameterized-sparql-strings.htm
> > l
>
> In addition to the documentation, there are some code samples floating
> around the web, too.
>
> This stack overflow answer has code demonstrating the use of a
> parameterized SPARQL string:
>
> http://stackoverflow.com/questions/16737653/get-latitude-and-longitude-of-a-place-dbpedia
>
> Additionally, if you need more than one set of bindings, there's an
> not-too-old (about 3 weeks) about programmatically constructing a
> VALUES block for query here (which doesn't use a
> ParameterizedSparqlString):
>
> http://mail-archives.apache.org/mod_mbox/jena-users/201308.mbox/%3CCA+Q4Jnn9vce94x2mMEPUHnwjsJ4kxEkSrTuwF8N43jSC37CE8g@mail.gmail.com%3E
>
> //JT
>
> --
> Joshua Taylor, http://www.cs.rpi.edu/~tayloj/
>

Re: Binding Variables for sparqlService

Posted by Joshua TAYLOR <jo...@gmail.com>.
On Mon, Sep 9, 2013 at 12:33 PM, Phil Ashworth <pa...@gmail.com> wrote:
>
> HI Joshua
> Sorry I think I caused some confusion.
> The code was the example from the web site you pointed me to.
> That code used a second model to capture all the information from all of the constructs.
> Basically I want to do the same but for a select statement.
> Selects come back as result set of query solutions so I was wondering if there an easy way of combining all the querysolutions from all of the result sets from multiple selects and then have an resultsets to iterate over them.

How about ResultSetMem [1]?  It's got a constructor that looks like it
does what you want:

public ResultSetMem(ResultSet... sets)

Create an in-memory result set from an array of ResulSets. It is
assumed that all the ResultSets from the array have the same
variables.
Parameters:sets - the ResultSet objects to concatenate.

[1] http://jena.apache.org/documentation/javadoc/arq/com/hp/hpl/jena/sparql/resultset/ResultSetMem.html


> On Mon, Sep 9, 2013 at 2:08 PM, Joshua TAYLOR <jo...@gmail.com> wrote:
>>
>> On Fri, Sep 6, 2013 at 5:11 PM, Phil Ashworth <pa...@gmail.com> wrote:
>> > Sorry to revisit this thread
>> > In one of the links you kindly provided there is a great example for using
>> > PSS in a construct ( see below)
>> > I really like the example. It's neat that you combine the models together in
>> > a new model before writing it out.
>> >
>> > I have a similar problem but I want to run a series of select queries
>> > combing the results of the resultsets before doing something with all the
>> > results.
>> >
>> > I've tried a couple ways of doing this but I keep hitting hurdles.
>> > The obvious way is to add each resultset querysolution into a
>> > list<querysolution> and then use an iterator over the list.
>> > But then I can't cast the list Iterator as a resultset which I would like to
>> > do to try and reuse variables in the code whether the it is running multiple
>> > selects or just one.
>> >
>> > Is using a list<querysolution>.iterator() the best way to achieve the
>> > outcome?
>> >
>> > public class DBPediaQuery {
>> >   public static void main( String[] args ) {
>> >     final String dbpedia = "http://dbpedia.org/sparql";
>> >     final ParameterizedSparqlString queryString
>> >       = new ParameterizedSparqlString(
>> >             "PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>"+
>> >             "PREFIX dbo: <http://dbpedia.org/ontology/>" +
>> >             "CONSTRUCT WHERE {" +
>> >             "  ?s a dbo:Place ." +
>> >             "  ?s geo:lat ?lat ." +
>> >             "  ?s geo:long ?long ." +
>> >             "}" );
>> >     Model allResults = ModelFactory.createDefaultModel();
>> >     for ( String mountain : new String[] { "Mount_Monadnock",
>> > "Mount_Lafayette" } ) {
>> >       queryString.setIri( "?s", "http://dbpedia.org/resource/" + mountain );
>> >       QueryExecution exec = QueryExecutionFactory.sparqlService( dbpedia,
>> > queryString.toString() );
>> >       Model results = exec.execConstruct();
>> >       allResults.add( results );
>> >     }
>> >     allResults.setNsPrefix( "geo",
>> > "http://www.w3.org/2003/01/geo/wgs84_pos#" );
>> >     allResults.setNsPrefix( "dbo", "http://dbpedia.org/ontology/" );
>> >     allResults.setNsPrefix( "dbr", "http://dbpedia.org/resource/" );
>> >     allResults.write( System.out, "N3" );
>> >   }
>> > }
>>
>> Sorry for the delay in response.  I'm not quite clear from the code
>> that you posted what exactly you're trying to do.  ResultSet is just
>> an interface, and it wouldn't be all that hard to implement a
>> ResultSet that wraps a iterator over QuerySolutions.  However, if the
>> problem is that you're using QEF.sparqlService:
>>
>> >       QueryExecution exec = QueryExecutionFactory.sparqlService( dbpedia, queryString.toString() );
>>
>> perhaps you could use the 'service' keyword in the query, e.g.,
>>
>> PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
>> PREFIX dbo: <http://dbpedia.org/ontology/>
>> CONSTRUCT WHERE {
>>   SERVICE <http://dbpedia.org/sparql> {
>>     ?s a dbo:Place .
>>     ?s geo:lat ?lat .
>>     ?s geo:long ?long .
>>   }
>> }
>>
>> and execute the query as you would if you weren't using
>> QEF.sparqlService.  I'm not sure whether that works or not, but if it
>> does, and your problem arises from using QEF.sparqlService, it seems
>> like a relatively quick workaround.
>>
>> --
>> Joshua Taylor, http://www.cs.rpi.edu/~tayloj/
>
>



-- 
Joshua Taylor, http://www.cs.rpi.edu/~tayloj/

Re: Binding Variables for sparqlService

Posted by Joshua TAYLOR <jo...@gmail.com>.
On Fri, Sep 6, 2013 at 5:11 PM, Phil Ashworth <pa...@gmail.com> wrote:
> Sorry to revisit this thread
> In one of the links you kindly provided there is a great example for using
> PSS in a construct ( see below)
> I really like the example. It's neat that you combine the models together in
> a new model before writing it out.
>
> I have a similar problem but I want to run a series of select queries
> combing the results of the resultsets before doing something with all the
> results.
>
> I've tried a couple ways of doing this but I keep hitting hurdles.
> The obvious way is to add each resultset querysolution into a
> list<querysolution> and then use an iterator over the list.
> But then I can't cast the list Iterator as a resultset which I would like to
> do to try and reuse variables in the code whether the it is running multiple
> selects or just one.
>
> Is using a list<querysolution>.iterator() the best way to achieve the
> outcome?
>
> public class DBPediaQuery {
>   public static void main( String[] args ) {
>     final String dbpedia = "http://dbpedia.org/sparql";
>     final ParameterizedSparqlString queryString
>       = new ParameterizedSparqlString(
>             "PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>"+
>             "PREFIX dbo: <http://dbpedia.org/ontology/>" +
>             "CONSTRUCT WHERE {" +
>             "  ?s a dbo:Place ." +
>             "  ?s geo:lat ?lat ." +
>             "  ?s geo:long ?long ." +
>             "}" );
>     Model allResults = ModelFactory.createDefaultModel();
>     for ( String mountain : new String[] { "Mount_Monadnock",
> "Mount_Lafayette" } ) {
>       queryString.setIri( "?s", "http://dbpedia.org/resource/" + mountain );
>       QueryExecution exec = QueryExecutionFactory.sparqlService( dbpedia,
> queryString.toString() );
>       Model results = exec.execConstruct();
>       allResults.add( results );
>     }
>     allResults.setNsPrefix( "geo",
> "http://www.w3.org/2003/01/geo/wgs84_pos#" );
>     allResults.setNsPrefix( "dbo", "http://dbpedia.org/ontology/" );
>     allResults.setNsPrefix( "dbr", "http://dbpedia.org/resource/" );
>     allResults.write( System.out, "N3" );
>   }
> }

Sorry for the delay in response.  I'm not quite clear from the code
that you posted what exactly you're trying to do.  ResultSet is just
an interface, and it wouldn't be all that hard to implement a
ResultSet that wraps a iterator over QuerySolutions.  However, if the
problem is that you're using QEF.sparqlService:

>       QueryExecution exec = QueryExecutionFactory.sparqlService( dbpedia, queryString.toString() );

perhaps you could use the 'service' keyword in the query, e.g.,

PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX dbo: <http://dbpedia.org/ontology/>
CONSTRUCT WHERE {
  SERVICE <http://dbpedia.org/sparql> {
    ?s a dbo:Place .
    ?s geo:lat ?lat .
    ?s geo:long ?long .
  }
}

and execute the query as you would if you weren't using
QEF.sparqlService.  I'm not sure whether that works or not, but if it
does, and your problem arises from using QEF.sparqlService, it seems
like a relatively quick workaround.

--
Joshua Taylor, http://www.cs.rpi.edu/~tayloj/