2012-06-03 22 views
6

Tamam, sadece dbpedia.org'dan veri sorgulamak için SPARQL kullanmayı öğreniyorum ve sorgularımı çalıştırmak için dbpedia'nın http://dbpedia.org/snorql/ kullanıyorum. Bir liste almaya çalışıyorum şöyle üç alanda üzerinde aynı dize aramasının dayalı MusicalArtists:Çalışmak için bu SPARQL sorgusu alınamıyor

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 Nicks" her üç alanlar (RDFS: etiketi, foaf: adı, dbpedia2: ad) sahip olmasıdır çalışır. Ama ben her üç ("Depeche Mode") olmayan başka bir MusicalArtist tarafından sorgulamaya çalıştığımda hiçbir sonuç alamıyorum.

BIND (COALESCE (? Alan, ..., ...) AS? ArtistName) gibi çeşitli şeyleri? ArtistName tarafından filtrelemek için denedim ve ayrıca UNION denedim ama hiçbir şey işe yaramıyor gibi görünüyor. Birisi SPARQL yöntemlerinin hatalarına işaret edebilir mi? :)

Teşekkürler! Jason

cevap

7

Tamam, "Depeche Mode" öğesinin rdf: http://dbpedia.org/ontology/MusicalArtist türüyle seçilemediği eksik. Bu, şu şekilde görünüyor:

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