1

我一直在玩 Wikidata 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;博士:有没有更简单的方法来按项目名称获取项目属性列表?

4

2 回答 2

1

我最终想出了如何使用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 属性的实体及其值。

于 2015-10-21T17:08:59.550 回答
1

一种可能有效的间接方法是在会话开始时拉下包含 P213 的所有 Q 项目的综合列表 -大约有一百万个,所以它将是几 MB - 然后对于每次搜索,检查查看您的任何搜索结果是否在该本地列表中。如果有,请继续进行进一步的 API 调用以查看详细信息 - 如果没有,您将不会感兴趣,因此您可以跳过它们。

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

于 2015-10-19T13:08:02.600 回答