W3C home > Mailing lists > Public > public-rdf-dawg@w3.org > April to June 2006

OPTIONALs and shared variables

From: Steve Harris <steve.harris@garlik.com>
Date: Thu, 8 Jun 2006 11:12:40 +0100
Message-Id: <75DA49DB-FB7F-4D33-81B4-5DC793859D6B@garlik.com>
To: RDF Data Access Working Group <public-rdf-dawg@w3.org>

In the telecon yesterday I mentioned that allowing shared variables  
introduced in OPTIONAL (and UNION) blocks prevented you from  
implementing it in a conventional relational algebra engine. Example:

:a dc10:title "thing" .
:a dc10:creator "John Smith" .
:a dc:11:creator _:jb .
_:jb rdf:value "Joe Bloggs" .

SELECT ?name
WHERE {
   ?a dc10:title "thing" .
   OPTIONAL { ?a dc10:creator ?name }
   OPTIONAL { ?a dc11:creator ?c .
              ?c rdf:value ?name }
}

if there are no shared variables you can map this to:
(excuse syntax, ASCII RA is difficult and it's been a while)

1)  T SELECT pred=dc10:title AND obj=thing RENAME subj,a
2)  LJOIN T a=subj RENAME obj,name
3)  LJOIN T a=subj RENAME obj,c
4)  LJOIN T c=subj AND obj=name

where T is the table of triples, but if you do that you get:

1)  a    c     name
     :a   NULL  NULL

2)  a    c     name
     :a   NULL  "John Smith"

3)  a    c     name
     :a   NULL  "John Smith"
     :a   :_jb  NULL

4)  a    c     name
     :a   NULL  "John Smith"
     # obj = "John Smith" and obj = NULL both fail

What you have to do (as Souri? pointed out) is namespace the values  
according to where they're bound, which is tricky, steps outside  
relational algebra and makes SPARQL significantly harder to implement  
that necessary.

In this simple example it is probably possible to implement it with  
sub-projections or variable mapping and using a big RENAME on the  
end, but in the general case, it's not.

My impression is that this scoped shared variable thing is mostly a  
hack to get round the fact that we don't have SQLs COALESCE() and  
SELECT expressions, but I think it's a bad choice to make the core  
language much more complex to get round it.

The previous form of:

SELECT ?name1 ?name2
WHERE {
   ?a dc10:title "thing" .
   OPTIONAL { ?a dc10:creator ?name1 }
   OPTIONAL { ?a dc11:creator ?c .
              ?c rdf:value ?name2 }
}

didn't have these problems of course, and as a bonus cures the order  
dependency + exponential complexity problem Eric described. The only  
downside being that the end user had to do the coalescing themselves.

- Steve
Received on Thursday, 8 June 2006 10:12:47 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 16:15:26 GMT