- From: Andy Seaborne <andy.seaborne@epimorphics.com>
- Date: Fri, 02 Mar 2012 13:59:42 +0000
- To: SPARQL Working Group <public-rdf-dawg@w3.org>
This message gives the general outline of changes for property paths - it's not detail-complete. The next step should be tests for nasty corner cases. == Defining *, +, {*} and {+} The algebra operator will be: ZeroOrMorePath1 OneOrMorePath1 ZeroOrMorePathN OneOrMorePathN The current * and + become {*} and {+} which use 1 ALP(x:term, path, R:multiset of RDF terms , V:set of RDF terms) = 2 if ( x in V ) return 3 add x to V 4 add x to R 5 X = eval(x,path) 6 For n:term in X 7 ALP(n, path, R, V) 8 End 9 remove x from V V is the set of nodes considered visited. A node is added to V on entry and removed on exit. So V is the set of nodes in the current path, not the set of nodes visited through the recursive application of ALP. Simply removing line 9 changes the function to track all nodes visited. You don't need R and V then, so remove V and line 3: 1 ALP1(x:term, path, R:set of RDF terms) = 2 if ( x in R ) return 3 add x to R 4 X = eval(x,path) 5 For n:term in X 6 ALP1(n, path, R) 7 End The entry step to ALP1 for OneOrMorePath1 needs aligning. The nodes recorded are just those the subpath ends on. So if the subpath is :p/:q then the overall path can loop back through the gap between a :p and :q. This makes sense to me - its working over a (non-RDF) graph induced by only considering :p/:q as links. == Spec'ing DISTINCT(path) The spec'ing issue is whether defining DISTINCT(path) in terms of a SELECT DISTINCT sub-query is sufficient or should we explain what distinct'ness means for each of the graph operators and provide an algorithm for each. Some operators are naturally distinct anyway (e.g. a reverse path something distinct is distinct). The non-fundamental path operators are: X ^path Y X path1 / path2 Y X path1 | path2 Y X path{n} Y X path{n,m} Y X path{n,} Y X path{0,} Y X path{,n} Y The way to define as a re-write is e.g. ?x :p/DISTINCT(path)/:q ?y ==> ?x :p ?_v1 . SELECT DISTINCT ?_v1 ?_v2 { ?_v1 path ?_v2 } ?_v2 :q ?y . This could even be done for * and + based on {*} and {+} but I think spelling out an algorithm is much more helpful. The alternative is a table defining DISTINCT(path) for path operator. Andy
Received on Friday, 2 March 2012 14:00:13 UTC