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. >> >
