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

get*_*ode 5 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' .  
  }  
} 
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Rob*_*all 7

近似匹配

字符串匹配

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

filter contains( lcase(?label), "word").
Run Code Online (Sandbox Code Playgroud)

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

FILTER regex(?label, "*word*", "i") .
Run Code Online (Sandbox Code Playgroud)

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

耶拿文

text:query (rdfs:label 'word' 10)您提到的语法是jena-text项目的一部分.请注意,您必须配置jena-text才能使其正常工作.要使用的主要时间,如果你想进行近似的文字内容匹配,即:如果它是可以接受的搜索word和找回的东西像wordswordpress等.

完全匹配

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

查询修改

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

 ?object  rdfs:label "word" .
 ?object  rdfs:label '''word''' .
 ?object  rdfs:label "word"@en .
 ?object  rdfs:label "word"^^xsd:string .
Run Code Online (Sandbox Code Playgroud)

绑定规范

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

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

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

  • 为了做不区分大小写的匹配,你不需要`regex`的所有功能.你可以做`过滤器包含(lcase(?label),"word")`.这可能会便宜一点,因为匹配更简单. (4认同)