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

Reply via email to