2012-06-03 5 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 

"스티비 닉스는"모든 세 개의 필드 (RDFS : 라벨, FOAF : 이름, dbpedia2 : 이름)을 가지고 있기 때문에이 작동합니다. 그러나 내가 세 가지 (예 : Depeche Mode)가 모두없는 다른 뮤지컬 예술가가 쿼리하려고하면 결과가 없습니다.

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") 
    } 
} 
관련 문제