2012-06-03 20 views
6

Bien, estoy aprendiendo a usar SPARQL para consultar datos de dbpedia.org y estoy usando http://dbpedia.org/snorql/ de dbpedia para ejecutar mis consultas. Estoy tratando de obtener una lista de MusicalArtists basado en la búsqueda de la misma cadena en tres campos de este modo:No se puede hacer que esta consulta SPARQL funcione

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 

Esto funciona porque "Stevie Nicks" tiene los tres campos (rdfs: Label, foaf: nombre, dbpedia2: nombre). Pero cuando trato de consultar por otro MusicalArtist que no tiene los tres ("Depeche Mode" por ejemplo) no obtengo ningún resultado.

He intentado varias cosas como BIND (COALESCE (? Campo, ..., ...) AS? ArtistName) para filtrar por? ArtistName y también probé UNION pero nada parece funcionar. ¿Alguien puede señalar el error de mis formas SPARQL? :)

Gracias! Jason

Respuesta

7

Bien, me faltaba que "Depeche Mode" no se pudo seleccionar con un rdf: tipo de http://dbpedia.org/ontology/MusicalArtist. Esto parece funcionar:

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") 
    } 
} 
Cuestiones relacionadas