On 28 Sep 2009, at 17:15, Paul Gearon wrote: [snip] >> Naively (ignoring complexity problems), allowing ?p to take any >> value seems to produce more >> interesting use cases, especially in untidy real world data, where >> people might use different >> predicates interchangably, e.g: >> >> SELECT ?s ?ob1 ?ob2 ?p WHERE { >> ?s ?p* ?y . >> FILTER(?p = <:somePredicate> || ?p =<:someSimilarPredicate> ) . >> } > > Filtering is not binding, though it may often appear the have the same > effect (ignoring performance). This is a case that shows the > difference though. > > Does {?s ?p* ?o} bind every individual predicate transitively, or does > it treat all predicates as a group and search through the group > transitively? As an example, consider the following family: > > :fred : hasAncestor :mary > :mary : hasAncestor :anne > :mary :hasSibling :peter > :peter :hasSibling :harry > > If we treat each predicate individually, then we'd get the following > bindings: > ?s ?p ?o > :fred :hasAncestor :mary > :mary :hasAncestor :anne > :fred : hasAncestor :anne <-- new > :mary :hasSibling :peter > :peter :hasSibling :harry > :mary :hasSibling :harry <-- new That depends on the semantics of *, in regex it means "0 or more", so I'd expect to see :fred :hasAncestor :fred :mary :hasAncestor :mary etc. with ?p+ I'd expect to see what you have above. ?p* is useful for RDFS (and OWL?) style transitive properties though, as they have that semantics. > This could be useful for following many predicate chains at once, > though it doesn't offer significantly more functionality than doing a > union between the results of following each predicate individually. > Still, it's useful. > > If we treat the predicates as a group that can be transitive, then we > might see something like the following binding: > > ?s ?p ?o > :fred : hasAncestor :mary > :mary : hasAncestor :anne > :mary :hasSibling :peter > :peter :hasSibling :harry > :fred :hasAncestor :anne <-- new > :mary :hasSibling :harry <-- new > :fred :hasAncestor/:hasSibling :peter <-- new > :fred :hasAncestor/:hasSibling :harry <-- new ?p not taking a single value per row seems at odds with the SPARQL algebra to me. > P.S. in an earlier email I mistyped, and said our transitive > predicates costs Mulgara log(n) when I should have said n.log(n). But > you all knew what I meant, right? :-) Yup :) - Steve -- Steve Harris Garlik Limited, 2 Sheen Road, Richmond, TW9 1AE, UK +44(0)20 8973 2465 http://www.garlik.com/ Registered in England and Wales 535 7233 VAT # 849 0517 11 Registered office: Thames House, Portsmouth Road, Esher, Surrey, KT10 9ADReceived on Tuesday, 29 September 2009 09:53:05 GMT
This archive was generated by hypermail 2.2.0+W3C-0.50 : Thursday, 1 October 2009 14:42:15 GMT