如何用SPARQL按年份统计特定时间段内的存续实体数量
用SPARQL统计指定年份范围内每年存续的实体数量
问题背景
要统计某一特定年份范围内(比如1950-2000年),每年在世的诺贝尔物理学奖得主人数,已知单一年份的SPARQL查询方法,但需要实现批量获取每一年的统计结果,且希望仅通过SPARQL完成,不依赖外部程序处理。
单一年份(如1950年)的查询语句如下:
SELECT (COUNT (DISTINCT ?nobel) AS ?count) WHERE { ?nobel wdt:P166 wd:Q38104. ?nobel wdt:P569 ?birthdate OPTIONAL{?nobel wdt:P570 ?deathdate.} FILTER(YEAR(?birthdate) <= 1950 && YEAR(?deathdate) >= 1950) }
解决方案
要实现批量统计,核心是先生成目标年份范围内的所有年份值,再将每个年份与符合“当年在世”条件的实体关联统计。以下是完整的SPARQL查询语句:
SELECT ?year (COUNT(DISTINCT ?nobel) AS ?livingCount) WHERE { # 生成1950到2000年的年份序列 VALUES ?year { 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 } # 获取诺贝尔物理学奖得主及其生卒年 ?nobel wdt:P166 wd:Q38104. ?nobel wdt:P569 ?birthdate. OPTIONAL { ?nobel wdt:P570 ?deathdate. } # 过滤当年在世的得主:出生年份≤当前年份,且(未去世 或 去世年份≥当前年份) FILTER(YEAR(?birthdate) <= ?year) FILTER(!BOUND(?deathdate) || YEAR(?deathdate) >= ?year) } GROUP BY ?year ORDER BY ?year
关键说明
- 生成年份序列:使用
VALUES子句直接列出目标年份,适合年份范围不大的场景,简单高效。若范围极大,可借助维基数据中的年份实体实现动态生成,但固定范围下直接列出更直观。 - 过滤条件优化:补充
!BOUND(?deathdate)的判断,确保那些无去世日期记录(仍在世)的得主被正确统计。 - 分组排序:通过
GROUP BY ?year按年份分组计数,ORDER BY ?year让结果按年份顺序排列,便于查看。
内容的提问来源于stack exchange,提问作者Will Hanley
相关产品推荐
相关产品推荐

