- From: Wood, Jamey <Jamey.Wood@nrel.gov>
- Date: Fri, 21 Aug 2009 11:10:48 -0600
- To: "public-sparql-dev@w3.org" <public-sparql-dev@w3.org>
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
Received on Monday, 24 August 2009 07:15:27 UTC