2012-06-03 10 views
6

Okay, uczę się tylko używać SPARQL do kwerendy danych z dbpedia.org i używam db23's http://dbpedia.org/snorql/ do uruchomienia moich zapytań w. Próbuję uzyskać listę MusicalArtists oparte na poszukiwaniu tego samego łańcucha na trzech polach tak:Nie mogę uzyskać tego zapytania SPARQL do pracy

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 

To działa, ponieważ "Stevie Nicks" ma wszystkie trzy pola (rdfs: etykieta, fOAF: imię, dbpedia2: name). Ale kiedy próbuję zapytać innego MusicalArtist, który nie ma wszystkich trzech ("Depeche Mode" na przykład), nie otrzymuję wyników.

Próbowałem różnych rzeczy, takich jak BIND (COALESCE (? Pole, ..., ...) AS? ArtistName) do filtrowania przez? ArtistName i próbowałem również UNION, ale nic nie działa. Czy ktoś może wskazać błąd moich metod SPARQL? :)

Dzięki! Jason

Odpowiedz

7

Okay, zaginęło, że "Tryb Depeche" nie mógł zostać wybrany za pomocą rdf: type of http://dbpedia.org/ontology/MusicalArtist. To wydaje się działać:

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") 
    } 
} 
Powiązane problemy