WikiData,定位具有特定类型或子类型的实体,位于特定城市

时间:2016-11-02 21:17:11

标签: sparql wikidata

我的具体问题是我有一个名为" Beacon Theatre"的地方。我想要找到的是维基数据中最匹配的。

Wikidata Search会给我三个结果:

  

住在灯塔剧院(Q6656601)

     

灯塔剧院(Q264186):表演艺术场地

     

Beacon Theatres(Q19110809)

第一部是电影,第二部是正确的结果,第三部是最高法院的决定。

使用this API调用,我可以找到所有三个的ID:

https://www.wikidata.org/w/api.php?action=query&format=json&list=search&srsearch=Beacon Theater

下一步是获取每个细节。我使用this调用来获取所有三个实体的信息

"https://www.wikidata.org/w/api.php?action=wbgetentities&props=descriptions|labels|claims&ids=Q6656601|Q264186|Q19110809&languages=en&format=json"

此时,我想迭代它们并找到一个建筑物。我后来也想添加一种方法来找到位于纽约的那个。

我的问题是正确答案不是建筑物(Q41176)。 P31值是Q3469910,这是一个Performance Arts Venue,所以我无法对此进行排序(想象一下,我将来使用此代码搜索博物馆。博物馆也是一座建筑,但不是表演艺术场地。寻找灯塔剧院只是一个例子。

所以问题:如何找到正确的条目,为了这个问题,我将其定义为:

  1. 作为建筑物(或者可能来自建筑物)
  2. 可选答案:位于纽约(如果多次点击,这将进一步限制结果)
  3. 我认为我需要将SPARQL查询作为第二个查询来执行此操作,但是从示例中我无法弄清楚如何,或者这是否是正确/最简单的方法。甚至可能在一个查询中执行上述所有操作的SPARQL查询?

2 个答案:

答案 0 :(得分:0)

对于您而言,完全可以匹配标签

SELECT DISTINCT ?loc ?locLabel ?locDescription 
  WHERE 
  {
   values ?locLabel {"Beacon Theater"@en }
   ?loc rdfs:label ?locLabel . 
   SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en"}
}

try it!

答案 1 :(得分:-1)

我有a project我遇到同样的问题,但对于书籍,也可以是漫画书或漫画等。我找到的最简单的解决方案是保留a list of "alias entities",即在寻找书籍时可以考虑匹配的实体。它不像SPARQL查询那样动态,需要定期更新 - 添加新发现的匹配实体,删除有问题的实体 - 但这样更快,更能满足我的大部分需求。