- From: Alberto Reggiori <alberto@asemantics.com>
- Date: Fri, 7 May 2004 12:28:32 +0200
- To: Eric Prud'hommeaux <eric@w3.org>
- Cc: RDF Data Access Working Group <public-rdf-dawg@w3.org>
On May 5, 2004, at 3:28 AM, Eric Prud'hommeaux wrote: > > On Tue, May 04, 2004 at 05:29:29PM -0500, Dan Connolly wrote: >> >> Perhaps some of the implementors would like to relate >> their experience? > > I have [1], but it didn't seem to motivate people. In the Annotea > service, I use a few Algae queries like: I must have missed that - we have some simple/lightweight OR (disjunction) support in our RDQL back-end. In fact, our indexing allows those quite efficiently - even though full disjunction is more tricky, but still quite possible to run behind a Web interface. In the AMS preso (see slide 8) I put a sample query which uses an insane (abusive) extension to the core language, to use commas inside triple-pattern parts to match different dc:source(s) - actually used in our news-blender demo > > ------------ example queries -------------------- > ask (?reply rdf:type t:Reply. > ?reply t:root <foo>. > (?reply dc0:title ?title || > ?reply dc1:title ?title) > ) > collect (?reply ?title) which would map to our RDQL-ish as select ?reply ?title where (?reply <rdf:type> <t:Reply>) (?reply <t:root> <foo>) (?reply <dc0:title , dc1:title> ?title) where the 3rd triple pattern contains 2 predicates separated by space+comma+space (' , '); which is an implementation trick/compromise due that URIs can contain commas as far as I know - any other syntactic sugar can be invented if necessary. The same can be used on any other node pattern - as well as on subjects, predicates, objects (also literals) and graph-name(context as 4th component) E.g. Given an RSS1.0 store/database, select all rss:item(s) from corriere.it and ansa.it dc:source(s) select ?item where (?item <rdf:type> <rss:item>) (?items ?ii ?item) (?items <rdf:type> <rdf:Seq>) (?s <rss:items> ?items) (?s <rdf:type> <rss:channel>) (?s <dc:source> <http://www.corriere.it/ , http://www.ansa.it/>) or even more tricky on object literal values or stems E.g. select rss:item(s) with dc:title value either "title 1" in english or "titolo 1" or "titolo 2" in italian select ?item where (?item <rdf:type> <rss:item>) (?item <dc:title> <"title 1"@en , "titolo 1"@it , "titolo 2"@it>) As shown above the syntax for OR-ing literals is more tricky - and it requires to use single/double quotes and the space-comma-space syntax above for URIs/QNames - but it works quite well at the end because each triples pattern sub-query maps to a simple series of boolean operations on certain bit maps - at least for us :o) > and > > ask (<bar> rdf:type a:Annotation . > <bar> a:annotates ?annotates. > <bar> a:context ?context. > ( <bar> dc0:creator ?creator || > <bar> dc1:creator ?creator ) > ?creator a:E-mail ?email. > ?creator a:name ?name. > <bar> a:ceated ?created. > ( <bar> dc0:date ?date || > <bar> dc1:date ?date ) > <bar> a:body ?body . > ?body http:Body ?bodyData. > ?body http:ContentType ?contentType > ) > collect (?annotation ?body ?creator ?date ?contentType) similarly here in RDQL-ish select ?annotation ?body ?creator ?date ?contentType where (<bar> <rdf:type> <a:Annotation>) (<bar> <a:annotates> ?annotates) (<bar> <a:context> ?context) (<bar> <dc0:creator , dc1:creator>, ?creator) (?creator <a:E-mail> ?email) (?creator <a:name> ?name) (<bar> <a:created> ?created) (<bar> <dc0:date , dc1:date> ?date) //...and so on... > > Note, the latter query needs to be expressed as four separate > queriesif disjunction is not used. yes indeed! even simple OR-ing (disjunction) is very useful in practical terms - we are also thinking to use such feature to expand simple rdf:type queries to check different (sub/super) types of things instead of use recursion or stuff like that... > ---------- end example queries ------------------- > > We've had some discussion around disjunction limited to property > values (for example, ?creator is "Bob" or "Joe" or "Sue"). During the > face to face, someone said that disjunctions with different properties > was difficult, but my implementation experience hasn't born that out > in either an in-memory query engine or a translation to SQL*. right - we found out that disjunction is possible to run quite efficiently using some iterative algorithm as a sequence of AND and OR operations, but it has quite a lot of implications in the optimization/mapping to SQL. Sometime ago, I tried to propose some syntactic sugar for more generic OR/disjunction [1] - which never got implemented as far as I know - but it would be nice/useful to see it usable into the core DAWG language. to conclude - my guts feeling is that users of our query language will need (in a way or the other) some primitive type of OR/disjunction to simplify their life while programming with RDF :) cheers Alberto [1] http://lists.w3.org/Archives/Public/www-rdf-rules/2003Apr/0030.html
Received on Friday, 7 May 2004 06:32:48 UTC