我正在使用Jena
进行SPARQL
查询,以便按主题搜索所有文档的属性。但是文档可以有多个主题,当我进行搜索时,它不会返回所有文档的属性,包括所有文档的主题,但即使它有3个主题(例如)它返回我所有文档属性+仅我在FILTER
设置的主题。
我希望返回找到的文档中的所有属性+所有主题(属于找到的文档),而不仅仅是FILTER
中的属性。
查询(this.subject
是一个在JSF page
中设置其值的变量):
String queryString = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " +
"PREFIX dc: <http://purl.org/dc/elements/1.1/> " +
"PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?document ?subject" +
" ?title ?description ?language WHERE { " +
"?document dc:title ?title." +
"?document dc:subject ?subject." +
"?document dc:description ?description." +
"?document dc:language ?language." +
"FILTER ( regex(?subject, replace( \"" + this.subject + "\", ' ', '|' ), 'i' )). }";
谢谢!
答案 0 :(得分:1)
您可能希望使用子查询来限制与FILTER
匹配的文档,然后选择您真正感兴趣的其他内容,例如。
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dc : <http://purl.org/dc/elements/1.1/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?document ?subject ?title ?description ?language
WHERE
{
{
SELECT ?document
WHERE
{
?document dc:subject ?subject .
FILTER(REGEX(?subject, REPLACE("search term", " ", "|"), "i"))
}
}
?document dc:title ?title ;
dc:description ?description ;
dc:subject ?subject ;
dc:language ?language .
}
请注意,这仍然会为每个文档主题组合提供一行,因此如果您有一个包含3个主题的文档,您将获得该文档的三行。如果您想将文档合并为一行,那么您可以使用GROUP BY
然后使用GROUP_CONCAT
聚合,Stack Overflow上还有其他问题,详细说明如何执行此操作。
另请注意,建议使用简单的字符串连接将常量注入到查询中,请查看Jena的ParameterizedSparqlString以获取更加用户友好的SPARQL注入API以构建查询。