我使用下面提到的查询来获取给定术语的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中有很好的概述。
注意,执行此类查询的成本要高得多(就执行时间而言),因为引擎必须对所有可能的匹配进行顺序扫描。与提交中提到的@AKSW一样,当您在Wikidata公共端点上执行查询时,查询可能会超时。如果通过添加其他三重模式使查询更具体,那么它可能会有很大帮助。
更新如果您查看wd:Q22673982
可用的信息(您可以在https://www.wikidata.org/wiki/Q22673982浏览它),您会看到,除其他外,它是“word embeddding”(wd:Q18395344
)的子类。所以你可以做的,例如,而不是只要求每个?item
有一个rdfs:label
,请求所有的项目是wd:Q18395344
的子类并有这个标签,如下所示:
SELECT DISTINCT ?item WHERE {
?item wdt:P279 wd:Q18395344;
rdfs:label ?label
FILTER(LCASE(STR(?label)) = "word2vec")
}
不幸的是,维基数据使用相当神秘的标识符来表示其属性和关系。可以说wdt:P279
对应于“子类”关系。 DISTINCT
是我添加的东西,因为否则你得到相同的答案10次或更多次。
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
对wikibase:mwapi
的调用不是标准的SPARQL,而是调用Mediawiki API的SPARQL扩展,特别是其实体搜索。更多关于那in the manual。重要的是搜索词作为mwapi:search
的值,以及将找到的项绑定到变量?item
的两行,以及它在?num
搜索结果中的排名。?item (wdt:P279|wdt:P31) ?type
将每个项的类型绑定到变量?type
。它考虑了“子类”和“实例”属性。ORDER BY ?num
确保结果按排名排序,即最佳匹配排在第一位,第二位最佳排名第二位,等等。LIMIT 20
只保留前20个结果,如果超过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
现在不再有效了,因为它会限制结果的总数而不仅仅是一个术语,所以我删除了它wikibase:limit
添加到服务参数中