- From: Steve Harris <steve.harris@garlik.com>
- Date: Fri, 3 Aug 2012 10:24:27 +0100
- To: James Rothering <jr@jamesrothering.com>
- Cc: semantic-web@w3.org
On 2 Aug 2012, at 21:54, James Rothering wrote: > Is is possible to implement an inheritance hierarchy in a SPARQL query? > In other words, is it possible to select all from a parent type, but > overriding from a child type wherever an entry exists? > > I.e., given this data: > ex:parent001 rdf:type ex:"Parent" > ex:widgetName ex:"test" > ex:hasChild ex:"child001" > > ex:child001 ex:widgetName ex:"over-ridden widget". > > Can I craft a select {?s ?p ?o} that will leave out the link between > parent and child, yet return the over-ridden values of the predicates? > i.e., that will return: > ex:parent001 rdf:type ex:"Parent" > ex:widgetName ex:"over-ridden widget". You can do this with COALESCE in SPARQL 1.1: SELECT ?id COALESCE(?tChild, ?t) AS ?type) ?type (COALESCE(?nChild, ?n) AS ?name) WHERE { ?id rdf:type ?t . OPTIONAL { ?id ex:hasChild _:c1 . _:c1 rdf:type ?tChild . } ?id ex:widgetName ?n . OPTIONAL { ?id ex:hasChild _:c2 . _:c2 ex:widgetName ?nChild . } } This is binding the immediate values, and also binding the child values (where they exist) then returning the child values in preference to the parent ones. You will get: ?id ?type ?name ex:parent001 ex:Parent "test" ex:child001 ex:Parent "over-ridden widget" The OPTIONAL bits can be written more elegantly like OPTIONAL { ?id ex:hasChild/rdf:type ?tChild } if the store supports property paths. - Steve -- Steve Harris, CTO Garlik, a part of Experian 1-3 Halford Road, Richmond, TW10 6AW, UK +44 20 8439 8203 http://www.garlik.com/ Registered in England and Wales 653331 VAT # 887 1335 93 Registered office: Landmark House, Experian Way, NG2 Business Park, Nottingham, Nottinghamshire, England NG80 1ZZ
Received on Friday, 3 August 2012 09:24:52 UTC