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

时间:2019-04-29 00:40:22

标签: sparql rdf wikidata wikidata-api

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

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

输出为:wd:Q22673982

但是,当我将Word2vec拼写为word2vec时(即所有字符都是简单字母),上述查询没有任何结果。

因此,我想知道是否存在一种方法来获取该术语在wikidata中的名称并获得其标签?

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

很高兴在需要时提供更多详细信息。

2 个答案:

答案 0 :(得分:5)

AKSW的评论是一个更好的解决方案,比公认的答案更好,但是由于AKSW不习惯于发布正确的答案,因此我会为他做的...

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

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

Run this query live

此查询中发生了什么?

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

将其扩展为多个搜索字词

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

?num

Run this query live

  • 搜索项在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 子句中提供,并绑定到VALUES变量
  • 然后在服务调用中使用该变量
  • ?searchTerm现在不再起作用,因为它将限制结果的总数,而不是仅仅限制一个学期,所以我删除了它。
  • 相反,在服务参数中添加了LIMIT 20
  • 更改了顺序,以使其先按搜索词然后按排名

答案 1 :(得分:3)

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

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

这会将所有找到的标签转换为小写,并将比较结果转换为小写字符串。

您可以使用许多不同的功能来进行字符串操作,SPARQL 1.1 W3C Recommendation中有很好的概述。

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

更新如果您查看wd:Q22673982可用的信息(可以在https://www.wikidata.org/wiki/Q22673982进行浏览),您会发现,这是一个“单词嵌入”(wd:Q18395344)的子类。因此,例如,您不仅可以要求所有具有?item的{​​{1}},还可以要求所有属于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次或更多次相同的答案。