带有 **ANY** 语言标签的 SPARQL 匹配文字没有 运行 超时
SPARQL Matching Literals with **ANY** Language Tags without run into timeout
我需要 select 具有 "taxon rank (P105)" 的 实体 "species (Q7432)" 有一个 label 匹配文字字符串,例如 "Topinambur".
我正在 https://query.wikidata.org 上测试查询;
这个查询没问题,return 实体对我来说响应时间令人满意:
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT * WHERE {
?entity rdfs:label "Topinambur"@de .
?entity wdt:P105 wd:Q7432.
}
LIMIT 100
这里的问题是我的要求是不是指定语言而是标签的词汇形式 在基础数据集(维基数据)中有 语言标签 所以我需要一种方法来获得 的 文字平等 任何语言.
我尝试了一些可能的解决方案,但没有找到任何未导致以下结果的查询:
超时 消息com.bigdata.bop.engine.QueryTimeoutException: Query deadline is expired
这是我尝试过的列表(..我总是超时):
1) 基于 this answer 我试过:
SELECT * WHERE {
?entity rdfs:label ?label FILTER ( str( ?label ) = "Topinambur") .
?entity wdt:P105 wd:Q7432.
}
LIMIT 100
2) 基于我试过的一些其他文档:
SELECT * WHERE {
?entity wdt:P105 wd:Q7432.
?entity rdfs:label ?label FILTER regex(?label, "^Topinambur") .
}
LIMIT 100
3) 和
SELECT * WHERE {
?entity wdt:P105 wd:Q7432.
?entity rdfs:label ?label .
FILTER langMatches( lang(?label), "*" )
FILTER (?label = "Topinambur")
}
LIMIT 100
我正在寻找的是一个高性能的解决方案或一些 SPARQL 语法,它不会以 TIMEOUT 消息结束。
PS:参考 http://www.rfc-editor.org/rfc/bcp/bcp47.txt 我不明白 language ranges
或“通配符”是否能以某种方式提供帮助。
编辑
我在 DbPedia 中成功测试了(没有超时)一个类似的查询,方法是使用 virtuoso 查询编辑器:
https://dbpedia.org/sparql
默认数据集名称(图表 IRI):http://dbpedia.org
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT ?resource
WHERE {
?resource rdfs:label ?label . FILTER ( str( ?label ) = "Topinambur").
?resource rdf:type dbo:Species
}
LIMIT 100
我仍然非常想了解我在维基数据上遇到的性能问题以及最好的语法是什么。
This answer提出三个方案:
更具体。
?entity wdt:P171+ wd:Q25314
模式在您的情况下似乎具有足够的选择性。
Wait 直到他们实现全文搜索。
使用采石场(example query)。
另一种选择是在 wikidata.dbpedia.org:
上使用 Virtuoso 全文搜索功能
SELECT ?s WHERE {
?resource rdfs:label ?label .
?label bif:contains "'topinambur'" .
BIND ( IRI ( REPLACE ( STR(?resource),
"http://wikidata.dbpedia.org/resource",
"http://www.wikidata.org/entity"
)
) AS ?s
)
}
似乎即使下面的查询有时也能在 wikidata.dbpedia.org 上运行而不会超时:
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT ?resource WHERE {
?resource rdfs:label ?label .
FILTER ( STR(?label) = "Topinambur" ) .
}
两小时前,我在维基数据上removed发表了以下声明:
wd:Q161378 rdfs:label "topinambur"@ru .
我不是植物学家,但'topinambur'绝对不是Russian中的一个词。
我解决了类似的问题 - 想用任何语言找到带有标签字符串的实体。我建议不要使用 FILTER,因为它太慢了。而是像这样使用 UNION:
SELECT ?entity WHERE {
?entity wdt:P105 wd:Q7432.
{ ?entity rdfs:label "Topinambur"@de . }
UNION { ?entity rdfs:label "Topinambur"@en . }
UNION { ?entity rdfs:label "Topinambur"@fr . }
}
GROUP BY ?entity
LIMIT 100
此解决方案并不完美,因为您必须枚举所有语言,但速度快且可靠。所有可用的维基数据语言列表为 here.
根据@quick 的答案进一步研究,并针对词位而不是标签显示它。首先识别相关语言代码:
SELECT (GROUP_CONCAT(?mword; separator=" ") AS ?mwords) {
BIND(1 AS ?dummy)
VALUES ?word { "topinambur" }
{
SELECT (COUNT(?lexeme) AS ?count) ?language_code {
?lexeme dct:language / wdt:P424 ?language_code .
}
GROUP BY ?language_code
HAVING (?count > 100)
ORDER BY DESC(?count)
}
BIND(CONCAT('"', ?word, '"@', ?language_code) AS ?mword)
}
GROUP BY ?dummy
后面是详细查询
SELECT (COUNT(?lexeme) AS ?count) ?language (GROUP_CONCAT(?word; separator=" ") AS ?words) {
VALUES ?word { "topinambur"@eo "topinambur"@ko "topinambur"@bfi "topinambur"@nl "topinambur"@uk "topinambur"@cy "topinambur"@pt "topinambur"@zh "topinambur"@br "topinambur"@bg "topinambur"@ms "topinambur"@tg "topinambur"@se "topinambur"@ta "topinambur"@non "topinambur"@it "topinambur"@zh-min-nan "topinambur"@nan "topinambur"@fi "topinambur"@jbo "topinambur"@ml "topinambur"@ja "topinambur"@ku "topinambur"@bn "topinambur"@ar "topinambur"@nb "topinambur"@es "topinambur"@pl "topinambur"@nn "topinambur"@sk "topinambur"@da "topinambur"@de "topinambur"@cs "topinambur"@fr "topinambur"@sv "topinambur"@eu "topinambur"@he "topinambur"@la "topinambur"@en "topinambur"@ru }
?lexeme dct:language ?language ;
ontolex:lexicalForm / ontolex:representation ?word .
}
GROUP BY ?language
要查询标签,请执行类似以下操作:
SELECT (COUNT(?item) AS ?count) ?language (GROUP_CONCAT(?word; separator=" ") AS ?words) {
VALUES ?word { "topinambur"@eo "topinambur"@ko "topinambur"@bfi "topinambur"@nl "topinambur"@uk "topinambur"@cy "topinambur"@pt "topinambur"@zh "topinambur"@br "topinambur"@bg "topinambur"@ms "topinambur"@tg "topinambur"@se "topinambur"@ta "topinambur"@non "topinambur"@it "topinambur"@zh-min-nan "topinambur"@nan "topinambur"@fi "topinambur"@jbo "topinambur"@ml "topinambur"@ja "topinambur"@ku "topinambur"@bn "topinambur"@ar "topinambur"@nb "topinambur"@es "topinambur"@pl "topinambur"@nn "topinambur"@sk "topinambur"@da "topinambur"@de "topinambur"@cs "topinambur"@fr "topinambur"@sv "topinambur"@eu "topinambur"@he "topinambur"@la "topinambur"@en "topinambur"@ru }
?item rdfs:label ?word ;
}
GROUP BY ?language
我需要 select 具有 "taxon rank (P105)" 的 实体 "species (Q7432)" 有一个 label 匹配文字字符串,例如 "Topinambur".
我正在 https://query.wikidata.org 上测试查询; 这个查询没问题,return 实体对我来说响应时间令人满意:
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT * WHERE {
?entity rdfs:label "Topinambur"@de .
?entity wdt:P105 wd:Q7432.
}
LIMIT 100
这里的问题是我的要求是不是指定语言而是标签的词汇形式 在基础数据集(维基数据)中有 语言标签 所以我需要一种方法来获得 的 文字平等 任何语言.
我尝试了一些可能的解决方案,但没有找到任何未导致以下结果的查询:
超时 消息com.bigdata.bop.engine.QueryTimeoutException: Query deadline is expired
这是我尝试过的列表(..我总是超时):
1) 基于 this answer 我试过:
SELECT * WHERE {
?entity rdfs:label ?label FILTER ( str( ?label ) = "Topinambur") .
?entity wdt:P105 wd:Q7432.
}
LIMIT 100
2) 基于我试过的一些其他文档:
SELECT * WHERE {
?entity wdt:P105 wd:Q7432.
?entity rdfs:label ?label FILTER regex(?label, "^Topinambur") .
}
LIMIT 100
3) 和
SELECT * WHERE {
?entity wdt:P105 wd:Q7432.
?entity rdfs:label ?label .
FILTER langMatches( lang(?label), "*" )
FILTER (?label = "Topinambur")
}
LIMIT 100
我正在寻找的是一个高性能的解决方案或一些 SPARQL 语法,它不会以 TIMEOUT 消息结束。
PS:参考 http://www.rfc-editor.org/rfc/bcp/bcp47.txt 我不明白 language ranges
或“通配符”是否能以某种方式提供帮助。
编辑
我在 DbPedia 中成功测试了(没有超时)一个类似的查询,方法是使用 virtuoso 查询编辑器: https://dbpedia.org/sparql 默认数据集名称(图表 IRI):http://dbpedia.org
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT ?resource
WHERE {
?resource rdfs:label ?label . FILTER ( str( ?label ) = "Topinambur").
?resource rdf:type dbo:Species
}
LIMIT 100
我仍然非常想了解我在维基数据上遇到的性能问题以及最好的语法是什么。
This answer提出三个方案:
更具体。
?entity wdt:P171+ wd:Q25314
模式在您的情况下似乎具有足够的选择性。Wait 直到他们实现全文搜索。
使用采石场(example query)。
另一种选择是在 wikidata.dbpedia.org:
上使用 Virtuoso 全文搜索功能SELECT ?s WHERE {
?resource rdfs:label ?label .
?label bif:contains "'topinambur'" .
BIND ( IRI ( REPLACE ( STR(?resource),
"http://wikidata.dbpedia.org/resource",
"http://www.wikidata.org/entity"
)
) AS ?s
)
}
似乎即使下面的查询有时也能在 wikidata.dbpedia.org 上运行而不会超时:
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT ?resource WHERE {
?resource rdfs:label ?label .
FILTER ( STR(?label) = "Topinambur" ) .
}
两小时前,我在维基数据上removed发表了以下声明:
wd:Q161378 rdfs:label "topinambur"@ru .
我不是植物学家,但'topinambur'绝对不是Russian中的一个词。
我解决了类似的问题 - 想用任何语言找到带有标签字符串的实体。我建议不要使用 FILTER,因为它太慢了。而是像这样使用 UNION:
SELECT ?entity WHERE {
?entity wdt:P105 wd:Q7432.
{ ?entity rdfs:label "Topinambur"@de . }
UNION { ?entity rdfs:label "Topinambur"@en . }
UNION { ?entity rdfs:label "Topinambur"@fr . }
}
GROUP BY ?entity
LIMIT 100
此解决方案并不完美,因为您必须枚举所有语言,但速度快且可靠。所有可用的维基数据语言列表为 here.
根据@quick 的答案进一步研究,并针对词位而不是标签显示它。首先识别相关语言代码:
SELECT (GROUP_CONCAT(?mword; separator=" ") AS ?mwords) {
BIND(1 AS ?dummy)
VALUES ?word { "topinambur" }
{
SELECT (COUNT(?lexeme) AS ?count) ?language_code {
?lexeme dct:language / wdt:P424 ?language_code .
}
GROUP BY ?language_code
HAVING (?count > 100)
ORDER BY DESC(?count)
}
BIND(CONCAT('"', ?word, '"@', ?language_code) AS ?mword)
}
GROUP BY ?dummy
后面是详细查询
SELECT (COUNT(?lexeme) AS ?count) ?language (GROUP_CONCAT(?word; separator=" ") AS ?words) {
VALUES ?word { "topinambur"@eo "topinambur"@ko "topinambur"@bfi "topinambur"@nl "topinambur"@uk "topinambur"@cy "topinambur"@pt "topinambur"@zh "topinambur"@br "topinambur"@bg "topinambur"@ms "topinambur"@tg "topinambur"@se "topinambur"@ta "topinambur"@non "topinambur"@it "topinambur"@zh-min-nan "topinambur"@nan "topinambur"@fi "topinambur"@jbo "topinambur"@ml "topinambur"@ja "topinambur"@ku "topinambur"@bn "topinambur"@ar "topinambur"@nb "topinambur"@es "topinambur"@pl "topinambur"@nn "topinambur"@sk "topinambur"@da "topinambur"@de "topinambur"@cs "topinambur"@fr "topinambur"@sv "topinambur"@eu "topinambur"@he "topinambur"@la "topinambur"@en "topinambur"@ru }
?lexeme dct:language ?language ;
ontolex:lexicalForm / ontolex:representation ?word .
}
GROUP BY ?language
要查询标签,请执行类似以下操作:
SELECT (COUNT(?item) AS ?count) ?language (GROUP_CONCAT(?word; separator=" ") AS ?words) {
VALUES ?word { "topinambur"@eo "topinambur"@ko "topinambur"@bfi "topinambur"@nl "topinambur"@uk "topinambur"@cy "topinambur"@pt "topinambur"@zh "topinambur"@br "topinambur"@bg "topinambur"@ms "topinambur"@tg "topinambur"@se "topinambur"@ta "topinambur"@non "topinambur"@it "topinambur"@zh-min-nan "topinambur"@nan "topinambur"@fi "topinambur"@jbo "topinambur"@ml "topinambur"@ja "topinambur"@ku "topinambur"@bn "topinambur"@ar "topinambur"@nb "topinambur"@es "topinambur"@pl "topinambur"@nn "topinambur"@sk "topinambur"@da "topinambur"@de "topinambur"@cs "topinambur"@fr "topinambur"@sv "topinambur"@eu "topinambur"@he "topinambur"@la "topinambur"@en "topinambur"@ru }
?item rdfs:label ?word ;
}
GROUP BY ?language