On 3/25/2013 4:37, Andy Seaborne wrote:
Looking back at the thread with Joshua Taylor on initial bindings and
update, I wonder if we could do with "proper" templates.
Manipulation of the algebra for query building does not work so well
remotely as the query is sent in syntax form. Having query templates
in SPARQL syntax with template parameters seems more natural.
(read "query or update" for "query" throughout).
ParameterizedSparqlString seems to do two things - correct me if I'm
wrong Rob - it's a sort of builder of queries (the .append(..)
methods) and also a bit like JDBC prepared statements (.setXYZ(...)).
But it does not know the syntax of the query or update. They are open
to injection [1] although that's fixable.
My suggestion is to have template queries, which are like, but not
identical, to JDBC prepared statements. A template query is a
superset of SPARQL. Template parameterization is via a new parse item,
not a legal SPARQL variable (e.g. ?{abc}). They must be replaced by a
node (which could be a real variable) to use them. There would
template.asQuery(..substitutions...).
An alternative was using SPARQL variables, requiring a query/update
template to declare the template variables and checking when
converting to a query or update. But, as below, there are a couple of
points where it is desirable to parameterize a template that in SPARQL
do not allow variables.
I have always wondered why the SPARQL 1.1 WG did not decide to allow
variables in OFFSET and LIMIT - both are common patterns in interactive
UIs where users page through a result set. I believe it would be great
if this was supported in ARQ Syntax, and maybe SPARQL 1.2 will align
with ARQ Syntax just like it did in previous iterations.
I would personally prefer to go with established techniques such as
pre-binding before inventing another query preprocessor syntax that
cannot be parsed by SPARQL parsers and that opens the door to other
problems.
SPIN already has a syntax for templates and a mechanism to declare
arguments. It has been used for quite some time now and seems to work well.
Holger
If we're tweaking the syntax anyway, we might as well have template
variable syntax.
The reason for some checking is so you can't do "SELECT * { ?s ?p ?o
}" forgetting to replace ?s with a URI, for example.
== Query
LIMIT and OFFSET take fixed integers by syntax and ideally they would
parameters.
== Update
INSERT DATA / DELETE DATA restrict
It would be good to have template data updates. But the data part of
INSERT DATA explicitly forbids variables.
To this end, I have got the machinery for transforms of Element
objects (c.f. transforms on Ops) working. By working on the AST,
injection is harder because the template parameter must be a Node to
go in the right place in the AST.
Comments and thoughts?
Rob - does this relate to jena-jdbc in some way?
Andy
[1]
public static void injection() {
String str =
"PREFIX : <http://example/>\nINSERT DATA { <s> <p> ?var2 . }" ;
ParameterizedSparqlString pss = new ParameterizedSparqlString(str) ;
pss.setIri("var2",
"hello> } ; DROP ALL ; INSERT DATA { <s> <p> <goodbye"
) ;
String x = pss.toString() ;
System.out.println(x) ;
}