SPARQL 维基数据。如何只选择维基媒体数据库并避免笔记重复?
SPARQL WikiData. How to chose only wikipedia data base and avoid notes duplication?
我是使用 SPARQL for 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 文章的维基百科数据,但 FILTER(!REGEX(STR(?article), "^<https://en.wikipedia.org/"))
会使查询速度变慢。
我该如何解决?
您的查询有一些问题:
- 正如 Ainali 和 UninformedUser 所解释的,您应该使用
?article schema:isPartOf <https://en.wikipedia.org/> .
而不是过滤,那样更快
- 查询搜索所有可能的条目标签和描述,这是非常低效的,最好封装您的查询并只为结果获取标签和描述(参见https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/query_optimization#Label_service)
- 按年份筛选效率不高,您可以在这里找到更好的方法:https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/query_optimization#Fixed_values_and_ranges
生成的查询运行时间不到 30 秒:
https://w.wiki/UN8
一般来说,最好先写一个简单、快速的查询,给出所有结果,然后加载其他数据,最后加载标签和描述。
至于重复项,您的查询将创建行结果的所有可能组合。所以如果一个人在维基数据上有两个生日,你会得到两个,如果有多个职业,你会得到每个职业都有一个和另一个生日,因为这些可能是你查询的不同结果。如果你只想要一个人一次,你必须聚合其他行,例如到达最小值,将其分组等。
我是使用 SPARQL for 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 文章的维基百科数据,但 FILTER(!REGEX(STR(?article), "^<https://en.wikipedia.org/"))
会使查询速度变慢。
我该如何解决?
您的查询有一些问题:
- 正如 Ainali 和 UninformedUser 所解释的,您应该使用
?article schema:isPartOf <https://en.wikipedia.org/> .
而不是过滤,那样更快 - 查询搜索所有可能的条目标签和描述,这是非常低效的,最好封装您的查询并只为结果获取标签和描述(参见https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/query_optimization#Label_service)
- 按年份筛选效率不高,您可以在这里找到更好的方法:https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/query_optimization#Fixed_values_and_ranges
生成的查询运行时间不到 30 秒: https://w.wiki/UN8
一般来说,最好先写一个简单、快速的查询,给出所有结果,然后加载其他数据,最后加载标签和描述。
至于重复项,您的查询将创建行结果的所有可能组合。所以如果一个人在维基数据上有两个生日,你会得到两个,如果有多个职业,你会得到每个职业都有一个和另一个生日,因为这些可能是你查询的不同结果。如果你只想要一个人一次,你必须聚合其他行,例如到达最小值,将其分组等。