The new code generator must therefore define a new metadata value model. A possible approach would be to define metadata item values to be SPARQL expressions. This would work, as SPARQL expressions are capable of mapping a current context of RDF nodes to the output required by context-propagator, -distributor and –atomizer. But the difference between XQuery and SPARQL expressions with regard to simplicity and intuitiveness should be considered. With XQuery, typical annotations are small path expressions, which are easy to write and to understand. Dealing with SPARQL equivalents, this ease of writing and reading will be lost, and it must be questioned if a tree studded with SPARQL expressions will be appreciated as a straightforward way of describing an RDF to XML transformation.
Guided by these considerations, we designed a simple path notation for specifying navigation within an RDF graph in a way which is similar to XPath navigation. This tiny expression language, RPath, reuses the basic concepts of XPath: navigation axes, name tests and predicates. The following listing gives a few examples of RPath expressions and their translation into SPARQL queries.
Example 4. Examples of SPARQL queries generated for RPath expressions.
### ### SPARQL generated for RPATH: ### lib:author ### PREFIX a: <file:///C:/projects/seat/resources-markupuk/markupuk-input.xml#> PREFIX lib: <http://www.example.org/ns/domain/library#> SELECT DISTINCT ?newContext WHERE { ?context lib:author ?newContext . FILTER (?context IN ( a:n1.1.1, a:n1.1.2 )) . # the current context ### ### SPARQL generated for RPATH: ### //lib:book/lib:author ### PREFIX a: <file:///C:/projects/seat/resources-markupuk/markupuk-input.xml#> PREFIX zzz: <http://www.xsdplus.org/ns/internal#> PREFIX lib: <http://www.example.org/ns/domain/library#> SELECT DISTINCT ?newContext WHERE { ?context (!(zzz:NEVER)+)/lib:book ?value1 . ?value1 lib:author ?newContext . FILTER (?context IN ( a:root-elem )) . # the current context ### ### SPARQL generated for RPATH: ### ancestor::lib:books ### PREFIX a: <file:///C:/projects/seat/resources-markupuk/markupuk-input.xml#> PREFIX zzz: <http://www.xsdplus.org/ns/internal#> PREFIX lib: <http://www.example.org/ns/domain/library#> SELECT DISTINCT ?newContext WHERE { ?context ^(!(zzz:NEVER)+) ?newContext . ?newContext ^!(zzz:NEVER)/lib:books ?newContext . FILTER (?context IN ( a:n1.1.1, a:n1.1.2 )) . # the current context
Using RPath one may concisely express graph navigation as it is typical when mapping RDF data to XML. However, RPath does not support advanced requirements. When they surface, SPARQL queries can be used as fallback: the metadata value model allows the use of both, RPath expressions and SPARQL queries.