Hello Lorenz, Thank you very much for your help. Some comments follow in line.
> On 31 Jan 2016, at 13:36, Lorenz Bühmann <[email protected]> > wrote: > > Hello Carlo, > > there is usually no link from a child node to its parent in the JENA data > structures. It is very good to confirm it as I don’t spend more time to look for it. I thought that I was missing some JENA data structure and packages. > That means you have to keep track of it when you're processing the parents. > Why not run some "clean up" after each child has been processed? E.g. check > if there is no BGP left and thus mark this current parent as also > "toBeRemoved”. Sure. I have already started doing it by using some boolean variables. Let’s see if I can make it. Otherwise I have to develop a module that transform the Jena Query Expression into a Tree based representation and then apply the triple remove operation. Thank you again for your support and answers. Best Regards, Carlo > > Lorenz > >> and of course, the below is for processing an BGP: >> >> @Override >> public Op transform(OpBGP opBGP) { >> >> System.out.println("[TransformRemoveOp::transform(OpBGP opBGP)] >> opBGPCounter " + opBGPCounter++); >> System.out.println("[TransformRemoveOp::transform(OpBGP opBGP)] " + >> opBGP.toString()); >> System.out.println(""); >> Op newOpBGP = opBGP.copy(); >> BasicPattern newBP = ((OpBGP) newOpBGP).getPattern(); >> List<Triple> tripleList = newBP.getList(); >> >> Iterator<Triple> itr = tripleList.iterator(); >> while (itr.hasNext()) { >> Triple tp = itr.next(); >> if (tp.matches(this.triple)) { >> itr.remove(); >> isParent = true; >> isStarted = true; >> } >> } >> //...it can be empty >> if (((OpBGP) newOpBGP).getPattern().getList().isEmpty()) { >> System.out.println("[TransformRemoveOp::transform(OpBGP opBGP)] >> opBGP is empty " + opBGP.toString()); >> //return subOp; >> } >> return newOpBGP; >> } >> >> >> Many Thanks, >> Carlo. >> >> >>> On 31 Jan 2016, at 04:36, Carlo.Allocca <[email protected]> wrote: >>> >>> Dear Andy, >>> >>> Thank you very much one more time. >>> >>> Please, some comments follow in line. >>> >>> On 30 Jan 2016, at 17:53, Andy Seaborne >>> <[email protected]<mailto:[email protected]>> wrote: >>> >>> On 30/01/16 15:52, Carlo.Allocca wrote: >>> Hello Lorenz, >>> >>> Thank you for your help. >>> >>> It was clear to me that I have to remove from the parent expression and >>> such is that using a patter-based approach >>> make it a bit difficult. I tried three of them and I got to the same >>> results. >>> >>> You need to process the parent, not just the ElementFilter. >>> >>> How can I process the parent? >>> My understanding is: >>> >>> 1. Building the Abstract Query Tree: Op op = Algebra.compile(q); >>> >>> For example, given the query >>> >>> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> >>> PREFIX ex: <http://www.semanticweb.org/dataset1/> >>> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> >>> >>> SELECT DISTINCT ?ind ?boss ?g >>> WHERE >>> { { ?ind rdf:type ?z } >>> UNION >>> { ?boss ex:isBossOf ?ind >>> FILTER ( ?boss = "mathieu" ) >>> } >>> } >>> >>> I obtain >>> >>> (distinct >>> (project (?ind ?boss ?g) >>> (union >>> (bgp (triple ?ind <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> >>> ?z)) >>> (filter (= ?boss "mathieu") >>> (bgp (triple ?boss <http://www.semanticweb.org/dataset1/isBossOf> >>> ?ind)))))) >>> >>> 2) Travere the tree to modify its internal structure. In terms of code, I >>> can write: >>> >>> (A) Transform transform = new TransformRemoveOp(q,tp) ; >>> (B) op = Transformer.transform(transform, op); >>> >>> where TransformRemoveOp implements Transform interface. >>> It seems that there is no link between children and parent that can be >>> used to figure out at which level the process is and modify the Tree >>> structure, accordingly. Please correct me if I am wrong. >>> In fact running it over the above example, I got the following: >>> >>> =========== DURING >>> [TransformRemoveOp::transform(OpBGP opBGP)] opBGPCounter 1 >>> [TransformRemoveOp::transform(OpBGP opBGP)] (bgp (triple ?ind >>> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?z)) >>> >>> >>> [TransformRemoveOp::transform(OpBGP opBGP)] opBGPCounter 2 >>> [TransformRemoveOp::transform(OpBGP opBGP)] (bgp (triple ?boss >>> <http://www.semanticweb.org/dataset1/isBossOf> ?ind)) >>> >>> >>> [TransformRemoveOp::transform(OpBGP opBGP)] opBGP is empty (bgp >>> ) >>> >>> [TransformRemoveOp::transform(OpFilter opFilter, Op subOp)] opFilter >>> (filter (= ?boss "mathieu") >>> (bgp >>> )) >>> >>> [TransformRemoveOp::transform(OpFilter opFilter, Op subOp)] subOp Name bgp >>> >>> [TransformRemoveOp::transform(OpUnion opUnion, Op left, Op right)] left: >>> (bgp (triple ?ind <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?z)) >>> >>> [TransformRemoveOp::transform(OpUnion opUnion, Op left, Op right)] right: >>> (filter (exprlist (= ?boss "mathieu") true) >>> (bgp >>> )) >>> >>> >>> [TransformRemoveOp::transform(OpProject opProject, Op subOp)] (project >>> (?ind ?boss ?g) >>> (union >>> (bgp (triple ?ind <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?z)) >>> (filter (exprlist (= ?boss "mathieu") true) >>> (bgp >>> )))) >>> >>> >>> [TransformRemoveOp::transform(OpDistinct opDistinct, Op subOp)] (distinct >>> (project (?ind ?boss ?g) >>> (union >>> (bgp (triple ?ind <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> >>> ?z)) >>> (filter (exprlist (= ?boss "mathieu") true) >>> (bgp >>> ))))) >>> >>> >>> Moreover, implementing a first version of the OpFilter as reported below: >>> >>> @Override >>> public Op transform(OpFilter opFilter, Op subOp) { >>> System.out.println("[TransformRemoveOp::transform(OpFilter opFilter, >>> Op subOp)] opFilter " + opFilter.toString()); >>> System.out.println("[TransformRemoveOp::transform(OpFilter opFilter, >>> Op subOp)] subOp Name " + subOp.getName()); >>> System.out.println(""); >>> >>> if (isParent == false) { >>> return opFilter; >>> } >>> >>> //...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 >>> Op opNew = opFilter.copy(subOp); >>> Set<Var> expVars = ((OpFilter) opNew).getExprs().getVarsMentioned(); >>> >>> //...check whether the FILTER expression contains any of the triple >>> pattern variable >>> boolean isContained = false; >>> for (Var var : expVars) { >>> //..if it does then we have to delete the entire FILTER >>> expression >>> if (tpVars.contains(var)) { >>> isContained = true; >>> break; >>> } >>> } >>> //... if the filter contains any variable of the triple that has >>> been removed, then.... >>> if (isContained) { >>> Op newOP; >>> Expr e; >>> if (subOp instanceof OpBGP) { >>> if (((OpBGP) subOp).getPattern().getList().isEmpty()) { >>> e = new NodeValueBoolean(true); >>> newOP = OpFilter.filter(e, opFilter);//filter(e, ); >>> return newOP; >>> } else { >>> e = new NodeValueBoolean(false); >>> newOP = OpFilter.filter(e, opFilter);//filter(e, ); >>> return newOP; >>> } >>> } >>> } >>> return opFilter; >>> } >>> >>> It produces the following SPARQL query: >>> >>> SELECT DISTINCT ?ind ?boss ?g >>> WHERE >>> { { ?ind a ?z } >>> UNION >>> { # Empty BGP >>> >>> FILTER ( ?boss = "mathieu" ) >>> FILTER ( true ) >>> } >>> } >>> >>> It seems quite challenging even transform the expression of "?boss = >>> “mathieu” into “true” (as reported above) does not work as It should. >>> >>> If anyone could help me who is more experienced with this kind of task, I >>> would be very very grateful. >>> I would like to see something concrete in sense of line of code as I am >>> using. >>> >>> Many Thanks, >>> Best Regards, >>> Carlo >>> On 30 Jan 2016, at 17:53, Andy Seaborne >>> <[email protected]<mailto:[email protected]>> wrote: >>> >>> element has active parts >>> >>> -- 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. >> >> > -- > Lorenz Bühmann > AKSW group, University of Leipzig > Group: http://aksw.org - semantic web research center >
