2011-10-29 54 views
18

可選我有一些三元看起來像這樣的:SPARQL選擇用語言

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

我想形成一個SPARQL查詢,讓我對「非語言標籤」和「法國標籤」,如果有的話。

我嘗試這樣做,它不工作:

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

提前感謝!

回答

21

我不明白你爲什麼需要OPTIONAL在這裏。 Jan的查詢失敗,因爲在外部模式和可選項之間沒有共享變量,因此您試圖計算每個標籤的交叉乘積test:thing與每個非法語標記爲test:thing,這可能會很大,以及查詢處理器失敗的原因。

你只是想類似下面的,除非我誤解你的問題

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

如果您希望兩個單獨的標籤,那麼你可以這樣做:

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

你讓我走上正軌!謝謝!!! –

4

檢查文字語言的最簡單方法是使用lang()函數。使用這個,你的查詢可以寫成:

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

嗨 - 謝謝您的幫助。你在某個地方添加了過濾邏輯是正確的,這看起來很好。這個查詢只是錯誤,但我。我認爲問題始於我基本選擇兩次相同的數據(如?label和?preferredLabel)。我想在同一個記錄中使用?標籤和?preferredLabel。我對這一點感到困惑 - 看起來很簡單,但還不算太多!感謝您的幫助 –

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