Bob MacGregor wrote:
Once upon a time, there was speculation that the the combination of
SPARQL's OPTIONAL and UNBOUND
operators are adequate to emulate a negation-as-failure operator.
Previously, we produced examples
that contradicted that claim. Here is another such example, which is
relatively simple, of a query that
(I believe) one cannot express in SPARQL. It comes out of a real
application we are implementing for a client, i.e.,
its a use case.
The application involves attaching tags to resources that specify the
time of first use. In other words,
until the time specified has passed, the resource should not be
retrievable. In the application, updates
are distributed across triple stores, and the tags serve to insure that
newly updated resources will be visible
at the same time across the distributed stores. It can happen that a
resource is tagged more
than once (since it may be updated more than once). Below is a query
that retrieves only Articles
such that none of their time tags has a newer time than the present
(phrased in a SPARQL-like
syntax):
SELECT ?a
FROM model
WHERE
(?a rdf:type ft:Article) AND
UNSAID ((?a ex:timetag ?time) AND
(?time > $NOW))
This query can also be phrased without difficulty in SQL. If anyone
knows how to
express this in SPARQL, I'd like to see the solution.
Hi Bob,
In SPARQL, this query is (unedited, untested):
SELECT ?a
FROM :model
WHERE {
?a rdf:type ft:article ; ex:timetag ?maxtime .
OPTIONAL { ?a ex:timetag ?othertime . FILTER(?othertime > ?maxtime) }
FILTER (!bound(?othertime) && ?maxtime > '...now...')
}
Negation / universal quantification is not pretty in SPARQL, but it can
usually be done.
I'm CC'ing [email protected], which is a more appropriate list
for 'how-to' questions about SPARQL.
thanks,
Lee