在DBpedia端点SPARQL查询中基于指定releaseDate添加过滤条件的方法
改造方案
你可以通过参数绑定+日期过滤的方式完成需求,同时优化了原查询中GROUP BY包含?releaseDate又对该字段做max聚合的逻辑冲突问题,改造后的查询如下:
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> select distinct ?song (replace(?song_label ,"en","","") as ?song_label ) (replace(?album_name_l ,"en","","") as ?album_name_l ) (replace(?artist_l ,"en","","") as ?artist_l ) (max(?releaseDate) as ?releaseDate) (GROUP_CONCAT( distinct ?genre_l;SEPARATOR=",") AS ?genre_l) (GROUP_CONCAT(?recordLabel_l;SEPARATOR=",") AS ?recordLabel_l) where { ?song a dbo:Single . ?song rdfs:label ?song_label. ?song dbo:album ?album_name. ?album_name rdfs:label ?album_name_l. ?song dbo:artist ?artist. ?artist rdfs:label ?artist_l. ?song dbo:genre ?genre. ?genre rdfs:label ?genre_l. ?song dbo:recordLabel ?recordLabel. ?recordLabel rdfs:label ?recordLabel_l. ?song dbo:releaseDate ?releaseDate. FILTER(langMatches(lang(?song_label),"en")). FILTER(langMatches(lang(?album_name_l),"en")). FILTER(langMatches(lang(?artist_l),"en")). FILTER(langMatches(lang(?genre_l),"en")). FILTER(langMatches(lang(?recordLabel_l),"en")). # 参数配置区,直接修改下方两个值即可 BIND( 'Drake' AS ?target_artist) BIND( '2010-01-01'^^xsd:date AS ?min_release_date) FILTER (strstarts(lcase(str(?artist_l)), lcase(str(?target_artist)))) # 日期过滤规则 FILTER (?releaseDate >= ?min_release_date) } # 移除了group by中的?releaseDate,匹配max聚合逻辑 group by ?song ?song_label ?album_name_l ?artist_l
使用说明
- 更换查询艺术家:直接修改
?target_artist对应的字符串即可 - 调整日期过滤阈值:直接修改
?min_release_date对应的日期值即可,无需改动其他逻辑 - 不需要日期过滤时,删除
?min_release_date对应的BIND行和日期FILTER行即可
内容的提问来源于stack exchange,提问作者Enrico Collu
相关产品推荐
相关产品推荐

