2011-10-29 32 views
18

Tôi có một số gấp ba mà trông như thế này:SPARQL chọn tùy chọn với ngôn ngữ

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

Tôi muốn tạo một truy vấn SPARQL đó mang lại cho tôi những "Non-Language Label" VÀ "Nhãn Pháp", nếu có tồn tại.

Tôi cố gắng này và nó không làm việc:

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

Cảm ơn trước!

Trả lời

21

Tôi không hiểu tại sao bạn cần OPTIONAL ở đây. Truy vấn của Jan không thành công vì không có biến chia sẻ giữa mẫu bên ngoài và tùy chọn, do đó bạn đang cố gắng tính sản phẩm chéo của mỗi nhãn cho test:thing với mọi nhãn không phải là tiếng Pháp test:thing có thể rất lớn và tại sao bộ xử lý truy vấn bị lỗi.

Bạn đơn giản chỉ muốn một cái gì đó như sau, trừ khi tôi đã hiểu lầm câu hỏi của bạn

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

Nếu bạn muốn hai nhãn riêng thì bạn có thể làm điều gì đó như:

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

Bạn đã cho tôi đi đúng hướng !!! Cảm ơn!!! –

4

Cách dễ nhất để kiểm tra ngôn ngữ của chữ là sử dụng hàm lang(). Sử dụng truy vấn này, truy vấn của bạn có thể được viết là:

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 - cảm ơn đã giúp đỡ. Bạn có quyền thêm vào trong logic lọc ở đâu đó, có vẻ là tốt. Truy vấn này chỉ lỗi cho tôi. Tôi nghĩ rằng vấn đề bắt đầu với tôi về cơ bản chọn cùng một dữ liệu hai lần (như? Nhãn và như? PreferredLabel). Tôi muốn có nhãn? Và nhãn ưa thíchLabel trong cùng một bản ghi. Tôi đã bối rối một chút về điều này - dường như đơn giản, nhưng không quá nhiều! Cảm ơn sự giúp đỡ –

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