- From: Geoff Chappell <geoff@sover.net>
- Date: Tue, 9 Sep 2003 14:26:37 -0400
- To: <www-rdf-interest@w3.org>
In RDF Gateway's query language[1] your query would look something like:
SELECT ?f USING sometable WHERE {[type] ?f [Freighter]}
AND {?c [location] ?f [antwerp]}
AND {?c [hasCargo] ?f ?cargo}
AND {?c [consistsOf] ?cargo [AluminumPipe]}
AND {[beginDate] ?c ?begin}
AND {[endDate] ?c ?end}
AND DateDiff('s', DATE(?begin), DATE("2003-05-01")) > 0
AND DateDiff('s', DATE(?end), DATE("2003-03-31")) < 0
We support quads for the reasons that you list in your email. If no
context/fourth member is specified, the triple has a null context.
Another handy use for the context.... We support permissioning of
triples based upon the context. E.g. if a user has read permissions to
the [ex:A] context but not the [ex:B] and this data exists:
{[ex:A] [color] [Fido] [Brown]}
{[ex:B] [color] [Fido] [Black]}
and the following query is executed by that user:
SELECT ?c USING mydata WHERE {[color] [Fido] ?c}
Results will be:
?c
=======
[Brown]
rgds,
Geoff Chappell
[1] http://www.intellidimension.com
> -----Original Message-----
> From: www-rdf-interest-request@w3.org [mailto:www-rdf-interest-
> request@w3.org] On Behalf Of Bob MacGregor
> Sent: Tuesday, September 09, 2003 1:42 PM
> To: www-rdf-interest@w3.org
> Subject: Representing temporal data in RDF
>
>
>
> I have yet to come across a system having a substantial user base that
> does an adequate job of representing temporally situated data. If you
> think about it, most facts about the world are either true only within
> a specific temporal interval, or they are things like events that have
> a time component built in (mathematical facts are an exception). In
> other words, when it comes to representing day-to-day facts, there is
> a large opportunity waiting. Ideally, the Semantic Web tools could
> fill this void. Unfortunately, the tools that RDF provides us are
> almost unbearably clumsy. Below is an example.
>
>
> Here is my example query:
>
> "Retrieve freighters that visited Antwerp on
> April 2003 whose cargo included aluminum pipes"
>
>
> The best solution that I have come across for representing this query
> uses quads. A "quad" is a 4-tuple <?c ?s ?p ?o> with roles context,
> subject, predicate, object, i.e., its a triple with an extra context
> field.
>
> Here is the query in a RDQL variant that supports a quad syntax
> instead of a triple syntax, with namespaces omitted:
>
> SELECT ?f
> WHERE ((null ?f type Freighter),
> (?c ?f location antwerp),
> (?c ?f hasCargo ?cargo),
> (?c ?cargo consistsOf AluminumPipe),
> (null ?c beginDate ?begin),
> (null ?c endDate ?end),
> (?begin before "May 1 2003"),
> (?end after "March 31 2003"))
>
> This is actually quite a reasonable query. Its fairly concise, and
> fairly readable. Unfortunately, I'm not aware of any system that
> implements quads and has a significant user base. For the moment,
> quads are still a wish that has not come true.
>
> Now, lets consider expressing this same query using only triples. RDF
> does not provide any officially-sanctioned way to do this, so we have
> to improvise. RDF provides the notion of a reified statement, but
> there is more than one way to use reified statements.
>
> One approach attaches dates and other metadata directly to reified
> statements. Anyone who has experimented with this long enough will
> realize that this approach is a loser.
>
> A second approach attaches metadata (like dates) to a "collection of
> statements", where the collection might be an RDF bag or list. This
> is a big improvement over the previous approach, but we can do better.
>
> The simplest approach invents a context object, and points a context
> to the reified statements within it (or points the statements to the
> context). This approach is isomorphic to the second approach, but is
> slightly cleaner and probably more efficient.
>
> Here we have rewritten the first query using only triples, and
> contexts that include reified statements:
>
> SELECT ?f
> WHERE ((?f type Freighter),
> (?st1 type Statement),
> (?st1 subject ?f),
> (?st1 predicate location),
> (?st1 object antwerp),
> (?st2 type Statement),
> (?st2 subject ?f),
> (?st2 predicate hasCargo),
> (?st2 object ?cargo),
> (?st3 type Statement),
> (?st3 subject ?cargo),
> (?st3 predicate consistsOf),
> (?st3 object AluminumPipe),
> (?st1 inContext ?c),
> (?st2 inContext ?c),
> (?st3 inContext ?c),
> (?c beginDate ?begin),
> (?c endDate ?end),
> (?begin before "May 1 2003"),
> (?end after "March 31 2003"))
>
>
> This gets the job done, but its really quite awful. Not only is it
> much less readable, but it is MUCH less efficient than the quad
> representation. Why is that? First of all, the number of "joins" is
> much larger. Second, and probably more damaging, the optimizer now
> has to optimize over predicates like "subject", "predicate" and
> "object" that mix together extensions of many different predicates. A
> database consisting mostly of temporally-situated data will have to
> reify the majority of its data, so these three predicates will likely
> contain most of the data in the database. Not a pretty sight.
>
> In fact, it IS possible to stick to triples instead of quads, and
> still produce a practical means for representing temporally situated
> data. I'm looking for examples of other RDF-based systems that have
> successfully solved this problem. Any takers (in addition to a
> reference, I would like to see how my query would be represented in
> your system)?
>
> Cheers, Bob
Received on Tuesday, 9 September 2003 14:26:43 UTC