log:outputString ordering challenge

Scenario: use log:outputString to display some properties of the
members of an rdf:Seq container, in order.

Challenge: Yosi came up with the four statements in the rule below
that successfully produce a sort key from the rdf:_n properties.
Is there a shorter way?

(The "properties of the members" in this test data are trivial;
this is greatly simplified from a real case where the members
are nodes with multiple properties and the rule extracts some
of those properties for display.)

% cat memberorder.n3
@prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:   <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd:    <http://www.w3.org/2001/XMLSchema#> .

@prefix log:    <http://www.w3.org/2000/10/swap/log#> .
@prefix str:    <http://www.w3.org/2000/10/swap/string#> .

[ a rdf:Seq;
  rdf:_1 "one\n";
  rdf:_2 "two\n";
  rdf:_3 "three\n";
  rdf:_4 "four\n";
  rdf:_5 "five\n";
  rdf:_6 "six\n";
  rdf:_7 "seven\n";
  rdf:_8 "eight\n";
  rdf:_9 "nine\n";
  rdf:_10 "ten\n";
  rdf:_11 "eleven\n";
  rdf:_12 "twelve\n";
  rdf:_13 "thirteen\n";
] .

rdf:_1 a rdfs:ContainerMembershipProperty .
rdf:_2 a rdfs:ContainerMembershipProperty .
rdf:_3 a rdfs:ContainerMembershipProperty .
rdf:_4 a rdfs:ContainerMembershipProperty .
rdf:_5 a rdfs:ContainerMembershipProperty .
rdf:_6 a rdfs:ContainerMembershipProperty .
rdf:_7 a rdfs:ContainerMembershipProperty .
rdf:_8 a rdfs:ContainerMembershipProperty .
rdf:_9 a rdfs:ContainerMembershipProperty .

rdf:_10 a rdfs:ContainerMembershipProperty .
rdf:_11 a rdfs:ContainerMembershipProperty .
rdf:_12 a rdfs:ContainerMembershipProperty .
rdf:_13 a rdfs:ContainerMembershipProperty .

{
  ?s ?p ?v .
  ?p a rdfs:ContainerMembershipProperty .

  # the next four statements construct a key ?k that will sort
  # the same way numerically and lexographically.  Thanks
  # to Yosi Scharf for assistance working this out.
  ?p log:uri ?u.
  (?u ".*?([0-9]*)$") str:scrape ?li .
  (?li xsd:integer) log:dtlit ?n .
  ("%020i" ?n) str:format ?k .
}
log:implies
{
  ?k log:outputString ?v .
}.
% cwm memberorder.n3 --rules -strings
one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve
thirteen
%

Received on Thursday, 6 July 2006 16:03:25 UTC