2011-10-29 17 views
18

Mam kilka trójek, które wyglądają tak:SPARQL wybrać opcjonalnie z języka

test:thing rdfs:label "Non-Language Label" 
test:thing rdfs:label "English Label"@en 
test:thing rdfs:label "French Label"@fr 

Chciałbym tworzą sparql kwerendę, która daje mi „Wytwórnia Non-Language” i „francuski Label” jeśli taki istnieje.

próbowałem tego i to nie działa:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label ?preferredLabel 
WHERE { 
    test:thing rdfs:label ?label 
    OPTIONAL { 
    test:thing rdfs:label ?preferredLabel . 
    FILTER (regex(str(?preferredLabel), '(^|\\\\W)fr', 'i')) 
    } 
} 

Dzięki z góry!

Odpowiedz

21

nie widzę dlaczego trzeba OPTIONAL tutaj w ogóle. Zapytanie Jana kończy się niepowodzeniem, ponieważ nie istnieje żadna wspólna zmienna między zewnętrznym wzorcem a opcjonalnym, więc próbujesz obliczyć iloczyn krzyżowy każdej etykiety dla test:thing z każdą nie/francuską etykietą oznaczoną test:thing, która może być ogromna i dlaczego procesor kwerendy nie działa.

po prostu chcesz coś jak poniżej, chyba że ja źle pytanie

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label 
WHERE 
{ 
    test:thing rdfs:label ?label 
    FILTER(LANG(?label) = "" || LANGMATCHES(LANG(?label), "fr")) 
} 

Jeśli chcesz dwie etykiety oddzielnie to można zrobić coś takiego:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label ?preferredLabel 
WHERE 
{ 
    { 
    test:thing rdfs:label ?label . FILTER(LANG(?label) = "") 
    } 
    UNION 
    { 
    test:thing rdfs:label ?preferredLabel . FILTER(LANGMATCHES(LANG(?label), "fr")) 
    } 
} 
+0

Masz mnie na dobrej drodze !!! Dzięki!!! –

4

Najprostszym sposobem sprawdzenia języka literałów jest użycie funkcji lang(). Korzystanie z tego, zapytanie może być zapisany jako:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX test: <http://test#> 
SELECT ?label ?preferredLabel 
WHERE { 
    test:thing rdfs:label ?label 
    OPTIONAL { 
    test:thing rdfs:label ?preferredLabel . 
    FILTER (lang(?preferredLabel) = "" || lang(?preferredLabel) = "fr") 
    } 
} 
+0

Hi - dzięki za pomoc. Masz rację dodając gdzieś logikę filtrowania, która wygląda dobrze. To zapytanie jest po prostu dla mnie błędne. Myślę, że problem zaczyna się od mnie, wybierając dwa razy te same dane (jak? Etykieta i? Preferowana etykieta). Chciałbym, aby etykieta? I? PreferredLabel znajdowały się w tym samym rekordzie. Zaskoczyło mnie to trochę - na pozór proste, ale nie tak bardzo! Dzięki za pomoc –

2
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?uri ?label ?preferredLabel 
WHERE 
{ 
    { 
    ?uri rdfs:label ?label . FILTER(LANG(?label) = "" && regex(str(?label), '(^|\\\\W)fr', 'i')) 
    } 
    UNION 
    { 
    ?uri rdfs:label ?preferredLabel . FILTER(LANG(?preferredLabel) = "fr" && regex(str(?preferredLabel), '(^|\\\\W)fr', 'i')) 
    } 
}