On 18/08/14 12:17, Miguel Bento Alves wrote:
Dear all,
I will start to develop an engine to evaluate rules that combines SPARQL
commands with rule terms. The purpose is to be possible to define rules like:
ex:SportsMan ex:minimumSportsPlayed 1 .
ex:IronMan ex:minimumSportsPlayed 3 .
(?x rdf:type ?t) <-
?t ex:minimumSportsPlayed ?n .
(\\\SPARQL
(Select ?x
Where {
?x ex:playSport ?y .
}
group by ?x
having (count(1) >=&n)
\\\SPARQL).
Note: in a first approach syntax "&n" is to make reference to ?n .
my question is: how we should make reference to external variables in a Sparql
command?
To start the discussion, I have two proposals:
the symbol "&";
keep the symbol "?", where some variables must be instantiated before
the execution of the sparql command. Something like:
(?x rdf:type ?t) <-
?t ex:minimumSportsPlayed ?n .
(\\\SPARQL
(Select ?x
Where {
?x ex:playSport ?y .
}
group by ?x
having (count(1) >=?n)
\\\SPARQL).
Miguel
Using & means you need to process the query string and so need to be
careful of & used elsewhere (e.g. in a string, in the '&&' operator).
Another approach is to use a named variable, parse the SPARQL query,
which identifies variables, then rewrite the parsed structure to replace
occurrences of variable 'n' by a specific value.
If "?t ex:minimumSportsPlayed ?n" has multiple matches, it would need to
loop on ?n.
I do have some code that rewrites the abstract syntax tree:
https://github.com/afs/AFS-Dev/tree/master/src/main/java/element
which you're free to copy and use.
Or you can do it on the Algebra -- see
com.hp.hpl.jena.sparql.core.Substitute(Op, Binding)
If you know "?t ex:minimumSportsPlayed ?n" is from the data, you may be
able to convert that part and the SPARQL query into a single algebra
expression bu joining the two parts, and execute the whole right-hand
side as SPARQL.
Andy