ok, this is resolved if I write my rule this way: (?Z ?m ?X) (?Z ?n ?Y) (?n rdf:type rdfs:ContainerMembershipProperty) (?m rdf:type rdfs:ContainerMembershipProperty) (?Z rdf:type rdf:Seq) (?X my:condition 'true'^^xs:boolean) isNext(?Z, ?Y, ?X) -> (?Y my:parameter 'true'^^xs:boolean)
I had to specify that ?m and ?n are different properties of type rdfs:ContainerMembershipProperty. Now I am able to get the rdf:_(n) by parsing context.getEnv()and compare values of n for different member of the seq Thank you for your help. Benjamin On Thu, Feb 16, 2012 at 11:02 AM, benjamin jailly <[email protected] > wrote: > I figured that the builtin isNext(?seq, ?X, ?Y) I'm creating is called > only if X = Y. weird... > In my test, my rdf:seq has 3 members. If I try to see what is inside the > Environment: > > System.out.println("Context env: " + context.getEnv().toString()); > > I obtain in the console: > > -5824a9a0:135858b0e5e:-7ffe rdf:_1 http://example.com/resA > http://example.com/resA > -5824a9a0:135858b0e5e:-7ffe rdf:_2 http://example.com/resB > http://example.com/resB > -5824a9a0:135858b0e5e:-7ffe rdf:_3 http://example.com/resC > http://example.com/resC > > where I guess -5824a9a0:135858b0e5e:-7ffe is my rdf:seq. > > Is it a normal behaviour ? > > Benjamin > > > On Thu, Feb 16, 2012 at 9:05 AM, Dave Reynolds > <[email protected]>wrote: > >> On 15/02/12 17:29, benjamin jailly wrote: >> >>> 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); >>> >> >> Creating a new model for each call to the builtin is a little expensive, >> better to just work at the Node level. >> >> 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 <http://seq.as>(Seq.class).**indexOf(elt1); >>> int i2 = seq.as <http://seq.as>(Seq.class).**indexOf(elt2); >>> >>> System.out.println("res: " + i1 + "," + i2); >>> >> >> That won't work because the new empty model in which those RDFNodes sits >> has no statements in it to support the indexOf operations. >> >> It would be better to do the test by extracting the sequence number from >> the URI of the Nodes. >> >> [Note that one of the many complications with Seq is that the sequence >> numbers need not be contiguous. That doesn't affect your builtin and might >> not affect your rules if you have control over the data but if you are >> expecting to process data "from the wild" then it will be something to bear >> in mind.] >> >> Dave >> > >
