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