我一直在玩维基数据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:有没有更简单的方法来按项目名称获取项目属性列表?
答案 0 :(得分:1)
可能有效的一种间接方法是在会话开始时提取包含P213的所有Q项目的全面列表 - 这里有about a million,因此它将是几MB - 然后是每次搜索,检查您的搜索结果是否在该本地列表中。如果是,请继续进行API调查以查看详细信息 - 如果没有,您将不会感兴趣,因此您可以跳过它们。
这不会让您在会话期间添加任何VIAF项目,但日常变化相对较小,因此这不应成为主要问题。
答案 1 :(得分:0)
我最终想出了如何使用wbgetentities操作按名称获取实体的属性列表。我完全错过了我可以通过titles
和sites
参数进行查找以获取实体,而不是仅使用相同的操作通过它的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属性及其值的所有实体。