使用FILTER的SPARQL查询返回其变量的正确值但仅为要过滤的变量的给定值

时间:2013-12-08 12:38:20

标签: sparql jena dbpedia

我正在使用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' )). }";

谢谢!

1 个答案:

答案 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以构建查询。