2012-06-03 3 views
6

Хорошо, я просто изучаю использование SPARQL для запроса данных с dbpedia.org, и я использую dbpedia's http://dbpedia.org/snorql/ для запуска моих запросов. Я пытаюсь получить список MusicalArtists основанные на поиске той же строке через три поля, как так:Не удается получить этот запрос 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 

Это работает, потому что «Стиви Никс» имеет все три поля (ИСС: ярлык, FOAF: имя, dbpedia2: имя). Но когда я пытаюсь запросить другой MusicalArtist, который не имеет всех трех (например, Depeche Mode), я не получаю никаких результатов.

Я пробовал различные вещи, такие как BIND (COALESCE (? Field, ..., ...) AS? ArtistName), чтобы фильтровать? ArtistName, и я также пытался UNION, но ничего не работает. Может ли кто-нибудь указать на ошибку моих методов SPARQL? :)

Спасибо! Jason

ответ

7

Хорошо, мне не хватало, что «Depeche Mode» не может быть выбран с использованием типа rdf: http://dbpedia.org/ontology/MusicalArtist. Это, как представляется, работает:

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