- From: Adrian <skubella@uni-koblenz.de>
- Date: Mon, 22 Jan 2018 16:21:43 +0100
- To: public-sparql-dev@w3.org
- Message-ID: <810769f9-88d1-b698-eb01-46934b36fd79@uni-koblenz.de>
Hi everyone, I have a question about the semantics of ZeroOrOnePath and ZeroOrMorePath of property paths. What are the correct query results in the following two situations? 1) ZeroOrOnePath Let's consider the following graph G consisting of one triple: <foaf:alice foaf:knows foaf:bob> Now we want to answer the query Q1: SELECT * WHERE {<foaf:chris> <foaf:knows>? ?o} Based on the definition of ZeroOrOnePath with one variable in the W3C recommendation [1] eval(Path(X:term, ZeroOrOnePath(P), Y:var)) = { (Y, yn) | yn = X or {(Y, yn)} in eval(Path(X,P,Y)) } Q1 would return {(?o, <foaf:chris>)} since it is not checked whether <foaf:chris> is contained in G. In contrast to this papers like [2] ZeroOrOnePath are defined in such a way that Q1 would return an empty result set. 2) ZeroOrMorePath Let's assume the following query Q2 over the graph G shown above: SELECT * WHERE {<foaf:chris> <foaf:knows>* ?o} Based on the definition of ZeroOrMorePath with one variable in the W3C recommendation [1], the query Q2 would return {(?o, <foaf:chris>)} even though <foaf:chris> is not element of the graph. (The definitions and a more detailed explanation is at the end of this mail.) According to [2] this query would return an empty result set. Can someone please explain to me, whether a subject not occurring in the graph should be contained in the result sets of ZeroOrOnePath and ZeroOrMorePath or not? Thank you very much for your help. Best regards, Adrian [1]https://www.w3.org/TR/sparql11-query/#PropertyPathPatterns [2]https://users.dcc.uchile.cl/~mromero/papers/ppath.pdf In [1] ZeroOrMorePath with one variable is defined as eval(Path(X:term, ZeroOrMorePath(path), vy:var)) ={ { (vy, n) } | n in ALP(X, path) } and ALP is defined as: ALP(x:term, path) = Let V = empty multiset ALP(x:term, path, V) return is V # V is the set of nodes visited ALP(x:term, path, V:set of RDF terms) = if ( x in V ) return add x to V X = eval(x,path) For n:term in X ALP(n, path, V) End If I understand it correctly in the first iteration of ALP(x:term, path, V:set of RDF terms) x is added to V regardless of whether x is element of the graph or not. Thus, query Q2 would return {(?o, <foaf:chris>)} even though <foaf:chris> is not element of the graph.
Received on Monday, 22 January 2018 15:22:14 UTC