- From: Steve Harris <steve.harris@garlik.com>
- Date: Wed, 16 Feb 2011 10:16:07 +0000
- To: Olivier Rossel <datao@datao.net>
- Cc: Semantic Web <semantic-web@w3.org>
Which one is optimal will depend on which RDF store you're using. There is a wide variety of different optimisation algorithms.
A third way to write the query is:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX onto: <http://dbpedia.org/ontology/>
PREFIX yago: <http://dbpedia.org/class/yago/>
SELECT DISTINCT ?uri ?string
WHERE
{
?uri rdf:type ?type .
FILTER(?type = onto:President || ?type = yago:President)
?uri onto:birthDate ?date .
FILTER regex(?date, "^1945") .
?uri rdfs:label ?string .
FILTER (lang(?string) = "en")
}
This third one is likely to be optimal in 4store, and Jena/Joseki for example.
Also, note that the OPTIONAL doesn't actually do anything in your examples below - as you have a FILTER on the value, outside of the OPTIONAL block, any solution where the OPTIONAL doesn't bind will be rejected by the FILTER.
You can write:
OPTIONAL { ?uri rdfs:label ?string . FILTER (lang(?string) = "en") }
Which will only bind @en strings to ?string, but not reject solutions where there is no rdfs:label, if that's what you want.
- Steve
On 2011-02-16, at 09:52, Olivier Rossel wrote:
> On Wed, Feb 16, 2011 at 10:49 AM, Olivier Rossel <datao@datao.net> wrote:
>> In DBPedia, I want to get a list of presidents born in 1945.
>> A president is either a "onto:President" or a "yago:President".
>> So a UNION is needed to manage both.
>>
>> One way to write the corresponding SPARQL query is :
>>
>> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
>> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>> PREFIX onto: <http://dbpedia.org/ontology/>
>> PREFIX yago: <http://dbpedia.org/class/yago/>
>> SELECT DISTINCT ?uri ?string
>> WHERE
>> {
>> {
>> ?uri rdf:type onto:President .
>> ?uri onto:birthDate ?date .
>> FILTER regex(?date, "^1945") .
>> OPTIONAL {?uri rdfs:label ?string .}
>> FILTER (lang(?string) = "en")
>> }
>> UNION
>> {
>> ?uri rdf:type yago:President.
>> ?uri onto:birthDate ?date .
>> FILTER regex(?date, "^1945") .
>> OPTIONAL {?uri rdfs:label ?string .}
>> FILTER (lang(?string) = "en")
>> }
>> }
>>
>> Another way is :
>>
>> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
>> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>> PREFIX onto: <http://dbpedia.org/ontology/>
>> PREFIX yago: <http://dbpedia.org/class/yago/>
>> SELECT DISTINCT ?uri ?string
>> WHERE
>> {
>> {{
>> ?uri rdf:type onto:President .
>>
>> }
>> UNION
>> {
>> ?uri rdf:type yago:President.
>>
>> }}.
>> ?uri onto:birthDate ?date .
>> FILTER regex(?date, "^1945") .
>> OPTIONAL {?uri rdfs:label ?string .}
>> FILTER (lang(?string) = "en")
>> }
>>
>
> (Oops, I sent the mail a bit too fast :)
> So:
> Which syntax is considered to be optimal?
> Are there some best practices when using UNIONs?
>
> Any help is welcome.
>
> Olivier Rossel
> --
> Datao.net
>
--
Steve Harris, CTO, Garlik Limited
1-3 Halford Road, Richmond, TW10 6AW, UK
+44 20 8439 8203 http://www.garlik.com/
Registered in England and Wales 535 7233 VAT # 849 0517 11
Registered office: Thames House, Portsmouth Road, Esher, Surrey, KT10 9AD
Received on Wednesday, 16 February 2011 10:16:45 UTC