SPARQL匹配文字与** ANY **语言标签没有遇到超时

时间:2016-10-25 17:31:28

标签: sparql dbpedia wikidata bigdata

我需要选择具有“分类等级(P105) ”物种(Q7432)“实体 标签与文字字符串匹配,例如“Topinambur”。

我在https://query.wikidata.org上测试查询; 这个查询很好,并以令人满意的响应时间将实体返回给我:

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 

这里的问题是我的必要条件是不指定语言,而是基础数据集中标签词法形式(wikidata) )有语言标签所以我需要一种方法来获得任何语言文字平等

我尝试了一些可能的解决方案,但我没有找到任何不会导致以下结果的查询: TIMEOUT 消息com.bigdata.bop.engine.QueryTimeoutException: Query deadline is expired

这里是我尝试的列表(..而且我总是得到TIMEOUT):

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或````wildcards``能否以某种方式提供帮助。

修改

我使用virtuoso查询编辑器在 DbPedia 中成功测试了(没有超时)超过类似的查询: 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

我仍然非常有兴趣了解我在维基数据上遇到的性能问题以及使用的最佳语法。

3 个答案:

答案 0 :(得分:3)

我解决了类似的问题 - 希望在任何语言中找到带有标签字符串的实体。我建议不要使用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!

此解决方案并不完美,因为您必须使用所有语言,但速度快且可靠。所有可用的wikidata语言列表为here

答案 1 :(得分:2)

This answer提出了三个选项:

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

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

  3. 使用采石场(example query)。

  4. 另一种选择是在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 .
    

    我不是植物学家,但&#39; topinambur&#39;绝对不是Russian中的一个词。

答案 2 :(得分:0)

进一步研究@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