我想检索所有20世纪意大利小说家的名字。我写过这个:
SELECT ?label
WHERE{
?novelist a yago:ItalianNovelists.
?novelist rdfs:label ?label.
FILTER (langMatches(lang(?label), "EN"))
}
ORDER BY ?label
如何筛选结果?
有几个选项。在这里,我建议两个:
- 使用模式
?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
- 定义出生范围或寿命范围。出生范围示例:
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")