将文本搜索where子句添加到SPARQL查询

时间:2014-08-06 15:33:51

标签: sparql jena

我已经获得了我认为简单的任务 - 获取现有的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' .  
  }  
} 

提前致谢。

1 个答案:

答案 0 :(得分:7)

近似匹配

字符串匹配

Joshua Taylor的评论指出了一个优秀而优雅的解决方案,可以完全满足您的要求:

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

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

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

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

Jena Text

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

完全匹配

另一种选择是完全匹配。您可以通过指定初始绑定或直接修改查询来执行此操作。

查询修改

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

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

绑定规范

构造初始绑定通常看起来像这样(psuedocode):

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

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