2012-09-11 10 views
7

Następujące zapytanie SPARQL nie daje wyników, które chcę, ponieważ są w innych językach niż angielski, niezależnie od filter lang 'en' (patrz filtry w zapytaniu).Filtr SPARQL lang 'en' podaje inne języki

Wyniki zapytania:

"Никола́й Ива́нович Буха́рин"@en "Никола́й Буха́рин"@en "Nikolai Bukharin"@en 
"Gamal Abdel Nasser Hussein"@en  "جمال عبد الناصر"@en "Gamal Abdel Nasser"@en 

Spojrzałem na stronie dbpedia i widziałem, że jest angielska wersja nazwy, ale nie rozumiem, dlaczego filtr nie działa !! !

Czy ktoś może mi w tym pomóc?

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbpedia: <http://dbpedia.org/property/> 
SELECT DISTINCT ?person ?birthname ?nameExact ?label 
where { 

    ?person rdf:type dbpedia-owl:Person . 
    ?person rdfs:label ?label . 
    OPTIONAL { ?person dbpedia-owl:birthName ?birthname . } 
    OPTIONAL { ?person dbpprop:name ?nameExact . } 

    FILTER (lang(?birthname) = 'en') 
    FILTER (lang(?label) = 'en') 
    FILTER (lang(?nameExact) = 'en') 

} 
LIMIT 300 

Odpowiedz

6

Znacznik języka jest adnotacją w bazie danych. Twój filtr działa poprawnie. Niektóre wartości w bazie danych są opatrzone przypisami en, mimo że znajdują się w różnych skryptach. Musisz napisać własną logikę, która wybierze najbardziej odpowiednią właściwość. Prawdopodobnie po prostu użyłbym właściwości rdfs:label i odciąłem wszystko w nawiasach (jak w "Black Hawk (Sauk leader)"@en). Wydaje się, że zapewnia to przyzwoite wyniki.

Należy również pamiętać, że trzeba umieścić FILTER s dla ?birthname i ?nameExactdo odpowiedni OPTIONAL blok, w przeciwnym razie będą one skończyć usuwając wszelkie mecze, które nie mają właściwość opcjonalną.

+0

Dzięki bardzo! – Funmatica

+0

@Funmatica Jeśli ta odpowiedź zadziałała, powinieneś ją [zaakceptować] (http://meta.stackexchange.com/q/5234/225437). –

3

Bądź ostrożny do przedrostków należy użyć tego samego w deklaracji i zapytania (dbo ->dbo, nie dbo ->dbpedia-owl)

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbp: <http://dbpedia.org/property/> 

SELECT DISTINCT ?person ?birthname ?nameExact ?label 
where { 

    ?person rdf:type dbo:Person . 
    ?person rdfs:label ?label . 
    OPTIONAL { ?person dbo:birthName ?birthname . } 
    OPTIONAL { ?person dbp:name ?nameExact . } 

    FILTER (lang(?birthname) = 'en') 
    FILTER (lang(?label) = 'en') 
    FILTER (lang(?nameExact) = 'en') 

} 

LIMIT 300 
Powiązane problemy