Re: Dynamically Merging Multiple Named Graphs?

This is not beautiful, but should work:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX ex: <http://example.org/vocabulary#>
PREFIX : <http://example.org/exampleDocument#> 
SELECT ?person $age
WHERE {
 GRAPH ?g1 {
  ?person rdf:type ex:LivingPerson .
 }
 GRAPH ?g2 {
  ?person ex:age ?age .
 }
 ?g1 ex:startDate ?ctx_startDate1 .
 ?g1 ex:endDate ?ctx_endDate1 .
 FILTER (("1840-04-01T00:00:00Z"^^xsd:dateTime >= xsd:dateTime(?ctx_startDate1)) &&
         ("1840-04-01T00:00:00Z"^^xsd:dateTime <= xsd:dateTime(?ctx_endDate1)))
 ?g2 ex:startDate ?ctx_startDate2 .
 ?g2 ex:endDate ?ctx_endDate2 .
 FILTER (("1840-04-01T00:00:00Z"^^xsd:dateTime >= xsd:dateTime(?ctx_startDate2)) &&
         ("1840-04-01T00:00:00Z"^^xsd:dateTime <= xsd:dateTime(?ctx_endDate2)))
}

Of cause, for longer queries it becomes a bit nasty.

Cheers,
Simon

Am Dienstag, den 25.08.2009, 09:12 -0400 schrieb Lee Feigenbaum:
> Hi Jamey,
> 
> I don't think there's any way to do what you're looking for in SPARQL.
> 
> In your particular example, you could query with the full contents of 
> the store merged as the query's default graph, but I realize that 
> doesn't work in the general case.
> 
> Sorry I don't have a more helpful answer here!
> 
> Lee
> 
> Wood, Jamey wrote:
> > I’m trying to find a good way to contextualize RDF statements (so that
> > statements could be bound to a certain time period, licensing terms, etc).
> > Named graphs seem to handle this pretty well.  But I can’t find a good way
> > to query across all named graphs which match some criteria.
> > 
> > I’ll try to illustrate the issue I’m facing via an example.  Suppose we have
> > the following graphs:
> > 
> >   @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
> >   @prefix xsd: <http://www.w3.org/2001/XMLSchema#>
> >   @prefix ex: <http://example.org/vocabulary#> .
> >   @prefix : <http://example.org/exampleDocument#>
> > 
> >   # default graph
> >   {
> >     <urn:g1> ex:startDate "1809-02-12T00:00:00Z"^^xsd:dateTime .
> >     <urn:g1> ex:endDate "1865-04-15T00:00:00Z"^^xsd:dateTime .
> >     <urn:g2> ex:startDate "1839-02-12T00:00:00Z"^^xsd:dateTime .
> >     <urn:g2> ex:endDate "1840-02-12T00:00:00Z"^^xsd:dateTime .
> >     <urn:g3> ex:startDate "1840-02-12T00:00:00Z"^^xsd:dateTime .
> >     <urn:g3> ex:endDate "1841-02-12T00:00:00Z"^^xsd:dateTime .
> >   }
> > 
> >   <urn:g1> {
> >     :Abraham_Lincoln rdf:type ex:LivingPerson .
> >   }
> > 
> >   <urn:g2> {
> >     :Abraham_Lincoln ex:age "30"^^http://www.w3.org/2001/XMLSchema#integer ..
> >   }
> > 
> >   <urn:g3> {
> >     :Abraham_Lincoln ex:age "31"^^http://www.w3.org/2001/XMLSchema#integer ..
> >   }
> > 
> > (So the default graph just contains “context information” and the “real” data is in the named graphs.)
> > 
> > Now suppose that I want to write a query to get the age of all living persons on a particular day.
> > In other words, I'd like to do something kind of like this:
> > 
> >   PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
> >   PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
> >   PREFIX ex: <http://example.org/vocabulary#>
> >   PREFIX : <http://example.org/exampleDocument#>
> > 
> >   SELECT ?person $age
> >   WHERE {
> >     GRAPH ?g {
> >       ?person rdf:type ex:LivingPerson .
> >       ?person ex:age ?age .
> >     }
> >     ?g ex:startDate ?ctx_startDate .
> >     ?g ex:endDate ?ctx_endDate .
> >     FILTER (("1840-04-01T00:00:00Z"^^xsd:dateTime >= xsd:dateTime(?ctx_startDate)) &&
> >             ("1840-04-01T00:00:00Z"^^xsd:dateTime <= xsd:dateTime(?ctx_endDate)))
> >   }
> > 
> > ....except that won't work, since the "rdf:type ex:LivingPerson" and "ex:age 31" assertions
> > live in two different graphs (even though each of those graphs represents a context which
> > does contain April 1, 1840).
> > 
> > Is there some way to make this work?  Essentially, I think I'm looking for a way to
> > have a query construct a dynamic merge of named graphs (without having to know the names
> > of those graphs up-front).
> > 
> > I’ve looked at the proposal for Composite Datasets
> > (http://www.w3.org/2009/sparql/wiki/Feature:CompositeDatasets), and it sounds somewhat
> > like what I’m seeking.  But even with it, it sounds like I’d need to explicitly specify
> > the graphs which I wanted to merge (instead of being able to just specify criteria about
> > them, and letting the system find them).  Correct?
> > 
> > Also, I should note that I’m fairly new to semantic web technologies.  So my apologies
> > In advance if I’ve botched any of the above syntax or am just approaching this in a screwy
> > way.
> > 
> > Thanks,
> > Jamey
> > 
> > 
> 
-- 
Simon Schenk | ISWeb | Uni Koblenz
http://isweb.uni-koblenz.de
http://www.uni-koblenz.de/~sschenk
Five sentences policy: http://five.sentenc.es/

Received on Tuesday, 25 August 2009 13:26:42 UTC