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

Reply via email to