如何获取维基数据标签的近似项?

How to get the Wikidata labels for approximate terms?

我正在使用下面提到的查询来获取给定术语的维基数据标签。

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

输出为wd:Q22673982

但是,当我将 Word2vec 拼写为 word2vec(即所有字符都是简单字母)时,我从上述查询中得到 "No results"。

因此,我想知道是否有办法获取术语在 wikidata 中的情况并获取其标签?

即如果我输入的所有字符都是小写的,如何识别等效的 wikidata 术语和 return 其对应的标签?

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

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

这会将找到的任何标签转换为小写,并将其与小写字符串进行比较。

有许多不同的函数可用于字符串操作,SPARQL 1.1 W3C Recommendation 中有很好的概述。

注意 执行这种查询的成本要高得多(就执行时间而言),因为引擎必须对所有可能的匹配项进行顺序扫描。就像评论中提到的@AKSW 一样,当您在 Wikidata public 端点上执行查询时,按原样查询可能会超时。如果您通过添加额外的三重模式使查询更具体,这可能会有很大帮助。

Update 如果您查看 wd:Q22673982 的可用信息(您可以在 https://www.wikidata.org/wiki/Q22673982 浏览),您会看到,其中其他的,它是 "word embeddding" (wd:Q18395344) 的子类。因此,例如,您可以做的不是只询问每个具有 rdfs:label?item,而是询问属于 wd:Q18395344 的子类并具有此标签的所有项目,就像这样:

SELECT DISTINCT ?item WHERE {
  ?item wdt:P279 wd:Q18395344;
        rdfs:label ?label
  FILTER(LCASE(STR(?label)) = "word2vec")
}

不幸的是,维基数据为其属性和关系使用了相当神秘的标识符。足以说明 wdt:P279 对应于 "subclass" 关系。 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

Run this query live

这个查询发生了什么?

  1. wikibase:mwapiSERVICE 调用不是标准 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 * 表示 return 查询中绑定的所有变量,因此在本例中它将是 ?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 添加到服务参数
  • 更改了顺序,使其首先按搜索词排序,然后按排名