2014-02-10 12 views
5

我已經寫了下面的查詢語言:過濾器僅如果對象是一個文字

SELECT DISTINCT 
    ?predicate 
    ?object 
    ?label 
WHERE { 
    VALUES  ?subject  { <http://dbpedia.org/resource/Hercules_(1997_film)> } 
    ?subject  ?predicate ?object . 
    ?predicate rdfs:label ?label . 
    FILTER(langMatches(lang(?object), "EN")) 
} 
LIMIT 100 

當我寫FILTER線這種方式,我已經基本上過濾掉所有的非文本(側問題:是文字,可以有一個語言標籤的唯一類型

所以,我怎麼把所有我的結果,並篩選出非英語文字只?

回答

4

您可以使用isLiteral function將語言限制僅應用於文字對象。

X意味着Ÿ可以用SPARQL運營商!X ||表示Ÿ,所以你可以寫你的查詢是這樣的:

SELECT DISTINCT 
    ?predicate 
    ?object 
    ?label 
WHERE { 
    VALUES  ?subject  { <http://dbpedia.org/resource/Hercules_(1997_film)> } 
    ?subject  ?predicate ?object . 
    ?predicate rdfs:label ?label . 
    FILTER(!isLiteral(?object) || langMatches(lang(?object), "EN")) 
} 
LIMIT 100 

至於你的第二個問題,description for language tags from the RDF concepts and abstracts只提到語言標記顯示爲平凡文字的一部分。同樣,grammar in the SPARQL 1.1 specification僅在RDFLiteral production中使用​​作爲排他替代,而不是數據類型IRI。

+0

一般來說,這是有效的,儘管我最終添加了第二行「FILTER」:一行屬於'?object',另一行屬於'?label'。 – Kristian

+1

@Kristian:您可能想要考慮['OPTIONAL'關鍵字](http://www.w3.org/TR/sparql11-query/#OptionalMatching)檢查與標籤相關的任何內容,就像在某些數據集中一樣,而不是所有資源都有一個標籤。 –

+0

我會的,謝謝你的建議 – Kristian