如何获得近似术语的wikidata标签?

问题描述 投票:2回答:2

我正在使用下面提到的查询来获取给定术语的wikidata。

SELECT ?item WHERE {
  ?item rdfs:label "Word2vec"@en
}

输出为wd:Q22673982

但是,当我将Word2vec拼写为word2vec时(即所有字符都是简单字母),我从上述查询中获得“无结果”。

因此,我想知道是否有一种方法可以获取wikidata中的术语并获得其标签?

即如果我输入的所有字符均小写,如何识别等效的wikidata术语并返回其相应的标签?

sparql rdf wikidata wikidata-api
2个回答
3
投票

如果不确定确切的拼写或大小写,可以使用过滤器功能进行匹配。例如,要匹配而不考虑大小写,可以使用LCASE()(或UCASE())功能,如下所示:

SELECT ?item WHERE {
  ?item rdfs:label ?label
  FILTER(LCASE(STR(?label)) = "word2vec")
}

这会将找到的所有标签转换为小写字母,然后将其与小写字符串进行比较。

有很多不同的功能可用于字符串操作,SPARQL 1.1 W3C Recommendation中有很好的概述。

NOTE进行这种查询的代价(在执行时间方面)要高得多,因为引擎将必须对所有可能的匹配项进行顺序扫描。就像注释中提到的@AKSW一样,当您在Wikidata公共端点上执行查询时,查询原样可能会超时。如果通过添加其他三元模式使查询更具体,这可能会很有帮助。

更新如果查看wd:Q22673982可用的信息(可以在https://www.wikidata.org/wiki/Q22673982进行浏览),您会看到,它是“单词嵌入”的子类([[ C0])。因此,例如,您不仅可以要求具有wd:Q18395344的每个?item,还可以要求所有属于rdfs:label子类并具有此标签的项目,例如:

wd:Q18395344

[不幸的是,Wikidata对其属性和关系使用相当隐秘的标识符。可以说SELECT DISTINCT ?item WHERE { ?item wdt:P279 wd:Q18395344; rdfs:label ?label FILTER(LCASE(STR(?label)) = "word2vec") } 对应于“子类”关系。我添加了wdt:P279,因为否则您会得到相同的答案10次或更多次。


5
投票

[AKSW的评论是比已接受的答案更好的解决方案,但是由于AKSW不习惯于发布正确的答案,所以我会为他做的...

我们不知道您的用例,但是如果您只是想在Wikidata实体中进行简单搜索,则其他服务(例如MediaWiki API实体搜索)可能会更有效。您甚至可以在SPARQL中使用它,例如:

DISTINCT

SELECT * { SERVICE wikibase:mwapi { bd:serviceParam wikibase:api "EntitySearch". bd:serviceParam wikibase:endpoint "www.wikidata.org". bd:serviceParam mwapi:search "word2vec". bd:serviceParam mwapi:language "en". ?item wikibase:apiOutputItem mwapi:item. ?num wikibase:apiOrdinal true. } ?item (wdt:P279|wdt:P31) ?type } ORDER BY ?num LIMIT 20

此查询中发生了什么?

  1. Run this query liveSERVICE调用不是标准的SPARQL,而是一个调用Mediawiki API(特别是其实体搜索)的SPARQL扩展。关于wikibase:mwapi的更多信息。重要的是将搜索词作为in the manual的值,并将找到的项目绑定到变量mwapi:search的两行以及其在搜索结果中的排名为?item
  2. [C0行]将每个项目的类型绑定到变量?num。它同时考虑了“属性的子类”和“实例的属性”。
  3. [?item (wdt:P279|wdt:P31) ?type确保结果按排名排序,即,最佳匹配排在第一位,第二最佳匹配排在第二,依此类推。
  4. ?type仅保留前20个结果,以防超过20个。
  5. [ORDER BY ?num表示返回查询中绑定的所有变量,因此在这种情况下它将是LIMIT 20SELECT *?item

将其扩展为多个搜索词

根据评论,可以扩展为运行多个搜索词:

?type

?num

  • 搜索词在SELECT * { VALUES ?searchTerm { "word2vec" "fasttext" "natural language processing" "deep learning" "support vector machine" } SERVICE wikibase:mwapi { bd:serviceParam wikibase:api "EntitySearch". bd:serviceParam wikibase:endpoint "www.wikidata.org". bd:serviceParam wikibase:limit 10 . bd:serviceParam mwapi:search ?searchTerm. bd:serviceParam mwapi:language "en". ?item wikibase:apiOutputItem mwapi:item. ?num wikibase:apiOrdinal true. } ?item (wdt:P279|wdt:P31) ?type } ORDER BY ?searchTerm ?num 子句中提供并绑定到Run this query live变量
  • 然后在服务调用中使用该变量
  • VALUES现在不再起作用,因为它会限制结果的总数,而不是仅仅限制一个学期,因此我将其删除了
  • 相反,将?searchTerm添加到服务参数
  • 已更改顺序,使其首先按搜索词然后按排名排序
© www.soinside.com 2019 - 2024. All rights reserved.