Dear Andy and All, I tried to use as many suggested info as I could. As result, I obtained the following:
I am implementing a public class RemoveOpTransform implements ElementTransform. And, again It is quite straightforward to remove the triple pattern from the ElementPathBlock @Override public Element transform(ElementPathBlock eltPB) { System.out.println("[RemoveOpTransform::transform(ElementPathBlock arg0)] " + eltPB.toString()); Iterator<TriplePath> l = eltPB.patternElts(); while (l.hasNext()) { TriplePath tp = l.next(); if (tp.asTriple().matches(this.triple)) { l.remove(); System.out.println("[RemoveOpTransform::transform(ElementPathBlock arg0)] TRIPLE MAP JUST REMOVED!!! "); System.out.println(""); return this.transform(eltPB);//eltPB; } } return eltPB; } But I could not figure out how to remove the associated FILTER when transform(ElementFilter arg0, Expr arg1) as below @Override public Element transform(ElementFilter arg0, Expr arg1) { //...get the variables of the triple pattern that we want to delete Set<Var> tpVars = new HashSet(); Node subj = this.triple.getSubject(); if (subj.isVariable()) { tpVars.add((Var) subj); } Node pred = this.triple.getPredicate(); if (pred.isVariable()) { tpVars.add((Var) pred); } Node obj = this.triple.getObject(); if (obj.isVariable()) { tpVars.add((Var) obj); } //...get the variables of the FILTER expression Set<Var> expVars = arg1.getVarsMentioned(); //...check whether the FILTER expression contains any of the triple pattern 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 arg0)] FILTER TO BE REMOVED!!!HOW? "); System.out.println(""); } } return arg0; } It appears to me that I am at the same point of the previous approach. What am I doing wrong or missing? Or what I should ready to figure it out? Thank you very much for your kind help and support. Best Regards, Carlo > On 29 Jan 2016, at 10:32, Andy Seaborne <a...@apache.org> wrote: > > You'll still have to clean up structures. SPIN for this is encoding the > query in RDF but the rewriting of that structure needs the same (in the > abstract) processing. You may be able to do it with a series of SPARQL > Updates (that's speculation). > > Andy > > On 29/01/16 00:26, Carlo.Allocca wrote: >> 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 <marty...@graphity.org> 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 <carlo.allo...@open.ac.uk> >>> 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 <a...@apache.org> 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. >>>>>> >>>>> >>>> >> >