2016-05-28 206 views
0

我想檢索所有20世紀意大利小說家的名字。 我寫這樣的:SPARQL查詢過濾結果

SELECT ?label WHERE{ ?novelist a yago:ItalianNovelists. ?novelist rdfs:label ?label. FILTER (langMatches(lang(?label), "EN")) } ORDER BY ?label

我怎樣才能篩選結果?

+2

什麼使它們成爲「20世紀小說家」?如果這是他們着名作品發表的年份,那麼您將只獲得那些有此類信息的作品。也許根據小說家出生的時間來過濾會更安全。 –

回答

1

有幾種選擇。在這裏我建議二:

  1. 使用模式?novelist dct:subject dbc:20th-century_novelists,如果你可以依靠分類。

    SELECT ?label WHERE{ ?novelist a yago:ItalianNovelists; rdfs:label ?label; dct:subject dbc:20th-century_novelists. FILTER (langMatches(lang(?label), "EN")) }
    ORDER BY ?label

  2. 出生定義範圍或壽命範圍。例如出生範圍:

    SELECT ?label WHERE{ ?novelist a yago:ItalianNovelists; rdfs:label ?label; dbo:birthDate ?date.
    BIND (YEAR(?date) AS ?year) FILTER (langMatches(lang(?label), "EN")) FILTER (?year > 1882 && ?year < 1972) } ORDER BY ?label

對於選項2,你會得到更多的結果,但是這取決於範圍,它們可能包括誰沒有刊登在20世紀什麼小說家。

第三個選項是按發佈年份過濾。但是,我不會推薦它。首先,它只會給那些DBpedia中目前可以獲得這些信息的人提供結果,並且該子集很可能會小於第一個選項中的信息。其次,根據20世紀小說家的定義,查詢結果將省略20世紀寫作小說的人,該小說在21世紀出版。

-2

語言標記爲小寫,因此只需將"EN:替換爲"en"即可。此外,我發現以下效果與使用langMatches

FILTER (lang(?label) = "en") 
+0

語言標籤也適用於大寫字母。 –

+0

langMatches做了一些相當複雜的匹配。例如,langMatches(「en-us」,「EN」)是正確的。直接的平等匹配無法捕捉到這一點。 –