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.

Reply via email to