从维基数据项

时间:2015-10-15 18:57:30

标签: mediawiki-api wikidata wikidata-api

我一直在玩维基数据API。我知道如何通过名称和Q号来获取项目(实体)。但我似乎无法弄清楚如何让他们的财产正确。我正在寻找的是P214(作者的viaf标识符)

例如,我已经使用此查询以全名

获取作者
https://www.wikidata.org/w/api.php?action=wbsearchentities&search=Douglas%20Adams&language=en

返回一组页面名称,并链接到名称为“Douglas Adams”的页面。但没有属性。

然后我可以使用Q id列表查询属性,如此

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

viaf属性和Q42的值都在那里。但这是一种笨重的方法,因为我从第一个查询得到一个结果列表,然后我必须迭代它们并查询每个我正在寻找的那个属性。

tl; dr:有没有更简单的方法来按项目名称获取项目属性列表?

2 个答案:

答案 0 :(得分:1)

可能有效的一种间接方法是在会话开始时提取包含P213的所有Q项目的全面列表 - 这里有about a million,因此它将是几MB - 然后是每次搜索,检查您的搜索结果是否在该本地列表中。如果是,请继续进行API调查以查看详细信息 - 如果没有,您将不会感兴趣,因此您可以跳过它们。

这不会让您在会话期间添加任何VIAF项目,但日常变化相对较小,因此这不应成为主要问题。

答案 1 :(得分:0)

我最终想出了如何使用wbgetentities操作按名称获取实体的属性列表。我完全错过了我可以通过titlessites参数进行查找以获取实体,而不是仅使用相同的操作通过它的QID进行搜索。

我指向这个解决方案的是这个例子(隐藏在页面底部):

api.php?action=wbgetentities&sites=enwiki&titles=Berlin&languages=en

一个小小的缺点是,我还必须提供sites参数,但我可以忍受

修改

SPARQL API正是我一直需要的!

PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX wd: <http://www.wikidata.org/entity/> 
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?viaf WHERE {
  wd:Q42 wdt:P214 ?viaf   
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "en" .
  }
}

现在我获得Q42(adams)的所有P214(viaf),用普通对象符号wd:Q42替换?o,将获得具有VIAF ID属性及其值的所有实体。