[oslc-core] Representing the order of triples in a query response that uses oslc.orderBy
Arthur Ryman
ryman at ca.ibm.com
Thu Dec 8 09:49:15 EST 2011
Some implementers have reported a gap in the Core spec. This note
summarizes the gap and proposes a solution.
Problem Statement
The main design point of OSLC Simple Query is that it always returns a
subset of the triples about the resources hosted by a service. The
semantics of a query is that it is a filter on the set of all triples.
This means that no triples are altered and that no triples are added.
Triples can be deleted though - that is the whole purpose of a filter.
These sematics have the advantage that a client knows it is always dealing
with a subset of the triples. It can display them, copy them, etc.
However, it is also useful to impose an ordering on the results even
though this goes beyond what is explicitly represented as triples in the
service. The ordering depends on the query and is therefore changes with
the query, i.e. it is not instinsic to the triples. There are two cases
where Query supports this:
1. Full text search. oslc.searchTerms lets you specify search terms and
the results are returned in ranked order. To communicate the ranking, we
introduced the "pseudo-property" oslc.score. So in fact we are adding
triples, but these are clearly distinguishable from the service's triples.
2. Sorting. oslc.orderBy lets you sort the results by one or more keys.
In an XML world, the results are ordered. However, in an RDF world, the
results are triples and they are unordered. Nevertheless, ordering is
still useful when it comes to large results and paging. The service is
required to split the results into pages such that the results on page 1
are ordered ahead of the results on pages 2, 3, ... , the results on page
2 are ordered ahead of page 3, 4, ..., etc. So the relative order is
preserved in pages, but the order in a page is not preserved.
The rationale for not representing the order within a page was that the
client issued the query with the oslc.orderBy clause and therefore knows
the desired ordering. It can therefore resort the results when it needs to
display or process them.
Implementers are now providing feedback that requiring the client to
re-sort the results is a burden, especially on under-powered clients such
as web browsers. The following is a proposal for returning the order.
Proposed Solution
The Core spec defines an oslc:ResponseInfo resource type which is used to
convey paging information. We can therefore use this resource to also
convey the ordering of the resources on the current page. RDF defines the
rdf:Seq resource class to represent ordered sets, and the infinite set of
membership properties, rdf:_1, rdf:_2, etc. to represent the position of a
member within an ordered set. We can therefore introduce a new, optional,
OSLC Core property, oslc:orderedResults and include it in the
ResponseInfo. e.g.
<http://example.org/query?...&oslc.orderBy=dcterms:identifier> a
oslc:ResponseInfo ;
oslc:orderedResults [
a rdf:Seq;
rdf:_1 <resource-1> ;
rdf:_2 <resource-2> ;
etc.
]
To find the sorted order match on a graph pattern:
?query a oslc:ResponseInfo ;
oslc:orderedResults ?seq
This gives ?seq as the rdf:Seq resource that contains the order of the
results.
Regards,
___________________________________________________________________________
Arthur Ryman
DE, PPM & Reporting Chief Architect
IBM Software, Rational
Toronto Lab | +1-905-413-3077 (office) | +1-416-939-5063 (mobile)
More information about the Oslc-Core
mailing list