带有 **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提出三个方案:

  1. 更具体。
    ?entity wdt:P171+ wd:Q25314 模式在您的情况下似乎具有足够的选择性。

  2. Wait 直到他们实现全文搜索。

  3. 使用采石场(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
        )
}

Try it!


似乎即使下面的查询有时也能在 wikidata.dbpedia.org 上运行而不会超时:

PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?resource WHERE { 
   ?resource rdfs:label ?label .
   FILTER ( STR(?label) = "Topinambur" ) .
}

Try it!


两小时前,我在维基数据上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 

Try it!

此解决方案并不完美,因为您必须枚举所有语言,但速度快且可靠。所有可用的维基数据语言列表为 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

Try it!

后面是详细查询

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

Try it!

要查询标签,请执行类似以下操作:

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