DBpedia查询完整经历20世纪人物的SPARQL语句错误如何修正
错误原因
- 核心问题是选用了
dbp:前缀的属性:dbp:对应DBpedia直接从维基百科抓取的原始属性,其中birthDate等字段的数据类型非常混乱,大量值以纯字符串而非标准xsd:date格式存储。当你用xsd:date类型的字面量和字符串类型的?birthDate做大小比较时,类型不匹配会导致该过滤条件直接失效,只有逝世日期的条件刚好部分匹配生效,因此返回结果不满足出生日期要求。 - 次要问题是FILTER条件放在变量绑定规则之前,虽然SPARQL优化器通常会自动调整执行顺序,但放在属性绑定之后执行逻辑更稳妥,可避免变量未绑定就触发过滤。
修正方案
将所有dbp:前缀的人物属性替换为dbo:前缀的结构化本体属性即可,这类属性是DBpedia官方清洗过的,日期字段统一为xsd:date类型,比较逻辑可以正常生效。修正后的查询语句如下:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX dbo: <http://dbpedia.org/ontology/> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> SELECT ?personName ?birthDate ?deathDate WHERE { ?p rdf:type dbo:Person . ?p dbo:name ?personName . ?p dbo:birthDate ?birthDate . ?p dbo:deathDate ?deathDate . FILTER (?birthDate < "1900-01-01"^^xsd:date AND ?deathDate > "1999-12-31"^^xsd:date) } LIMIT 20
如果需要更符合公历定义的「完整经历20世纪」(20世纪范围为1901年1月1日至2000年12月31日),可以将过滤条件调整为:FILTER (?birthDate <= "1900-12-31"^^xsd:date AND ?deathDate >= "2000-01-01"^^xsd:date)
内容的提问来源于stack exchange,提问作者CoreNoob
相关产品推荐
相关产品推荐

