- From: Andy Seaborne <andy.seaborne@epimorphics.com>
- Date: Fri, 17 Dec 2010 14:19:36 +0000
- To: Axel Polleres <axel.polleres@deri.org>
- CC: SPARQL Working Group <public-rdf-dawg@w3.org>
On 17/12/10 09:53, Axel Polleres wrote:
> Independent from Jorge's remarks on the comments list, I have had another
> question on PropertyPaths, particulary about ZeroLengthPath:
>
>
> Admittedly, find the e.g. the zeroLengthPath operator quite unintiuitive at the moment,
> linking *ALL* nodes with each other...
It does not.
eval(D(G), ZeroLengthPath(vx:var, path, vy:var))) =
{ {(vx, term), (vy, term)} | term in nodes(G) }
card[] = 1
NB: same *term*
Nodes are linked to themselves only by {0}
> that means that e.g.
>
> ?X knows* ?Y
>
> for not only the transitively linked pairs of resources via the knows property,
> ALL pairs of nodes in the graph... Actually, I isn't a more standard way of treating 0-length paths just as
> reflexive, i.e. only linking each node reflexively with itself?
>
> I would at least find this more intuitive and returning less noisy results, i.e. "what I can reach from one node
> in 0 steps is just the node itself" sounds intuitive to me. Am I mistaken here? If yes, why?
> At least, I don't understand why we *need* to return the pairs of all nodes here?
>
> Example:
>
> alice knows bob .
> bob knows charly .
>
> Pattern:
> ?X knows* ?Y
> Result ALL:
Where did these result come from? I see no reason for many of them.
They include the property -
[[
A zero length path matches all subjects and all objects in the graph
]]
excludes IRIs that are only properties
?X foaf:knows* ?Y
==
{ ?X foaf:knows{0} ?Y } UNION { ?X foaf:knows+ ?Y }
{ ?X foaf:knows{0} ?Y }
---------------------------------------------------
| X | Y |
===================================================
| <http://example.org/a> | <http://example.org/a> |
| <http://example.org/b> | <http://example.org/b> |
| <http://example.org/c> | <http://example.org/c> |
---------------------------------------------------
{ ?X foaf:knows+ ?Y }
---------------------------------------------------
| X | Y |
===================================================
| <http://example.org/a> | <http://example.org/b> |
| <http://example.org/a> | <http://example.org/c> |
| <http://example.org/b> | <http://example.org/c> |
---------------------------------------------------
so ?X foaf:knows* ?Y
---------------------------------------------------
| X | Y |
===================================================
| <http://example.org/a> | <http://example.org/a> |
| <http://example.org/a> | <http://example.org/b> |
| <http://example.org/a> | <http://example.org/c> |
| <http://example.org/b> | <http://example.org/b> |
| <http://example.org/b> | <http://example.org/c> |
| <http://example.org/c> | <http://example.org/c> |
---------------------------------------------------
which gets me:
?X ?Y Reason:
-----
a a {0}
a b +
a c +
a k ?? property
b b {0}
b a ?????
b c +
b k ?? property
c c {0}
c a ?????
c b ?????
c k ?? property
k k ?? property
k a ?? property
k b ?? property
b c +
a b + <--- repeat why?
b c + <--- repeat why?
a c + <--- repeat why?
Result REFLEXIVE:
?X ?Y
-----
a a
b b
c c
k k ?? property
a b
b c
a c
>
> (a = alice, b = bob, c = chalry, k = knows)
>
> Can someony explain to me why the reflexive only version of ZeroLengthPath wouldn't work with the rest?
>
> Axel
Received on Friday, 17 December 2010 14:20:14 UTC