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
>