2012-06-03 22 views
6

好吧,我只是學習使用SPARQL從dbpedia.org查詢數據,而我正在使用dbpedia的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 

這工作,因爲「Stevie裂口」有三個字段(RDFS:標籤,FOAF:姓名,dbpedia2:名稱)。但是,當我嘗試由另一個音樂藝術家查詢時,並沒有全部三個(例如「Depeche模式」),我沒有得到任何結果。

我嘗試過像BIND(COALESCE(?field,...,...)AS?artistName)這樣的各種東西來過濾?artistName,我也嘗試了UNION,但似乎沒有任何工作。有人能指出我的SPARQL方式的錯誤嗎? :)

謝謝! Jason

回答

7

好吧,我錯過了「Depeche Mode」無法使用rdf:type 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") 
    } 
}