如何获得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中有很好的概述。

注意,执行此类查询的成本要高得多(就执行时间而言),因为引擎必须对所有可能的匹配进行顺序扫描。与提交中提到的@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次或更多次。


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. SERVICEwikibase:mwapi的调用不是标准的SPARQL,而是调用Mediawiki API的SPARQL扩展,特别是其实体搜索。更多关于那in the manual。重要的是搜索词作为mwapi:search的值,以及将找到的项绑定到变量?item的两行,以及它在?num搜索结果中的排名。
  2. ?item (wdt:P279|wdt:P31) ?type将每个项的类型绑定到变量?type。它考虑了“子类”和“实例”属性。
  3. ORDER BY ?num确保结果按排名排序,即最佳匹配排在第一位,第二位最佳排名第二位,等等。
  4. LIMIT 20只保留前20个结果,如果超过20个。
  5. 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变量
  • 然后在服务调用中使用该变量
  • LIMIT 20现在不再有效了,因为它会限制结果的总数而不仅仅是一个术语,所以我删除了它
  • 相反,将wikibase:limit添加到服务参数中
  • 更改了排序,使其首先按搜索词排序,然后按排名排序