我想检索所有20世纪意大利小说家的名字。 我写这样的:SPARQL查询过滤结果
SELECT ?label WHERE{ ?novelist a yago:ItalianNovelists. ?novelist rdfs:label ?label. FILTER (langMatches(lang(?label), "EN")) } ORDER BY ?label
我怎样才能筛选结果?
我想检索所有20世纪意大利小说家的名字。 我写这样的:SPARQL查询过滤结果
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")
语言标签也适用于大写字母。 –
langMatches做了一些相当复杂的匹配。例如,langMatches(“en-us”,“EN”)是正确的。直接的平等匹配无法捕捉到这一点。 –
什么使它们成为“20世纪小说家”?如果这是他们着名作品发表的年份,那么您将只获得那些有此类信息的作品。也许根据小说家出生的时间来过滤会更安全。 –