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

将文本搜索where子句添加到SPARQL查询,sparql,jena,Sparql,Jena,我得到了一个我认为很简单的任务——接受一个现有的SPARQL查询,并修改WHERE子句,将结果限制在特定文本字段包含特定搜索词的实体上 然而,我对SPARQL语言是完全陌生的,我尝试过的任何东西都不管用。似乎我需要使用text:query(rdfs:label'word'10)语法,但我还没有成功地将其集成到下面的查询中 我需要的是进一步过滤以下查询的结果,其中rdfs:label三元组有一个包含搜索词的值。如果你们中有人能就我需要如何更改查询提供指导,我将不胜感激 SELECT DISTINC

我得到了一个我认为很简单的任务——接受一个现有的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' .  
  }  
} 
选择DISTINCT*其中
{
{选择?对象?标签?访问编号?图像在哪里{
?对象a:我的对象。
?对象名称:accessionNumber?accessionNumber。
?对象rdfs:标签?标签。
?对象:我的制造者。
}}  
可选{
?对象我的:首选资产?资产。
?资产a:我的资产。
?资产dcterms:hasVersion?图像。
?图像:我的角色“缩略图”。
}  
} 

提前感谢。

近似匹配

字符串匹配

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

filter contains( lcase(?label), "word").
还可以通过使用正则表达式。您只需向查询中添加一个附加筛选器,例如:

FILTER regex(?label, "*word*", "i") .
这将允许您检索包含
word
(不区分大小写)的所有标签

Jena文本

您提到的语法
text:query(rdfs:label'word'10)
jena text
项目的一部分。请注意,您必须确保它正常工作。您希望使用的主要时间是如果您希望执行近似文本匹配,即:如果可以搜索
word
并返回
words
wordpress
等内容

精确匹配

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

查询修改

修改查询将产生多种变体之一。并非所有这些变体都被认为是相等的(纯文本/语言文本/类型化文本),因此在搜索时需要小心,以知道数据是否匹配

 ?object  rdfs:label "word" .
 ?object  rdfs:label '''word''' .
 ?object  rdfs:label "word"@en .
 ?object  rdfs:label "word"^^xsd:string .
绑定规范

构造初始绑定通常如下所示(伪代码):


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

对于不区分大小写的匹配,您不需要使用
regex
的所有功能。您只需执行
过滤器包含(lcase(?label),“word”)
。这可能会便宜一点,因为匹配更简单。非常棒,全面的答案。谢谢(还有@joshua taylor)-现在,不区分大小写的文本匹配就足够了,但我不知道jena文本项目,这肯定是我们将继续关注的事情。谢谢你们两位。
final QuerySolutionMap initialBinding = new QuerySolutionMap(){{
     this.add("?label", model.createTypedLiteral(someString));
}};
final QueryExecution e = 
         QueryExecutionFactory.create(query,model,initialBinding);