- From: Jon Crump <jjcrump@u.washington.edu>
- Date: Thu, 9 Oct 2008 15:57:23 -0700 (PDT)
- To: "Seaborne, Andy" <andy.seaborne@hp.com>
- cc: Jon Crump <jjcrump@u.washington.edu>, "public-sparql-dev@w3.org" <public-sparql-dev@w3.org>
Andy,
Thanks so much for trying to elucidate sparql for me. Your response was
edifying in many ways: clarifying the use of date vs dateTime (which I
knew), making slightly more clear how UNION works and showing how FILTER
works with 'rows' (which I didn't know). Unfortunately, your response
raised more questions for me than it answered. To help me try and clarify
my problem, I created the following test cases in RDF:
<rdf:RDF xmlns:ex="http://temp.example.org/terms/"
xmlns:loc="http://simile.mit.edu/2005/05/ontologies/location#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<ex:Event rdf:about="http://temp.example.org/terms/Event#case0">
<ex:date
rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2007-12-31</ex:date>
<loc:place
rdf:resource="http://temp.example.org/terms/Place#case0_place" />
</ex:Event>
<ex:Event rdf:about="http://temp.example.org/terms/Event#case1">
<ex:date
rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-01-06</ex:date>
<loc:place
rdf:resource="http://temp.example.org/terms/Place#case1_place" />
</ex:Event>
<ex:Event rdf:about="http://temp.example.org/terms/Event#case2">
<ex:starts
rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-01-04</ex:starts>
<ex:finishes
rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-01-05</ex:finishes>
<loc:place
rdf:resource="http://temp.example.org/terms/Place#case2_place" />
</ex:Event>
<ex:Event rdf:about="http://temp.example.org/terms/Event#case3">
<ex:starts
rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-01-07</ex:starts>
<ex:finishes
rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-01-08</ex:finishes>
<loc:place
rdf:resource="http://temp.example.org/terms/Place#case4_place" />
</ex:Event>
<ex:Event rdf:about="http://temp.example.org/terms/Event#case4">
<ex:starts
rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-01-02</ex:starts>
<ex:finishes
rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-01-03</ex:finishes>
<loc:place
rdf:resource="http://temp.example.org/terms/Place#case3_place" />
</ex:Event>
<ex:Event rdf:about="http://temp.example.org/terms/Event#case5">
<ex:starts
rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-01-09</ex:starts>
<ex:finishes
rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-01-10</ex:finishes>
<loc:place
rdf:resource="http://temp.example.org/terms/Place#case5_place" />
</ex:Event>
<ex:Event rdf:about="http://temp.example.org/terms/Event#case6">
<ex:starts
rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-01-01</ex:starts>
<ex:finishes
rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2008-01-11</ex:finishes>
<loc:place
rdf:resource="http://temp.example.org/terms/Place#case6_place" />
</ex:Event>
</rdf:RDF>
With this as the graph, I tried the following query and discovered that
the >= and <= operators do not work as I expected they would
PREFIX ex: <http://temp.example.org/terms/>
PREFIX loc: <http://simile.mit.edu/2005/05/ontologies/location#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT *
WHERE {
{?event ex:date ?date .
FILTER (xsd:date(?date) >= xsd:date("2008-01-01") &&
xsd:date(?date) <= xsd:date("2008-01-11"))}
UNION {?event ex:starts ?start;
ex:finishes ?end.
FILTER (xsd:date(?start) >= xsd:date("2008-01-02")
&& xsd:date(?end) <= xsd:date("2008-01-10"))}
}
ORDER BY ?event
This query returned cases 1, 2, and 3 where I expected it to return cases
1-5.
If I do instead:
SELECT *
WHERE {
{?event ex:date ?date .
FILTER (xsd:date(?date) >= xsd:date("2008-01-01") &&
xsd:date(?date) <= xsd:date("2008-01-11"))}
UNION {?event ex:starts ?start;
ex:finishes ?end.
FILTER (xsd:date(?start) >= xsd:date("2008-01-01")
&& xsd:date(?end) <= xsd:date("2008-01-11"))}
}
I get cases 1-5
Similarly I have to modify the first filter clause thus:
FILTER (xsd:date(?date) >= xsd:date("2007-12-30") && xsd:date(?date) <=
xsd:date("2008-01-11"))
in order to include case 0 in the result.
Also, I haven't even touched on the question of how to retrieve case 6.
Idealy, I'm looking for a query that returns cases 1-6.
I thank you again for trying to enlighten the dense, and appeal to you
again for further illumination.
Jon
Received on Thursday, 9 October 2008 22:58:01 UTC