我已经获得了我认为简单的任务 - 获取现有的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' .
}
}
提前致谢。
答案 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
并取回words
或wordpress
等内容。< / 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
的第二个参数与查询修改具有相同的选项。您可以创建语言文字或纯文字,而不是键入的文字。同样,它需要匹配您的基础数据。