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