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