- From: Seaborne, Andy <andy.seaborne@hp.com>
- Date: Mon, 26 Jun 2006 10:13:26 +0100
- To: Lee Feigenbaum <feigenbl@us.ibm.com>
- CC: dawg mailing list <public-rdf-dawg@w3.org>
Lee Feigenbaum wrote: > Hi DAWGs, > > I've been working through a few cases involving the GRAPH keyword that > weren't immediately obvious to me from the spec. For some of them, I've > included test cases that demonstrate what I believe the semantics to be > (and, in most cases, what SPARQLer seems to do). For one, I have a > question on the appropriate behavior. > > > 1/ Nested GRAPH statements > > I didn't find any examples or tests that involved nested GRAPH statements, > but the spec made it pretty clear what should happen and SPARQLer agrees. > > ng1.n3: > > :s :p :o, :o1 . > > ng2:n3: > > :s :p :o, :o2 . > > query: > > SELECT ?o > FROM NAMED <ng1.n3> > FROM NAMED <ng2.n3> > { > GRAPH <ng1.n3> { > GRAPH <ng2.n3> { > :s :p ?o . > } > } > } > > results: > > ?o/:o > ?o/:o2 > > why? GRAPH takes the given named graph and places it as the default graph > in the RDF dataset against which the inner graph pattern is matched. So, > nested graphs basically act as a stack of default-graph contexts for the > graph patterns that they contain. What were you expecting? GRAPH <ng2.n3> makes ng2:n3 the target graph for the pattern { :s :p ?o }, which gives the results shown. In stack terms, it is a stack of names, the active one being the stack front. There's not merging of graphs ?o/:o ?o/:o2 match from ng2.n3 GRAPH <ng1.n3> { ?a ?b ?c . # Matches on ng1.n3 GRAPH <ng2.n3> { :s :p ?o . # Matches on ng2.n3 } ?d ?e ?f . # Matches on ng1.n3 } > > > 2/ using blank nodes for graph parameter > > As I would expect, blank nodes act like variables when placed as the > parameter to the GRAPH keyword. What I wanted to determine was which blank > node label scope such a blank node would be. > > dg.n3: > > :s :p <wrong.n3> . > > ng1.n3: > > :x :y :z . > > query: > > SELECT * > FROM <dg.n3> > FROM NAMED <ng1.n3> > { > :s :p _:g . > GRAPH _:g { ?s ?p ?o } > } > > results: > > (no results) > > So, _:g is scoped to the graph pattern in which the GraphGraphPattern > occurs (according to SPARQLer's behavior). I sort of assumed this would be > the case, but would argue that it's not clear from the spec. which states > (in 2.5.4) "...the scope of the blank node label being the basic graph > pattern." The _:g parameter to the GRAPH clause isn't actually in any BGP, > so it's unclear from the spec what it's (the label's) scope should be. Fred has suggested a syntax change that would remove blank nodes from the graph name slot of GRAPH. I agree that this would be a good change. [25] GraphGraphPattern ::= 'GRAPH' VarOrBlankNodeOrIRIref GroupGraphPattern becomes [25] GraphGraphPattern ::= 'GRAPH' VarOrIRIref GroupGraphPattern and [43] VarOrBlankNodeOrIRIref ::= Var | BlankNode | IRIref can be dropped. Under no interpretation of blank nodes that has been suggested can a blank node match in "GRAPH _:a" because the RDF dataset is not a value to be matched. > > 3/ variable as parameter to GRAPH which matches a bnode > > dg.n3: > > :s :p _:b . > > ng1.n3: > > :x :y :z: > > query: > > SELECT * > FROM <dg.n3> > FROM NAMED <ng1.n3> > { > :s :p ?g . > GRAPH ?g { ?s ?p ?o } > } > > results: > > I'd expect no results. ?g binds to a bnode and there's no entry in the > named grpah part of the RDF dataset whose first component is a bnode. > SPARQLer reacts rather strangely, giving me an empty result (not an empty > solution set -- no exception and no XML document or JSON structure > whatsoever). I think that the intended semantics are clear here, so just a > heads-up that SPARQLer behaves strangely in this case. Bug - it was over zealous in the internal consistency checking aka an exception :-) Now returns an empty result set - fixed in ARQ CVS. Andy > > Lee > >
Received on Monday, 26 June 2006 09:13:39 UTC