如何对dbp:releaseDate中字符串格式日期的书籍应用SPARQL日期过滤?
处理SPARQL中字符串格式日期的范围过滤
原SPARQL代码仅能检索1999年2月10日至2021年12月31日期间、
dbp:releaseDate为xsd:date格式的战争类书籍,但部分书籍的dbp:releaseDate是字符串格式(如"2006 February"),需要修改代码以覆盖这类情况。
修改后的SPARQL代码
PREFIX dbp: <http://dbpedia.org/property/> PREFIX dbo: <http://dbpedia.org/ontology/> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> SELECT DISTINCT ?bookLabel ?authorLabel ?genreLabel ?originalDate FROM <http://dbpedia.org> WHERE { ?s rdf:type dbo:Book . ?s rdfs:label ?bookLabel . FILTER(LANGMATCHES(LANG(?bookLabel), 'en')) ?s dbo:author ?author . ?author rdfs:label ?authorLabel . FILTER(LANGMATCHES(LANG(?authorLabel), 'en')) OPTIONAL { ?s dbp:country ?country . ?country rdfs:label ?countryLabel . FILTER(LANGMATCHES(LANG(?countryLabel), 'en')) } ?s dbo:literaryGenre ?genre . ?genre rdfs:label ?genreLabel . ?genreLabel bif:contains "'war'" FILTER(LANGMATCHES(LANG(?genreLabel), 'en')) OPTIONAL { ?s dbp:language ?language . ?language rdfs:label ?languageLabel . FILTER(LANGMATCHES(LANG(?languageLabel), 'en')) } # 获取原始日期(支持xsd:date或字符串格式) ?s dbp:releaseDate ?originalDate . # 转换不同格式的日期为标准xsd:date类型 BIND( IF(DATATYPE(?originalDate) = xsd:date, ?originalDate, # 处理"YYYY Month"格式的字符串 IF(REGEX(?originalDate, "^\\d{4} "), STRDT(CONCAT(STRBEFORE(?originalDate, " "), "-", CASE STRAFTER(?originalDate, " ") WHEN "January" THEN "01" WHEN "February" THEN "02" WHEN "March" THEN "03" WHEN "April" THEN "04" WHEN "May" THEN "05" WHEN "June" THEN "06" WHEN "July" THEN "07" WHEN "August" THEN "08" WHEN "September" THEN "09" WHEN "October" THEN "10" WHEN "November" THEN "11" WHEN "December" THEN "12" ELSE "01" END, "-01"), xsd:date), # 处理"Month YYYY"格式的字符串 IF(REGEX(?originalDate, " \\d{4}$"), STRDT(CONCAT(STRAFTER(?originalDate, " "), "-", CASE STRBEFORE(?originalDate, " ") WHEN "January" THEN "01" WHEN "February" THEN "02" WHEN "March" THEN "03" WHEN "April" THEN "04" WHEN "May" THEN "05" WHEN "June" THEN "06" WHEN "July" THEN "07" WHEN "August" THEN "08" WHEN "September" THEN "09" WHEN "October" THEN "10" WHEN "November" THEN "11" WHEN "December" THEN "12" ELSE "01" END, "-01"), xsd:date), # 处理纯年份格式的字符串(如"2010") IF(REGEX(?originalDate, "^\\d{4}$"), STRDT(CONCAT(?originalDate, "-01-01"), xsd:date), NULL) ) ) ) AS ?convertedDate ) # 应用统一的日期范围过滤 FILTER(?convertedDate >= '1999-02-10'^^xsd:date && ?convertedDate <= '2021-12-31'^^xsd:date) }
核心修改说明
- 多格式日期兼容:通过
BIND结合条件判断和正则匹配,将常见的字符串日期格式转换为标准xsd:date类型,确保可以进行统一的范围比较 - 保留原始数据:查询结果返回
?originalDate字段,方便查看每条记录的原始日期格式和内容 - 精简冗余代码:移除原查询中重复的
OPTIONAL查询块,减少不必要的计算开销 - 严格过滤逻辑:转换后的日期使用
xsd:date类型进行范围判断,保证过滤规则和原代码一致
内容的提问来源于stack exchange,提问作者Mohammed Esam
相关产品推荐
相关产品推荐

