【问题标题】:Can I use generators in WikiData's API?我可以在 WikiData 的 API 中使用生成器吗?
【发布时间】:2021-09-16 16:35:02
【问题描述】:

我正在尝试从维基百科中获取给定类别中的所有页面,包括子类别中的页面。没问题,但我还想要每个页面的某些字段,例如出生日期。

来自this topic 我想我需要使用https://wikidata.org/w/api.php 而不是例如https://pl.wikipedia.org/..

我以为我应该使用生成器,但我的问题是调用 WikiData 时会收到关于错误 ID 的错误,而我在 Wikipedia 上没有。

query.params = {
 "action": "query", // placeholder for test
 "generator": "categorymembers",
 "gcmpageid": 1810130, // sophists'category at pl.wikipedia
 "format": "json"
}

我尝试使用 WikiData 中以“Q”为前缀的 id,但后来我得到了badinteger

或者,我可以向 Wikipedia 请求 ids,然后向 WikiData 请求,但为同一件事调用两次并将所有这些 ids 处理为请求...

请帮忙

【问题讨论】:

    标签: api wikipedia wikidata


    【解决方案1】:

    TL;DR在 Wikidata API 中使用波兰语维基百科的生成器不起作用,但存在其他解决方案。

    关于 Wikidata 及其 API 的一些注意事项:

    • Wikidata 对波兰语 Wikipedia(或任何其他 Wikipedia 语言版本)上的类别层次结构一无所知
    • 没有用于查询所有子类别中的页面的 API。这主要是因为 MediaWiki 的类别系统允许类别层次结构中的循环和无限级别的嵌套类别。
    • pageId 仅在项目中是唯一的。因此,使用来自 pl.wikipedia.org 的 pageId 不适用于 https://en.wikipedia.org/w/api.phphttps://www.wikidata.org/w/api.php

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

    1. 递归地使用问题中的查询从Kategoria:Sofiści 及其子类别中获取所有页面标题。 之后,使用 Wikidata API 检索每篇波兰语 Wikipedia 文章的 Wikidata 项:例如对于 Protagoras,查询是这样的:https://www.wikidata.org/w/api.php?action=wbgetentities&sites=plwiki&titles=Protagoras&props=claims&format=json 这将返回一个 json 文件,其中包含存储在 Wikidata 上的有关 Protagoras 的所有语句。您在该文件中的 claim->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". }
    }
    

    【讨论】:

    • 我真的希望我可以为 WikiData 使用生成器,但我想,就像我想的那样,我只能先获取 wikipedia,然后再获取 WikiData,正如您所描述的 (1);可以使用 2|3 但 SPARQL 看起来不太好;)。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 2019-10-18
    • 2018-02-18
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多