2012-06-03 22 views
6

Ok, sto solo imparando a usare SPARQL per interrogare i dati da dbpedia.org e sto usando dbpedia's http://dbpedia.org/snorql/ per eseguire le mie query. Sto cercando di ottenere un elenco di MusicalArtists basate sulla ricerca per la stessa stringa su tre campi in questo modo:Non riesco a far funzionare questa query SPARQL

SELECT ?subject 
     ?artistRdfsLabel 
     ?artistFoafName 
     ?artistDbpedia2Name 
WHERE { 
    ?subject rdf:type <http://dbpedia.org/ontology/MusicalArtist> . 
    OPTIONAL { ?subject rdfs:label ?artistRdfsLabel . } 
    OPTIONAL { ?subject foaf:name ?artistFoafName . } 
    OPTIONAL { ?subject dbpedia2:name ?artistDbpedia2Name . } 
    FILTER (str(?artistRdfsLabel) = "Stevie Nicks" || 
      str(?artistFoafName) = "Stevie Nicks" || 
      str(?artistDbpedia2Name) = "Stevie Nicks") 
} 
LIMIT 10 

Questo funziona perché "Stevie Nicks" ha tutti e tre campi (rdfs: label, foaf: nome, dbpedia2: nome). Ma quando provo a interrogare un altro MusicalArtist che non ha tutti e tre ("Depeche Mode" per esempio) non ottengo risultati.

Ho provato varie cose come BIND (COALESCE (? Campo, ..., ...) AS? ArtistName) per filtrare da? ArtistName e ho anche provato UNION ma niente sembra funzionare. Qualcuno può segnalare l'errore dei miei modi SPARQL? :)

Grazie! Jason

risposta

7

Ok, mi mancava che "Depeche Mode" non potesse essere selezionato usando un rdf: tipo di http://dbpedia.org/ontology/MusicalArtist. Questo sembra funzionare:

SELECT ?subject 
     ?artistName 
WHERE { 
    { 
    ?subject rdf:type <http://dbpedia.org/ontology/MusicalArtist> . 
    ?subject rdfs:label ?artistName . 
    FILTER (str(?artistName) = "Depeche Mode") 
    } 
    UNION 
    { 
    ?subject rdf:type <http://dbpedia.org/ontology/Band> . 
    ?subject rdfs:label ?artistName . 
    FILTER (str(?artistName) = "Depeche Mode") 
    } 
}