W3C home > Mailing lists > Public > www-rdf-rules@w3.org > October 2003

Query, rules and RDF datatyping

From: Graham Klyne <gk@ninebynine.org>
Date: Wed, 08 Oct 2003 15:10:06 +0100
Message-Id: <>
To: www-rdf-rules@w3.org

I've been thinking about how to implement inference rules that take account 
of RDF datatypes, and operations that may be defined on them.  A simple 
example would be a rule expressed in CWM thus:

     { :vehicle :standingCapacity ?x ; :seatedCapacity ?y .
       (?x ?y) math:plus ?z . }
     { :vehicle :totalCapacity ?z . } .

I'm also interested in rules that can be used in either forward- or 
backward-chaining mode, but I won't go into that here.

I've been mulling this, and think I have a framework that feels plausible 
to me, and which is sufficient to implement CWM-style "magic" properties 
(like math:plus in the above example).

[1] http://www.hpl.hp.com/semweb/rdql.htm

Using RDQL [1] as my starting point, the extra step I'm contemplating is to 
generalize the idea of a query constraint, ala Prolog.  Instead of just 
offering a predicate that must be true for some possible query result to be 
used, to allow a constraint to add variable bindings to a query result.

I'll build this up by example, using bits of (approximate) RDQL.  Consider 
the query:

SELECT ?x, ?y
   :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
   :vehicle :standingCapacity ?x .
   :vehicle :seatedCapacity ?y .
   ?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:

   :vehicle :standingCapacity ?x .
   :vehicle :seatedCapacity ?y .
   ?x + ?y = ?z .

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
   :vehicle :standingCapacity ?x .
   :vehicle :seatedCapacity ?y .
   ?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 


[1] http://www.hpl.hp.com/semweb/rdql.htm

Graham Klyne
Received on Wednesday, 8 October 2003 10:15:28 UTC

This archive was generated by hypermail 2.3.1 : Wednesday, 2 March 2016 11:10:14 UTC