W3C home > Mailing lists > Public > public-rdf-dawg@w3.org > April to June 2010

PP paths semantics

From: Birte Glimm <birte.glimm@comlab.ox.ac.uk>
Date: Fri, 28 May 2010 17:44:09 +0100
Message-ID: <AANLkTimTK0C-exvzUz70uFbMEiv90Tykl7yW2Mm-joiA@mail.gmail.com>
To: SPARQL Working Group <public-rdf-dawg@w3.org>, Andy Seaborne <andy.seaborne@talis.com>
Hi Andy, others,
here's a suggestion for defining property paths. Why not define the
semantics of the various constructors in terms of standard SPARQL
operations? As far as I can see there are two constructors that cannot
be expressed by means of standard SPARQL, which are paths between two
nodes of length 0 and paths of arbitrary length, but  greater than
zero. Others you call complex are translated to union queries, which I
thought is legal, but maybe I am wrong.

Let T be a term (variable, IRI, bnode, or literal), iri an IRI, ?x a
variable not occurring elsewhere in the query, n, m natural numbers
(>0). All possibly with subscript, e.g., T_1 is a term too. A basic
property path is iri, ^iri, iri+, iri*, iri{n}, iri{n,m}, iri{n,},
iri{,m}. A property path is defined recursively as follows a basic
property path is a property path. For p, p_1, and p_2 property paths,
p_1/p_2 and ^p are property paths. We define a function simplify that
translates a triple that uses a property path as predicate into a
group graph pattern.

triple                   | simplify(triple)
T_1 iri T_2          | T_1 iri T_2
T_1 ^iri T_2         | T_2 iri T_1
*** T_1 iri+ T_2    | { T_1 iri+ T_2 } ***
T_1 iri* T_2         | { T_1 iri{0} T_2 } UNION { T_1 iri+ T_2 }
*** T_1 iri{0} T_2  | {} FILTER(T1 == T2) <- not working ***
T_1 iri{n} T_2       | { T_1 iri ?x_1 . ?x_1 iri ?x2 . ... ?x_{n-1} iri T_2 }
T_1 iri{n,m} T_2   | { { T_1 iri{n} T_2 } UNION { T_1 iri{n+1} T_2 }
UNION ... { T_1 iri{m} T_2 } }
T_1 iri{n,} T_2      | { { T_1 iri{n} T_2 } UNION { T_1 iri* T_2 } }
T_1 iri{,n} T_2      | { { T_1 iri{0} T_2 } UNION { T_1 iri{1,2} T_2 } }
T_1 p_1/p_2 T_2  | { simplify(T_1 p_1 ?x) . simplify(?x p_2 T_2) }
T_1 ^p T_2          | { simplify(T_2 p T_1) }

(not sure my ascii table will come across nicely formatted...)

The 2 things marked with *** are, if I am not mistaken, not
expressible in standard SPARQL and my attempt of translating T_1
iri{0} T_2 is not working as I understand it because { } leaves T_1
and T_2 unbound if they are variables and that would evaluate to
false, which is not what is intended.

Implementations are of course free to evaluate the expressions as they
feel fit, as long as the results are the same. I am not suggesting you
should actually union all the expanded queries together in T_1
iri{n,m} T_2. This is really just to get the semantics straight. This
would at least only leave two cases to be defined.

Just a suggestion and maybe my use of unions is violating some
constraints that I am not aware of...

Dr. Birte Glimm, Room 306
Computing Laboratory
Parks Road
United Kingdom
+44 (0)1865 283529
Received on Friday, 28 May 2010 16:44:45 UTC

This archive was generated by hypermail 2.3.1 : Wednesday, 7 January 2015 15:01:00 UTC