我是将SPARQL用于Wikidata的初学者。我用它来通过代码获取具有特定死亡日期的人的数据列表:
SELECT ?human ?humanLabel ?humanDescription ?gender ?birth_date ?death_date ?bplace ?dplace ?img ?prof ?profLabel ?article WHERE {
?human wdt:P31 wd:Q5;
wdt:P18 ?img;
wdt:P19 ?bplace;
wdt:P20 ?dplace;
wdt:P21 ?gender;
wdt:P569 ?birth_date;
wdt:P570 ?death_date;
#rdfs:label ?name;
#schema:description ?description;
wdt:P106 ?prof.
?article schema:about ?human .
?article schema:inLanguage "en".
FILTER (year(?death_date) = 2020)
#FILTER(!REGEX(STR(?article), "^<https://en.wikipedia.org/"))
SERVICE wikibase:label {bd:serviceParam wikibase:language "en".}
}
ORDER BY ASC(?death_date)
但是响应中有一些重复项(并使响应变大)。另外,我只需要接收来自en.wikipedia.org的文章中的Wikipedia数据,但FILTER(!REGEX(STR(?article), "^<https://en.wikipedia.org/"))
会使查询变得更加缓慢。
我该如何解决?
您的查询存在一些问题:
?article schema:isPartOf <https://en.wikipedia.org/> .
而不是过滤,这样速度更快生成的查询在不到30秒的时间内运行:https://w.wiki/UN8
一般来说,最好首先编写一个简单,快速的查询,以给出所有结果,然后加载其他数据,最后加载标签和描述。
至于重复项,您的查询将创建行结果的所有可能组合。因此,如果一个人在Wikidata上有两个出生日期,那么您将同时获得两个日期,如果有多个职业,则每个职业都有一个和另一个出生日期,因为这是查询的不同结果。如果您只想一个人,则必须汇总其他行,例如,将最小值排到那里,将其分组等。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句