我可以在 WikiData 的 API 中使用生成器吗?
Can I use generators in WikiData's API?
我正在尝试从维基百科中获取给定类别中的所有页面,包括子类别中的页面。没问题,但我还想要每个页面的某些字段,例如出生日期。
来自 I suppose I need to use https://wikidata.org/w/api.php and not for example https://pl.wikipedia.org/...
我以为我应该使用生成器,但我的问题是调用 WikiData 时出现错误 ID,我在维基百科中没有得到。
query.params = {
"action": "query", // placeholder for test
"generator": "categorymembers",
"gcmpageid": 1810130, // sophists'category at pl.wikipedia
"format": "json"
}
- https://pl.wikipedia.org/w/api.php -> 数据
- https://en.wikipedia.org/w/api.php -> 错误:
nosuchpage
(预期)
- https://www.wikidata.org/w/api.php -> 错误:
invalidcategory
(为什么???)
我尝试使用 WikiData 中前缀为“Q”的 ID,但后来我得到了 badinteger
或者,我可以向 Wikipedia 请求 ID,然后向 WikiData 请求,但是为同一件事调用两次并将所有 ID 处理为请求...
请帮忙
TL;DR 在维基数据中使用来自波兰语维基百科的生成器 API 不起作用,但存在其他解决方案。
关于维基数据及其 API 的几点注意事项:
- 维基数据对波兰语维基百科(或任何其他维基百科语言版本)的类别层次结构一无所知
- 没有API查询所有子分类的页面。这主要是因为 MediaWiki 的类别系统允许类别层次结构中的循环和嵌套类别的无限级别。
- pageId 仅在一个项目中是唯一的。因此,使用 pl.wikipedia.org 中的 pageId 不适用于 https://en.wikipedia.org/w/api.php or https://www.wikidata.org/w/api.php
您的问题有多种解决方案:
递归地使用问题中的查询,从 Kategoria:Sofiści
及其子类别中获取所有页面标题。
之后,使用维基数据 API 检索每篇波兰语维基百科文章的维基数据项:例如对于 Protagoras,查询是这样的:https://www.wikidata.org/w/api.php?action=wbgetentities&sites=plwiki&titles=Protagoras&props=claims&format=json
这个 returns 一个 json 文件,其中包含存储在维基数据上的关于 Protagoras 的所有陈述。您在 claims->P569->mainsnak->datavalue->value->time 下的文件中找到的出生数据。
使用Wikidat Query Service。它允许您从 SPARQL 调出 MediaWiki API。
SELECT ?item ?itemLabel ?date_of_birth WHERE {
SERVICE wikibase:mwapi {
bd:serviceParam wikibase:api "Generator" .
bd:serviceParam wikibase:endpoint "pl.wikipedia.org" .
bd:serviceParam mwapi:gcmtitle 'Kategoria:Sofiści' .
bd:serviceParam mwapi:generator "categorymembers" .
bd:serviceParam mwapi:gcmprop "ids|title|type" .
bd:serviceParam mwapi:gcmlimit "max" .
?item wikibase:apiOutputItem mwapi:item .
}
?item wdt:P569 ?date_of_birth
SERVICE wikibase:label { bd:serviceParam wikibase:language "pl". }
}
在 https://query.wikidata.org/ 上插入此查询。该页面还为您提供了如何以编程方式访问结果的代码示例。
此解决方案的缺点是不包括子类别中的页面。
- 完全依赖维基数据。在 https://query.wikidata.org/ 中使用以下查询:
SELECT ?item ?itemLabel ?date_of_birth WHERE {
?item wdt:P106 wd:Q3750514.
?item wdt:P569 ?date_of_birth
SERVICE wikibase:label { bd:serviceParam wikibase:language "pl,en". }
}
我正在尝试从维基百科中获取给定类别中的所有页面,包括子类别中的页面。没问题,但我还想要每个页面的某些字段,例如出生日期。
来自
我以为我应该使用生成器,但我的问题是调用 WikiData 时出现错误 ID,我在维基百科中没有得到。
query.params = {
"action": "query", // placeholder for test
"generator": "categorymembers",
"gcmpageid": 1810130, // sophists'category at pl.wikipedia
"format": "json"
}
- https://pl.wikipedia.org/w/api.php -> 数据
- https://en.wikipedia.org/w/api.php -> 错误:
nosuchpage
(预期) - https://www.wikidata.org/w/api.php -> 错误:
invalidcategory
(为什么???)
我尝试使用 WikiData 中前缀为“Q”的 ID,但后来我得到了 badinteger
或者,我可以向 Wikipedia 请求 ID,然后向 WikiData 请求,但是为同一件事调用两次并将所有 ID 处理为请求...
请帮忙
TL;DR 在维基数据中使用来自波兰语维基百科的生成器 API 不起作用,但存在其他解决方案。
关于维基数据及其 API 的几点注意事项:
- 维基数据对波兰语维基百科(或任何其他维基百科语言版本)的类别层次结构一无所知
- 没有API查询所有子分类的页面。这主要是因为 MediaWiki 的类别系统允许类别层次结构中的循环和嵌套类别的无限级别。
- pageId 仅在一个项目中是唯一的。因此,使用 pl.wikipedia.org 中的 pageId 不适用于 https://en.wikipedia.org/w/api.php or https://www.wikidata.org/w/api.php
您的问题有多种解决方案:
递归地使用问题中的查询,从
Kategoria:Sofiści
及其子类别中获取所有页面标题。 之后,使用维基数据 API 检索每篇波兰语维基百科文章的维基数据项:例如对于 Protagoras,查询是这样的:https://www.wikidata.org/w/api.php?action=wbgetentities&sites=plwiki&titles=Protagoras&props=claims&format=json 这个 returns 一个 json 文件,其中包含存储在维基数据上的关于 Protagoras 的所有陈述。您在 claims->P569->mainsnak->datavalue->value->time 下的文件中找到的出生数据。使用Wikidat Query Service。它允许您从 SPARQL 调出 MediaWiki API。
SELECT ?item ?itemLabel ?date_of_birth WHERE {
SERVICE wikibase:mwapi {
bd:serviceParam wikibase:api "Generator" .
bd:serviceParam wikibase:endpoint "pl.wikipedia.org" .
bd:serviceParam mwapi:gcmtitle 'Kategoria:Sofiści' .
bd:serviceParam mwapi:generator "categorymembers" .
bd:serviceParam mwapi:gcmprop "ids|title|type" .
bd:serviceParam mwapi:gcmlimit "max" .
?item wikibase:apiOutputItem mwapi:item .
}
?item wdt:P569 ?date_of_birth
SERVICE wikibase:label { bd:serviceParam wikibase:language "pl". }
}
在 https://query.wikidata.org/ 上插入此查询。该页面还为您提供了如何以编程方式访问结果的代码示例。 此解决方案的缺点是不包括子类别中的页面。
- 完全依赖维基数据。在 https://query.wikidata.org/ 中使用以下查询:
SELECT ?item ?itemLabel ?date_of_birth WHERE {
?item wdt:P106 wd:Q3750514.
?item wdt:P569 ?date_of_birth
SERVICE wikibase:label { bd:serviceParam wikibase:language "pl,en". }
}