2012-06-03 23 views
6

Okay, ich lerne nur SPARQL, um Daten von dbpedia.org abzufragen, und ich benutze dbpedia http://dbpedia.org/snorql/, um meine Abfragen zu starten. Ich versuche, eine Liste zu bekommen MusicalArtists basierend auf wie so für die gleiche Zeichenfolge über drei Felder suchen:Kann diese SPARQL-Abfrage nicht funktionieren

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 

das funktioniert, weil "Stevie Nicks" alle drei Felder (rdfs: label, foaf: name, dbpedia2: name) hat. Aber wenn ich versuche, einen anderen MusicalArtist abzufragen, der nicht alle drei hat ("Depeche Mode" zum Beispiel), bekomme ich keine Ergebnisse.

Ich habe versucht verschiedene Dinge wie BIND (COALESCE (? Feld, ..., ...) AS? ArtistName) nach? ArtistName zu filtern und ich habe auch UNION versucht, aber nichts scheint zu funktionieren. Kann jemand auf den Fehler meiner SPARQL-Wege hinweisen? :)

Danke! Jason

Antwort

7

Okay, mir fehlte, dass "Depeche Mode" konnte nicht mit einem RDF: Typ von http://dbpedia.org/ontology/MusicalArtist ausgewählt werden. Dies scheint zu funktionieren:

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") 
    } 
} 
Verwandte Themen