如何获取维基数据标签的近似项?
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
这个查询发生了什么?
- 对
wikibase:mwapi
的 SERVICE
调用不是标准 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 *
表示 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
- 搜索词在
VALUES
子句中提供并绑定到 ?searchTerm
变量
- 然后在服务调用中使用该变量
LIMIT 20
现在不再有效,因为它会限制结果总数,而不是只限制一个学期,所以我删除了它
- 相反,将
wikibase:limit
添加到服务参数
- 更改了顺序,使其首先按搜索词排序,然后按排名
我正在使用下面提到的查询来获取给定术语的维基数据标签。
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
这个查询发生了什么?
- 对
wikibase:mwapi
的SERVICE
调用不是标准 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 *
表示 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
- 搜索词在
VALUES
子句中提供并绑定到?searchTerm
变量 - 然后在服务调用中使用该变量
LIMIT 20
现在不再有效,因为它会限制结果总数,而不是只限制一个学期,所以我删除了它- 相反,将
wikibase:limit
添加到服务参数 - 更改了顺序,使其首先按搜索词排序,然后按排名