Andy, "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.”
in a first glance, it's what I expect to do. If I have a variable ?n instantiated, I will lookup for &n and replace. I read carefully your suggestions but I need to start to have a well founded opinion. I will start only in next week. Miguel On 19 Aug 2014, at 14:36, Andy Seaborne <[email protected]> wrote: > 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 >
