SPARQL 查询的过滤结果

Filtering results of SPARQL queries

我想检索所有 20 世纪意大利小说家的名字。 我写了这个:

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

如何筛选结果?

语言标签是小写的,所以只需将"EN:替换为"en"。此外,我发现以下内容与使用 langMatches

一样有效
 FILTER (lang(?label) = "en")

有几个选项。在这里我推荐两个:

  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
  1. 定义出生范围或寿命范围。出生范围示例:
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年出版的人。