Hello Lorenz, 

Sure no problem. 
I can share it here. In case you have suggest any other place I will do so. 

Please, let me know. 
Many Thanks, 

Best Regards,
Carlo

> On 31 Jan 2016, at 15:07, Lorenz Bühmann <[email protected]> 
> wrote:
> 
> Hello Carlo,
> 
> I'm sure you'll make it, but maybe you should also share the complete code 
> somehow? Maybe this makes it easier for people to help you.
> 
> Lorenz
> 
>> 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
>>> 
>> 
>> 
> -- 
> Lorenz Bühmann
> AKSW group, University of Leipzig
> Group: http://aksw.org - semantic web research center
> 

Reply via email to