【问题标题】:SPARQL Matching Literals with **ANY** Language Tags without run into timeoutSPARQL 匹配文字与 **ANY** 语言标签而不会超时
【发布时间】:2016-10-25 17:31:28
【问题描述】:

我需要选择 “分类单元等级 (P105)”“物种 (Q7432)”实体 label 匹配文字字符串,例如“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)中标签词法形式 ) 有语言标签,所以我需要一种方法来获得任何语言Literal Equality

我尝试了一些可能的解决方案,但没有找到任何不会导致以下结果的查询: 超时消息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 或```通配符`` 是否能在某些方面有所帮助。

编辑

我使用 virtuoso 查询编辑器在 DbPedia 中成功测试了一个类似的查询(没有超时): https://dbpedia.org/sparql 默认数据集名称(Graph 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

我仍然对了解我在 Wikidata 上遇到的性能问题以及最好使用的语法非常感兴趣。

【问题讨论】:

  • 什么是超时?三联店?你用的是哪家三联店?是 Blazegraph 还是 Virtuoso?
  • @AKSW 我正在使用query.wikidata.org(刚刚编辑了我的问题,感谢您的评论)我会尽快在 dbpedia virtuoso dbpedia.org/sparql 上尝试相同的操作,但我现在不知道是否可能,因为不知道dbpedia有没有相同的数据
  • @FrancoRondini,看看this answer。似乎?entity wdt:P171+ wd:Q25314 . 之类的内容适合您的情况。
  • @Stanislav Kralin 你是对的!我尝试了几个查询,在 51294 毫秒内产生 8 个结果,在 41284 毫秒内产生 2 个结果(使用 DISTINCT 子句)——虽然不是那么快,但都满足我的要求。如果你想发布你的答案,我会接受。感谢您的建议。

标签: sparql dbpedia wikidata


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    This answer 提出三个选项:

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

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

    3. 使用 Quarry (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 .
    

    我不是植物学家,但 Russian 中绝对没有“topinambur”这个词。

    【讨论】:

    • ...实际上,名称(标签)Topinambur 指的是“薯蓣”(Q161378),而在许多其他语言中它被称为 Helianthus tuberosus(Q146190),这确实是一个奇怪的案例。
    【解决方案3】:

    从@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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      相关资源
      最近更新 更多