- From: Andy Seaborne <andy@apache.org>
- Date: Thu, 21 Aug 2014 19:50:08 +0100
- To: Ruben Verborgh <ruben.verborgh@ugent.be>
- CC: public-sparql-dev@w3.org
On 21/08/14 13:05, Ruben Verborgh wrote: >> -Correct - adjacent triple patterns and ones separated by FILTER merge together. > > And how does it change semantics then? > I.e., what would be the difference between > > SELECT ?title ?price > { ?x ns:price ?p . > ?x ns:discount ?discount > BIND (?p*(1-?discount) AS ?price) > FILTER(?price < 20) > ?x dc:title ?title . > } The process proceeds from beginnign to end of the {}.group BIND ends the BGP being built. That BIND takes the two triple patterns as one BGP: introduces ?price and joins it (project (?title ?price) (filter (< ?price 20) (join (extend ((?price (* ?p (- 1 ?discount)))) (bgp (triple ?x ns:price ?p) (triple ?x ns:discount ?discount) )) (bgp (triple ?x dc:title ?title))))) SELECT ?title ?price { ?x ns:price ?p . ## BGP 1 ?x ns:discount ?discount ## BGP 1 BIND (?p*(1-?discount) AS ?price) FILTER(?price < 20) ?x dc:title ?title . ## BGP 2 } > > and > > SELECT ?title ?price > { ?x ns:price ?p . > ?x ns:discount ?discount > ?x dc:title ?title . > BIND (?p*(1-?discount) AS ?price) > FILTER(?price < 20) > } whereas BIND after all the triple patterns: (project (?title ?price) (filter (< ?price 20) (extend ((?price (* ?p (- 1 ?discount)))) (bgp (triple ?x ns:price ?p) (triple ?x ns:discount ?discount) (triple ?x dc:title ?title) )))) SELECT ?title ?price { ?x ns:price ?p . ## BGP 1 ?x ns:discount ?discount . ## BGP 1 ?x dc:title ?title . ## BGP 1 BIND (?p*(1-?discount) AS ?price) FILTER(?price < 20) } > > or > > SELECT ?title ?price > { ?x ns:price ?p . > OPTIONAL { ?x ns:discount ?discount } > ?x dc:title ?title . > } OPTIONAL is applied to the ns:price, and the result joined to the trailing BGP of one triple pattern (project (?title ?price) (join (leftjoin (bgp (triple ?x ns:price ?p)) (bgp (triple ?x ns:discount ?discount))) (bgp (triple ?x dc:title ?title)))) > > and > > SELECT ?title ?price > { ?x ns:price ?p . > ?x dc:title ?title . > OPTIONAL { ?x ns:discount ?discount } > } here the BGP is 2 triple patterns, forming the fixed side of a leftJoin/OPTIONAL: (project (?title ?price) (leftjoin (bgp (triple ?x ns:price ?p) (triple ?x dc:title ?title) ) (bgp (triple ?x ns:discount ?discount)))) Examples produced by http://www.sparql.org/query-validator.html (Apache Jena). The spec is definitive. http://www.w3.org/TR/sparql11-query/#sparqlQuery and the important parts here are: 18.2.2.2 Collect FILTER Elements 18.2.2.5 Translate Basic Graph Patterns 18.2.2.6 Translate Graph Patterns There are some examples there as well. (sec 18.2.3) > > ? > > Best, > > Ruben >
Received on Thursday, 21 August 2014 18:50:37 UTC