SPARQL将文本与**任意**语言标记进行匹配,而不会出现超时
我需要选择具有“物种(Q7432)”的“分类单元等级(P105)”的实体,其标签与文本字符串(如“Topinambur”)匹配 我正在测试上的查询; 此查询运行正常,并以令人满意的响应时间将实体返回给我:SPARQL将文本与**任意**语言标记进行匹配,而不会出现超时,sparql,dbpedia,wikidata,Sparql,Dbpedia,Wikidata,我需要选择具有“物种(Q7432)”的“分类单元等级(P105)”的实体,其标签与文本字符串(如“Topinambur”)匹配 我正在测试上的查询; 此查询运行正常,并以令人满意的响应时间将实体返回给我: PREFIX wd: <http://www.wikidata.org/entity/> PREFIX wdt: <http://www.wikidata.org/prop/direct/> PREFIX rdfs: <http://www.w3.org/2000
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
2) 根据我尝试的其他一些文档:
SELECT * WHERE {
?entity wdt:P105 wd:Q7432.
?entity rdfs:label ?label FILTER regex(?label, "^Topinambur") .
}
LIMIT 100
3) 及
我要寻找的是一个性能解决方案或一些SPARQL语法,它们不会导致超时消息
注:关于这一点,我不明白语言范围
或“通配符”是否能在某种程度上有所帮助
编辑
我在DbPedia中使用virtuoso查询编辑器成功测试了一个类似的查询(没有超时):
默认数据集名称(图形IRI):
前缀rdfs:
前缀rdf:
前缀dbo:
选择资源
何处{
?资源rdfs:label?label.FILTER(str(?label)=“Topinambur”)。
?资源rdf:类型dbo:物种
}
限制100
我仍然非常有兴趣了解我在Wikidata上遇到的性能问题,以及最好使用的语法是什么。提出了三个选项:
?实体wdt:P171+wd:Q25314
模式在您的案例中似乎具有足够的选择性另一种选择是使用Virtuoso全文搜索功能:
选择?s,其中{
?资源RDF:标签?标签。
?标签bif:包含“topinambur”。
绑定(IRI)(替换(STR(?资源),
"http://wikidata.dbpedia.org/resource",
"http://www.wikidata.org/entity"
)
)作为
)
}
看起来,甚至下面的查询有时也可以在wikidata.dbpedia.org上运行,而不会超时:
前缀dbo:
选择?资源,其中{
?资源RDF:标签?标签。
过滤器(STR(?标签)=“Topinambur”)。
}
两小时前,我在Wikidata上发表了以下声明:
wd:Q161378 rdfs:label "topinambur"@ru .
我不是植物学家,但“topinambur”绝对不是一个单词。我解决了类似的问题-希望找到任何语言中带有标签字符串的实体。我建议不要使用过滤器,因为它太慢了。而是像这样使用联合:
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
这个解决方案并不完美,因为您必须枚举所有语言,但它快速可靠。所有可用的wikidata语言列表如下。从@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
什么是超时?三联书店?你用哪家三联书店?是Blazegraph还是Virtuoso?@AKSW我正在使用(由于您的评论,我刚刚编辑了我的问题),我将尽快在dbpedia Virtuoso上尝试相同的方法,但我现在不知道是否可行,因为我不知道dbpedia是否有相同的方法data@FrancoRondini,看看。它看起来像是
?实体wdt:P171+wd:Q25314“代码>在您的情况下是合适的条件。@Stanislav Kralin您是对的!我尝试了两个查询,在51294ms中得到了8个结果,在41284ms中得到了2个结果(使用DISTINCT子句)——这两个结果都满足了我的要求,尽管速度不是很快。如果你愿意贴出你的答案,我会接受的。谢谢你的建议……事实上,托皮纳姆布的名字(标签)指的是“薯蓣”(Q161378),而在许多其他语言中,它指的是菊芋(Q146190)
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