从名称获取Wikidata实体值

21

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

3个回答

19

如果您想使用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,非常感谢!如果您能提供最后一点帮助-我在解析数据以返回实体编号的数组或字符串方面遇到了困难。您能给予建议吗? - Oroku

11
如果您熟悉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,你知道这是怎么回事吗?也许我可以指定运行的端口或者其他什么东西? - smatthewenglish
3
由于您在此时并未编辑任何内容,因此您可以省略 token = repo.token(pywikibot.Page(repo, 'Main Page'), 'edit')getItem(site, wdItem, token) 函数中的位置参数 token。请原谅我无法编辑答案,因为我的声望还不够高。 - Kaleidophon
请注意,默认情况下结果数量为7。如果您想获取更多结果(用户帐户限制为50个),则需要添加“limit”参数,例如:在getItems()中使用params = {'action': 'wbsearchentities', 'format': 'json', 'language': 'en', 'type': 'item', 'search': search_string, 'limit': 50} - Jona
请确保遵循Kaleidophon的建议,删除第24行。 - Zumplo

5
也许您可以使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接