我可以在 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"
}

我尝试使用 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

您的问题有多种解决方案:

  1. 递归地使用问题中的查询,从 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 下的文件中找到的出生数据。

  2. 使用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/ 上插入此查询。该页面还为您提供了如何以编程方式访问结果的代码示例。 此解决方案的缺点是不包括子类别中的页面。

  1. 完全依赖维基数据。在 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". }
}