SPARQL将文本与**任意**语言标记进行匹配,而不会出现超时

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

我需要选择具有“物种(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/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