我正在使用下面提到的查询来获取给定术语的wikidata。
SELECT ?item WHERE {
?item rdfs:label "Word2vec"@en
}
输出为wd:Q22673982
但是,当我将Word2vec
拼写为word2vec
时(即所有字符都是简单字母),我从上述查询中获得“无结果”。
因此,我想知道是否有一种方法可以获取wikidata
中的术语并获得其标签?
即如果我输入的所有字符均小写,如何识别等效的wikidata术语并返回其相应的标签?
如果不确定确切的拼写或大小写,可以使用过滤器功能进行匹配。例如,要匹配而不考虑大小写,可以使用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次或更多次。
[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
SERVICE
调用不是标准的SPARQL,而是一个调用Mediawiki API(特别是其实体搜索)的SPARQL扩展。关于wikibase:mwapi
的更多信息。重要的是将搜索词作为in the manual的值,并将找到的项目绑定到变量mwapi:search
的两行以及其在搜索结果中的排名为?item
。?num
。它同时考虑了“属性的子类”和“实例的属性”。?item (wdt:P279|wdt:P31) ?type
确保结果按排名排序,即,最佳匹配排在第一位,第二最佳匹配排在第二,依此类推。?type
仅保留前20个结果,以防超过20个。ORDER BY ?num
表示返回查询中绑定的所有变量,因此在这种情况下它将是LIMIT 20
,SELECT *
和?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
添加到服务参数