筛选 SPARQL 查询的结果



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

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

如何筛选结果?

有几个选项。在这里,我建议两个:

  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 年出版。

语言标签为小写,因此只需将"EN:替换为 "en" 即可。 另外,我发现以下内容与使用langMatches一样有效

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

最新更新