- From: Dave Beckett <dave@dajobe.org>
- Date: Mon, 20 Jul 2009 07:04:37 -0700
- To: Nicolas Chauvat <nicolas.chauvat@logilab.fr>, 'Semantic Web' <semantic-web@w3.org>
- CC: Dan Brickley <danbri@danbri.org>
Nicolas Chauvat wrote:
> Hi,
>
> On Mon, Jul 20, 2009 at 11:29:15AM +0200, Dan Brickley wrote:
>> Intriguing. Can you post more about this sometime? eg. plans for Redland
>> and Rasqal changes too? Where are things heading?
>
> The other day I was looking for a library available from Python that
> would parse SPARQL and return an AST (we are working on supporting
> sparql in CubicWeb). I gave a look at Rasqal but it did not appear to
> be able to provide that feature. Was my understanding correct ?
>
> An example of what I am looking for::
>
> from somelib import parse
> tree = parse(sparql_query_string)
> # do something with the tree
I guess I answered this in another thread but here's an example of the
subversion version of rasqal turning a query into AST. (The query engine
itself then turns that into sparql algebra).
$ cat test-queries/tr.rq
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX org: <http://www.w3.org/2001/04/roadmap/org#>
PREFIX mat: <http://www.w3.org/2002/05/matrix/vocab#>
PREFIX doc: <http://www.w3.org/2000/10/swap/pim/doc#>
PREFIX rec: <http://www.w3.org/2001/02pd/rec54#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX con: <http://www.w3.org/2000/10/swap/pim/contact#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT $wg $date $document
#FROM <http://www.w3.org/2002/01/tr-automation/tr.rdf>
FROM <tr.rdf>
WHERE {
$document a rec:WD.
$document org:deliveredBy $x.
$x con:homePage $wg.
$document dc:date $date.
OPTIONAL {
$document2 a rec:WD.
$document2 dc:date $date2.
$document2 org:deliveredBy $x2.
$x2 con:homePage $wg.
FILTER ($date < $date2 && $document2 != $document)
}.
FILTER(!BOUND($document2))
}
$ utils/roqet -n -d structure test-queries/tr.rq
roqet: Querying from file test-queries/tr.rq
Query:
query verb: SELECT
query bound variables (3): wg, date, document
query Group graph pattern[0] {
sub-graph patterns (3) {
Basic graph pattern[1] #0 {
triples {
triple #0 { triple(variable(document),
uri<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>,
uri<http://www.w3.org/2001/02pd/rec54#WD>) }
triple #1 { triple(variable(document),
uri<http://www.w3.org/2001/04/roadmap/org#deliveredBy>, variable(x)) }
triple #2 { triple(variable(x),
uri<http://www.w3.org/2000/10/swap/pim/contact#homePage>, variable(wg)) }
triple #3 { triple(variable(document),
uri<http://purl.org/dc/elements/1.1/date>, variable(date)) }
}
}
Optional graph pattern[2] #1 {
sub-graph patterns (1) {
Group graph pattern[3] #0 {
sub-graph patterns (2) {
Basic graph pattern[4] #0 {
triples {
triple #0 { triple(variable(document2),
uri<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>,
uri<http://www.w3.org/2001/02pd/rec54#WD>) }
triple #1 { triple(variable(document2),
uri<http://purl.org/dc/elements/1.1/date>, variable(date2)) }
triple #2 { triple(variable(document2),
uri<http://www.w3.org/2001/04/roadmap/org#deliveredBy>, variable(x2)) }
triple #3 { triple(variable(x2),
uri<http://www.w3.org/2000/10/swap/pim/contact#homePage>, variable(wg)) }
}
}
Filter graph pattern[5] #1 {
filter { expr(op and(expr(op lt(expr(variable(date)),
expr(variable(date2)))), expr(op neq(expr(variable(document2)),
expr(variable(document))))))}
}
}
}
}
}
Filter graph pattern[6] #2 {
filter { expr(op bang(expr(op bound(expr(variable(document2))))))}
}
}
}
The released rasqal does something similar but the structure is slightly
different.
The above is a dump of a walk of the constructed data structures made
available via the C API. Garlik's 4store uses this for it's query parsing.
Dave
Received on Monday, 20 July 2009 14:05:15 UTC