- From: Geoff Chappell <geoff@sover.net>
- Date: Wed, 8 Oct 2003 11:00:43 -0400
- To: "'Graham Klyne'" <gk@ninebynine.org>, <www-rdf-rules@w3.org>
> -----Original Message----- > From: www-rdf-rules-request@w3.org [mailto:www-rdf-rules-request@w3.org] > On Behalf Of Graham Klyne > Sent: Wednesday, October 08, 2003 10:10 AM > To: www-rdf-rules@w3.org > Subject: Query, rules and RDF datatyping > > [...] > > I'll build this up by example, using bits of (approximate) RDQL. Consider > the query: > > SELECT ?x, ?y > WHERE > :vehicle :standingCapacity ?x . > :vehicle :seatedCapacity ?y . > > This is pretty boring, and doesn't come close to what I want to > achieve. But RDQL offers <SUCHTHAT> clauses, which I think are introduced > by "AND" (the grammar in citation [1] doesn't actually say): > > SELECT ?x, ?y > WHERE > :vehicle :standingCapacity ?x . > :vehicle :seatedCapacity ?y . > AND > ?x + ?y = 60 . > > This allows me to build conditions based on arithmetic operations, but > doesn't give access to the results. But if I say: > > SELECT ?z > WHERE > :vehicle :standingCapacity ?x . > :vehicle :seatedCapacity ?y . > AND > ?x + ?y = ?z . So do I understand correctly that it's not currently possible to return bindings from constraints in a RDQL query? And that's what you need to support your datatyping rules? I'd always wondered why the two pieces were separate - triple bindings and additional constraints - i.e. why isn't it just: WHERE :vehicle :standingCapacity ?x . :vehicle :seatedCapacity ?y . ?x + ?y = ?z . We treat them that way in RDFQL - e.g. WHERE {[standingCapacity] [vehicle] ?x} AND {[seatedCapacity] [vehicle] ?y} AND ?z=add(?x, ?y) > Here, the constraint clause is treated not simply as returning a > true/false > result, but is extended so that (like a clause in Prolog) any variable > bindings that may added to make the clause true are also returned. The > simple constraint case simply returns the existing variable binding or > none > at all. If there is more than one possible binding for ?z, then > additional > query results may be generated. > > So consider the query: > > SELECT ?x, ?y, ?z > WHERE > :vehicle :standingCapacity ?x . > :vehicle :seatedCapacity ?y . > AND > ?x + ?y <= ?z . && ( ?z = 30 . || ?z = 60 . ) > > applied to the following target graphs: > > (1) :vehicle :standingCapacity 20 . --> [(?x=20,?y=30,?z=60)] > :vehicle :seatedCapacity 30 . > (just one result) > > (2) :vehicle :standingCapacity 30 . --> [] > :vehicle :seatedCapacity 40 . > (no result) > > (2) :vehicle :standingCapacity 10 . --> [(?x=10,?y=20,?z=30), > :vehicle :seatedCapacity 20 . (?x=10,?y=20,?z=60)] > (two results) > > This begs questions about how new variable bindings may be generated, > particularly since I want to be able to use this with both forward and > backward rule chaining, but I have some ideas that I think I can see how > to > prototype. This gets you into the finite domain constraint world, doesn't it - i.e. you need some way of enumerating the possible (finite) values for a particular variable (and hopefully some means of propagating constraints to avoid combinatorial hell and make it practical with non-toy domains.) > #g > -- Geoff Chappell
Received on Wednesday, 8 October 2003 11:01:03 UTC