2014-10-29 12 views
7

Đây có lẽ là gần như giống nhau quetion như: Filter by language only if the object is a literalLọc ngôn ngữ duy nhất nếu loại là chữ

Vấn đề là rằng câu trả lời có không hoạt động trong trường hợp của tôi.

Tôi có truy vấn này:

SELECT ?property ?value 
WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value 
FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology"))} 

Result in Virtuoso

Ở đó bạn sẽ thấy một danh sách các tài sản bao gồm "alexa xếp hạng 2" và "trừu tượng" trong nhiều ngôn ngữ.

Nếu tôi sau đó thử giải pháp gợi ý trong câu hỏi nêu trên:

SELECT ?property ?value 
WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value 
FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology")) 
FILTER(!isLiteral(?value) || langMatches(lang(?value), "EN"))} 

Result in Virtuoso

Bây giờ bạn sẽ thấy rằng chỉ có phiên bản tiếng Anh của "trừu tượng" là có nhưng "alexa xếp hạng 2" và nhiều giá trị không phải chuỗi khác đã biến mất.

Bất kỳ ai biết cách nhận tất cả các thuộc tính như trong truy vấn đầu tiên và sau đó đối với các chữ cái chỉ lọc ra ngôn ngữ tiếng Anh?

Trả lời

9

Truy vấn thứ hai của bạn không lọc ra các literals có thẻ ngôn ngữ khác ngoài tiếng Anh. Trong RDF 1.0, có ba loại literals:

  • literals đơn giản (không có kiểu dữ liệu, và không có thẻ ngôn ngữ)
  • ngôn ngữ đánh dấu chữ (một chuỗi và một thẻ ngôn ngữ)
  • literals datatype (một từ vựng hình thức và một datatype)

vì vậy, đánh giá Alexa, trong đó có một giá trị của 2, một chữ, và nó không có một thẻ ngôn ngữ, vì vậy thẻ ngôn ngữ chắc chắn không phải là "EN" (và quan trọng hơn, d oesn't khớp với"EN"; langMatches thực hiện một số kiểm tra phức tạp hơn). Những gì bạn muốn là lọc ra các ngôn ngữ không được viết bằng tiếng Anh.Điều đó không khó; bạn chỉ cần thêm lang(?value) = "" vào bộ lọc (kể từ khi lang trả về "" cho literals không có thẻ ngôn ngữ):

SELECT ?property ?value 
WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value 
FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology")) 
FILTER(!isLiteral(?value) || lang(?value) = "" || langMatches(lang(?value), "EN"))} 

SPARQL results

Cách để đọc bộ lọc đó là:

Giữ các giá trị mà

  1. không phải là chữ; hoặc
  2. là chữ, nhưng không có thẻ ngôn ngữ; hoặc
  3. là các chữ cái có thẻ ngôn ngữ khớp với "vi".
+0

Cảm ơn! Đến điểm. –

+0

Câu trả lời hay, rõ ràng và dễ hiểu! – user2078148

0

Vì vậy, có vẻ như bạn chỉ muốn đảo ngược điều kiện lọc trên ngôn ngữ phải không?

Trong trường hợp này bạn chỉ cần đảo ngược langMatches cuộc gọi bằng cách thêm một ! trước khi nó có nghĩa là thêm không điều hành với nó:

SELECT ?property ?value 
WHERE { <http://dbpedia.org/resource/Facebook> ?property ?value 
FILTER(STRSTARTS(STR(?property), "http://dbpedia.org/property") || STRSTARTS(STR(?property), "http://dbpedia.org/ontology")) 
FILTER(!isLiteral(?value) || !langMatches(lang(?value), "EN"))} 

Result in DBPedia

Với sự thay đổi này đơn giản các mục tiếng Anh hiện nay loại bỏ và tôi chỉ thấy các mục không phải tiếng Anh.

+0

Tôi nghĩ điều này không đúng. Tôi nghĩ rằng OP muốn giữ tất cả các chữ mà không có thẻ ngôn ngữ, và chỉ giữ những ngôn ngữ được gắn thẻ chữ có ngôn ngữ phù hợp với "vi". –

Các vấn đề liên quan