Thank you for your reply Dave.

based on your advice, I'm trying to create a builtin in the form:
isNext(?seq, ?X, ?Y) that returns true if Y is the element right after X in
the rdf:seq seq.


So I extended the BaseBuiltin class and wrote my functions like this :

    @Override
    public boolean bodyCall(Node[] args, int length, RuleContext context) {
        checkArgs(length, context);
        Node seq = getArg(0, args, context);
        Node n1 = getArg(1, args, context);
        Node n2 = getArg(2, args, context);

        return isNext(seq, n1, n2, context);
    }

    /**
     * Return true if element2 is right after element1 in the seq
     */
    protected static boolean isNext(Node node, Node element1, Node
element2, RuleContext context ) {

        Model m = ModelFactory.createDefaultModel();
        RDFNode seq = m.asRDFNode(node);
        RDFNode elt1 = m.asRDFNode(element1);
        RDFNode elt2 = m.asRDFNode(element2);

        if (seq == null || seq.equals(RDF.Nodes.nil)  ||
!seq.canAs(Seq.class) ) {
            m.close();
            return false;
        } else {
            // get indexes of elt1 and elt2
            int i1 = seq.as(Seq.class).indexOf(elt1);
            int i2 = seq.as(Seq.class).indexOf(elt2);
            System.out.println("res: " + i1 + "," + i2);
            if (i2 == (i1+1) && i1>0 && i2>0) {
                m.close();
                return true;
            }
            m.close();
            return false;
        }
    }

but the console shows that i1 = i2 = 0...

I think the problem comes from the conversion between Node and RDFNode but
I'm not really sure about it.


any idea ?

thanks,
Benjamin




On Wed, Feb 15, 2012 at 3:30 PM, Dave Reynolds <[email protected]>wrote:

> On 15/02/12 13:42, benjamin jailly wrote:
>
>> Hello everyone,
>>
>>
>> I'm trying to deal with rdf:seq and Jena Rules.
>> I want to test a condition on the member rdf:_(n) of the seq and do
>> something on the member rdf:_(n+1)
>>
>> I thought I could write something like that:
>>
>> (?seq rdf:_n ?X) (?seq rdf:_(n+1)  ?Y) (?X my:condition
>> 'true'^^xs:boolean)
>> ->  (?Y my:literal 'true'^^xs:boolean)
>>
>
> Nice idea! Sadly we don't support that right now.
>
>
>  I tried to work with rdfs:**ContainerMembershipProperty
>> (?seq ?p ?X) (?p rdf:type rdfs:**ContainerMembershipProperty)
>>
>> but I didn't manage to get the index of the member.
>>
>
>
>  Should I use regex on rdf:_ ?
>>
>
> Maybe, but probably will end up cleaner for you to create a custom builtin
> which can map between the rdf:_ URIs and the sequence number.
>
> Dave
>

Reply via email to