【问题标题】:Add text search where clause to SPARQL query将文本搜索 where 子句添加到 SPARQL 查询
【发布时间】:2014-08-06 15:33:51
【问题描述】:

我得到了一项我认为很简单的任务 - 获取现有的 SPARQL 查询并调整 WHERE 子句以将结果限制为特定文本字段包含特定搜索词的实体。

但是,我对 SPARQL 语言完全陌生,我尝试过的任何方法都不起作用。看来我需要使用text:query (rdfs:label 'word' 10) 语法,但我还没有成功地将它集成到下面的查询中。

我需要进一步过滤以下查询的结果,其中 rdfs:label 三元组的值包含搜索词。如果你们中的任何人能就我需要如何更改查询提供指导,我将不胜感激。

SELECT DISTINCT * WHERE 
{
  { SELECT  ?object ?label ?accessionNumber ?image  WHERE {
      ?object a my:Object .
      ?object my:accessionNumber ?accessionNumber .
      ?object  rdfs:label ?label .
      ?object my:maker <http://id.my.org.uk/agent/1234> .  
  }}  

  OPTIONAL  { 
    ?object my:preferredAsset ?asset .
    ?asset a my:Asset .
    ?asset dcterms:hasVersion ?image .
    ?image my:role 'thumbnail' .  
  }  
} 

提前致谢。

【问题讨论】:

    标签: sparql jena


    【解决方案1】:

    近似匹配

    字符串匹配

    Joshua Taylor 的评论指出了一个出色而优雅的解决方案,可以完全按照您的要求进行:

    filter contains( lcase(?label), "word").
    

    您还可以通过REGEX Filter Function 使用正则表达式。您只需在查询中添加一个额外的过滤器,例如:

    FILTER regex(?label, "*word*", "i") .
    

    这将允许您检索包含word(不区分大小写)的所有标签。

    耶拿文字

    您提到的语法text:query (rdfs:label 'word' 10)jena-text 项目的一部分。请注意,您必须 configure jena-text 才能使其正常工作。您想要使用的主要时间是如果您想要执行近似文本匹配,即:搜索word 并返回诸如wordswordpress 等内容是否可以接受。

    完全匹配

    另一种选择是精确匹配。您可以通过指定初始绑定或直接修改查询来做到这一点。

    查询修改

    修改您的查询会产生几种变体之一。并非所有这些变体都被认为是相同的(普通文字/语言文字/类型文字),因此您在搜索时需要小心,以了解您的数据是否匹配。

     ?object  rdfs:label "word" .
     ?object  rdfs:label '''word''' .
     ?object  rdfs:label "word"@en .
     ?object  rdfs:label "word"^^xsd:string .
    

    绑定规范

    构造一个初始绑定通常看起来像这样(伪代码):

    final QuerySolutionMap initialBinding = new QuerySolutionMap(){{
         this.add("?label", model.createTypedLiteral(someString));
    }};
    final QueryExecution e = 
             QueryExecutionFactory.create(query,model,initialBinding);
    

    请注意,add 的第二个参数与查询修改具有相同的选择。您可以创建语言文字或普通文字而不是类型文字。同样,它需要匹配您的基础数据。

    【讨论】:

    • 为了进行不区分大小写的匹配,您不需要regex 的所有功能。你可以做filter contains( lcase(?label), "word")。这可能会便宜一些,因为匹配更简单。
    • 绝妙而全面的答案。谢谢(和@joshua-taylor)——现在不区分大小写的文本匹配就足够了,但我不知道jena-text 项目,这肯定是我们未来会关注的东西。感谢你们俩。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2011-03-17
    • 2010-09-15
    • 2016-08-31
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多