【问题标题】:Wikidata entity value from name来自名称的 Wikidata 实体值
【发布时间】:2014-12-12 21:48:50
【问题描述】:

有没有办法根据实体名称获取 Wikidata 页面信息,例如,如果我想为 Google 获取页面数据。 我认为必须使用具有相应实体值的“实体”来完成,但我不确定是否有任何简单的方法来确定实体值。

【问题讨论】:

    标签: wikidata wikidata-api


    【解决方案1】:

    如果您想使用 API 执行此操作,您将首先使用 wbsearchentities 找出您想要的实体。例如:

    https://www.wikidata.org/w/api.php?action=wbsearchentities&search=Google&language=en

    问题在于,有多个实体称为“Google”:公司(Google Inc.)、搜索引擎(Google Web Search)、动词(to google),甚至是维基百科的消歧页面。

    在您以某种方式决定访问哪个实体后,使用wbgetentities 实际获取您想要的信息:

    https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q95&languages=en

    或者,如果您无法决定使用哪个实体,您可以同时获取所有实体的信息:

    https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q95|Q9366|Q961680|Q1156923&languages=en

    【讨论】:

    • 嗨@svick 非常感谢!如果您能提供最后一点帮助 - 我在解析数据以返回一个数组或实体编号字符串时遇到困难。可以请教吗?
    【解决方案2】:

    如果您熟悉 Python,您可以使用 Wikidata api 以编程方式进行操作,使用 Pywikibot 以下 Python 脚本获取 wikidata 实体。如果您想要每个单独的 wikidata 实体的数据对象,您需要取消最后两行的注释

     from pywikibot.data import api
     import pywikibot
     import pprint
    
     def getItems(site, itemtitle):
         params = { 'action' :'wbsearchentities' , 'format' : 'json' , 'language' : 'en', 'type' : 'item', 'search': itemtitle}
         request = api.Request(site=site,**params)
         return request.submit()
    
     def getItem(site, wdItem, token):
        request = api.Request(site=site,
                              action='wbgetentities',
                              format='json',
                              ids=wdItem)    
        return request.submit()
    
    def prettyPrint(variable):
        pp = pprint.PrettyPrinter(indent=4)
        pp.pprint(variable)
    
    # Login to wikidata
    site = pywikibot.Site("wikidata", "wikidata")
    repo = site.data_repository()
    token = repo.token(pywikibot.Page(repo, 'Main Page'), 'edit')
    wikidataEntries = getItems(site, "Google")
    # Print the different Wikidata entries to the screen
    prettyPrint(wikidataEntries)
    
    # Print each wikidata entry as an object
    #for wdEntry in wikidataEntries["search"]:
    #   prettyPrint(getItem(site, wdEntry["id"], token))
    

    导致

    {   u'search': [   {   u'aliases': [u'Google Inc.'],
                           u'description': u'American multinational Internet and technology corporation',
                           u'id': u'Q95',
                           u'label': u'Google',
                           u'url': u'//www.wikidata.org/wiki/Q95'},
                       {   u'aliases': [u'Google Search', u'Google Web Search'],
                           u'description': u'Internet search engine developed by Google, Inc.',
                           u'id': u'Q9366',
                           u'label': u'Google',
                           u'url': u'//www.wikidata.org/wiki/Q9366'},
                       {   u'description': u'Wikipedia disambiguation page',
                           u'id': u'Q961680',
                           u'label': u'Google',
                           u'url': u'//www.wikidata.org/wiki/Q961680'},
                       {   u'aliases': [u'Google'],
                           u'description': u'verb',
                           u'id': u'Q1156923',
                           u'label': u'google',
                           u'url': u'//www.wikidata.org/wiki/Q1156923'},
                       {   u'id': u'Q10846831',
                           u'label': u'google',
                           u'url': u'//www.wikidata.org/wiki/Q10846831'},
                       {   u'aliases': [u'Google Android'],
                           u'description': u'operating system for mobile devices created by Google',
                           u'id': u'Q94',
                           u'label': u'Android',
                           u'url': u'//www.wikidata.org/wiki/Q94'},
                       {   u'description': u'web browser developed by Google',
                           u'id': u'Q777',
                           u'label': u'Google Chrome',
                           u'url': u'//www.wikidata.org/wiki/Q777'}],
        u'searchinfo': {   u'search': u'Google'},
        u'success': 1}
    

    【讨论】:

    • 我试过了,但我一直收到错误CRITICAL: Waiting for 1 network thread(s) to finish. Press ctrl-c to abort,你知道这是怎么回事吗?也许我可以以某种方式指定在哪个端口上运行它或某些东西?
    • 您在def getItem(site, wdItem, token) 中省略了token = repo.token(pywikibot.Page(repo, 'Main Page'), 'edit’) 和位置token 参数,因为此时您没有编辑任何内容(抱歉,我还不能编辑答案,我的声誉是'还不够)。
    • 注意,默认情况下结果数为7。如果你想得到更多的结果(一个用户账户限制为50个),你需要添加一个limit参数,例如: params = {'action': 'wbsearchentities', 'format': 'json', 'language': 'en', 'type': 'item', 'search': search_string, 'limit': 50}getItems()
    • 确保听从 Kaleidophon 的建议,删除第 24 行
    【解决方案3】:

    也许您可以使用 sparql 来运行查询:

    SELECT ?item WHERE {
      ?item rdfs:label "Google"@en
    }
    

    您可以使用 pywikibot 在 python 中使用:

     import pywikibot
     from pywikibot import pagegenerators, WikidataBot
    
     sparql = "SELECT ?item WHERE { ?item rdfs:label 'Google'@en }"
     entities = pagegenerators.WikidataSPARQLPageGenerator(sparql, site=repo)
     entities = list(entities)
    

    【讨论】:

      猜你喜欢
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      相关资源
      最近更新 更多