Dear Martynas, 

Thank you very much for your help. 
At the moment, I am trying what Andy suggested. 
I hope to make it. Otherwise, I will look at SPIN API.

Many Thanks,
Best Regards,
Carlo


> On 28 Jan 2016, at 23:48, Martynas Jusevičius <[email protected]> wrote:
> 
> You could do it using SPIN API as well: http://spinrdf.org/sp.html
> 
> On Thu, Jan 28, 2016 at 7:39 PM, Carlo.Allocca <[email protected]> 
> wrote:
>> Dear Andy,
>> 
>> Thank you very much for your promtly reply.
>> 
>> I need a little bit of exploring and thinking to apply what you suggested.
>> Indeed, I will look at each single info you pointed out.
>> 
>> I will keep this thread updated.
>> 
>> Many Thanks,
>> Best Regards,
>> Carlo
>> 
>>> On 28 Jan 2016, at 18:29, Andy Seaborne <[email protected]> wrote:
>>> 
>>> The approach I would take is to do this is multiple passes:
>>> 
>>> 1/ remove from ElementPathBlock
>>> 
>>> 2/ Look for elements that are now "empty"
>>> e.g ElementFilter with empty
>>> but also as there one arm of a UNION.
>>> 
>>> (2) is only one pass as the rewrite is done bottom up.
>>> 
>>> 
>>> I would do this as a transformation rather than modifying the syntax tree 
>>> in place.
>>> 
>>> org.apache.jena.sparql.syntax.syntaxtransform
>>> 
>>> 
>>> See also
>>> ElementTransformCleanGroupsOfOne
>>> 
>>> which might be helpful to understand - its doing something different though.
>>> 
>>> It might be easier to work on the algebra, it's more regular.  Then use 
>>> OpAsQuery to turn algebnra into a Query.
>>> 
>>>> I could not figure out how to remove the associated FILTER
>>>> when visit(ElementFilter el) as below.
>>> 
>>> because you need to alter the ElementUnion which holds the ElementFilter.
>>> 
>>> {...} UNION {} will include a blank row for the {} on the right hand side.
>>> 
>>>      Andy
>>> 
>>> 
>>> On 28/01/16 13:14, Carlo.Allocca wrote:
>>>> Dear All,
>>>> 
>>>> I am using Jena for my project and I would like to submit the following 
>>>> question: How to remove consistently a triple pattern given a SPARQL query?
>>>> 
>>>> EXAMPLE:
>>>> 
>>>> For example, considering the query “qString1” and the tp=“?boss 
>>>> ex:isBossOf ?ind .”
>>>> I need to remove tp from qString1, obtaining  qString1. For “Consistently” 
>>>>  I mean that the clause FILTER gets affected (as it contains var that 
>>>> appears in the triple pattern too), therefore it needs to be deleted too.
>>>> 
>>>>       String qString1 =
>>>>                " SELECT DISTINCT ?ind ?boss ?g where "
>>>>               + "{ "
>>>>               + " ?ind rdf:type ex:AssociatedResearcher ."
>>>>               + " {?ind rdf:type ?z. } UNION "
>>>>               + " {?boss ex:isBossOf ?ind . Filter(?boss=\”rossi\”)} "
>>>>               + "}";
>>>> 
>>>> 
>>>>       String qString2 =
>>>>                " SELECT DISTINCT ?ind ?boss ?g “
>>>>                + “WHERE "
>>>>               + "{ "
>>>>               + " ?ind rdf:type ex:AssociatedResearcher ."
>>>>               + " {?ind rdf:type ?z. } UNION "
>>>>               + " {} "
>>>>               + "}";
>>>> 
>>>> The solution that I am trying to implement is based on a visitor 
>>>> “SQRemoveTripleVisitor extends ElementVisitorBase”.
>>>> It is quite straightforward to remove the triple pattern when 
>>>> visit(ElementPathBlock el)
>>>> 
>>>>   @Override
>>>>   public void visit(ElementPathBlock el) {
>>>>       if (el == null) {
>>>>           throw new 
>>>> IllegalStateException("[SQRemoveTripleVisitor::visit(ElementPathBlock el)] 
>>>> The ElementPathBlock is null!!");
>>>>       }
>>>> 
>>>>       ListIterator<TriplePath> it = el.getPattern().iterator();
>>>>       while (it.hasNext()) {
>>>>           final TriplePath tp1 = it.next();
>>>> 
>>>>           if (this.tp != null) {
>>>>               if (this.tp.matches(tp1.asTriple())) {
>>>>                   it.remove();
>>>>               }
>>>>           }
>>>>       }
>>>> 
>>>>   }
>>>> 
>>>> I could not figure out how to remove the associated FILTER when 
>>>> visit(ElementFilter el) as below.
>>>> 
>>>> 
>>>> @Override
>>>>   public void visit(ElementFilter el) {
>>>> 
>>>>       //...get the variables of the FILTER expression
>>>>       Expr filterExp = el.getExpr();//.getVarsMentioned().contains(el);
>>>>       Set<Var> expVars = filterExp.getVarsMentioned();
>>>> 
>>>>       //...get the variables of the triple pattern that we want to delete
>>>>       Set<Var> tpVars = new HashSet();
>>>>       Node subj = this.tp.getSubject();
>>>>       if (subj.isVariable()) {
>>>>           tpVars.add((Var) subj);
>>>>       }
>>>>       Node pred = this.tp.getPredicate();
>>>>       if (pred.isVariable()) {
>>>>           tpVars.add((Var) pred);
>>>>       }
>>>>       Node obj = this.tp.getObject();
>>>>       if (obj.isVariable()) {
>>>>           tpVars.add((Var) obj);
>>>>       }
>>>> 
>>>>       //...check whether the FILTER expression contains any of the triple 
>>>> pattern’s variable
>>>>       for(Var var:expVars){
>>>>           //…if it does then we have to delete the entire FILTER expression
>>>>           if(tpVars.contains(var)){
>>>>               
>>>> System.out.println("[SQRemoveTripleVisitor::visit(ElementFilter el)] I 
>>>> NEED TO REMOVE THE FILTER!!!!!! ");
>>>> 
>>>>           }
>>>>       }
>>>> 
>>>>   }
>>>> 
>>>> Please, may I ask for any help or idea on how to remove the filter?
>>>> 
>>>> 
>>>> Many Thanks in advance.
>>>> 
>>>> Best Regards,
>>>> Carlo
>>>> 
>>>> 
>>>> -- The Open University is incorporated by Royal Charter (RC 000391), an 
>>>> exempt charity in England & Wales and a charity registered in Scotland (SC 
>>>> 038302). The Open University is authorised and regulated by the Financial 
>>>> Conduct Authority.
>>>> 
>>> 
>> 

Reply via email to