我已经获得了我认为简单的任务 - 获取现有的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)
提前致谢.
近似匹配
字符串匹配
Joshua Taylor的评论指出了一个优秀而优雅的解决方案,可以完全符合您的要求:
filter contains( lcase(?label), "word").
Run Code Online (Sandbox Code Playgroud)
您还可以通过REGEX
Filter Function使用正则表达式.您只需在查询中添加其他过滤器,例如:
FILTER regex(?label, "*word*", "i") .
Run Code Online (Sandbox Code Playgroud)
这将允许您检索包含word
(不区分大小写)的所有标签.
耶拿文
text:query (rdfs:label 'word' 10)
您提到的语法是jena-text
项目的一部分.请注意,您必须配置jena-text才能使其正常工作.要使用的主要时间,如果你想进行近似的文字内容匹配,即:如果它是可以接受的搜索word
和找回的东西像words
或wordpress
等.
完全匹配
另一种选择是精确匹配.您可以通过指定初始绑定或直接修改查询来执行此操作.
查询修改
修改您的查询会产生多种变体之一.并非所有这些变体都被认为是相同的(纯文字/语言文字/类型文字),因此在搜索时需要小心,以确保您的数据匹配.
?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
与查询修改具有相同的选项.您可以创建语言文字或纯文字,而不是键入的文字.同样,它需要匹配您的基础数据.