5

基于 https://jena.apache.org/documentation/query/manipulating_sparql_using_arq.html ,我在语法或代数中从头构建查询时遇到问题

例如我有以下查询

 SELECT  (count(?instance) AS ?count)
 WHERE
 { ?instance <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>
  <http://data.linkedmdb.org/resource/movie/film> }


(project (?count)
  (extend ((?count ?.0))
    (group () ((?.0 (count ?instance)))
      (bgp (triple ?instance <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://data.linkedmdb.org/resource/movie/film>))))) 

任何人都可以指导我如何从头开始构建上述查询的示例代码吗?我试图在语法上构建它,但不知道如何为上面的聚合起别名。

如果有人至少可以指导我将聚合及其别名名称包含在投影中,那将非常棒。

4

2 回答 2

3

我通常不通过代码构造查询,因为我可以只解析查询字符串,或使用参数化的 SPARQL 查询,但这里是使用 API 重建查询。我在这里使用的大多数方法都是通过探索 Eclipse 中的自动完成选项和查看 Javadoc 找到的。

import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.graph.Triple;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.sparql.core.Var;
import com.hp.hpl.jena.sparql.expr.ExprAggregator;
import com.hp.hpl.jena.sparql.expr.ExprVar;
import com.hp.hpl.jena.sparql.expr.aggregate.AggCountVar;
import com.hp.hpl.jena.sparql.syntax.ElementTriplesBlock;
import com.hp.hpl.jena.vocabulary.RDF;

public class QueryBuilding {
    public static void main(String[] args) {
        // Create the query and make it a SELECT query.
        final Query query = QueryFactory.create();
        query.setQuerySelectType();

        // Set the projection expression.
        final ExprVar instance = new ExprVar( "instance" );
        query.getProject().add( Var.alloc( "count" ), new ExprAggregator( instance.asVar(), new AggCountVar( instance )));

        // Construct the triples pattern and add it.
        final ElementTriplesBlock triples = new ElementTriplesBlock();
        final Node film = Node.createURI( "http://data.linkedmdb.org/resource/movie/film" );
        triples.addTriple( new Triple( instance.getAsNode(), RDF.type.asNode(), film ));
        query.setQueryPattern( triples );

        // Show the query 
        System.out.println( query );
    }
}

输出(即打印的查询)如下。它与您的查询相同,以一些空格位置和换行符为模。

SELECT  (count(?instance) AS ?count)
WHERE
  { ?instance  <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>  <http://data.linkedmdb.org/resource/movie/film> .}
于 2013-08-10T23:47:28.280 回答
0

虽然 Joshua 提出的解决方案对我很有帮助并且产生了正确的 String 输出,但我发现它包含一个问题;该行:

query.getProject().add( Var.alloc( "count" ), new ExprAggregator( instance.asVar(), new AggCountVar( instance )));

应替换为:

query.getProject().add( Var.alloc( "count" ), query.allocAggregate( new AggCountVar( instance ) ));

否则,如果您对模型执行查询,您将收到异常“NotAVariableException: Node_variable (not a Var) found”

于 2013-11-28T15:06:37.420 回答