我在从零开始构建查询时遇到了一个问题,无论是语法上还是代数上,都是基于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>))))) 可以用示例代码指导我从零开始构建上面的查询吗?我试图从语法上构建,但不知道如何将上面的聚合化成别名。
如果有人至少能引导我把聚合和它的别名名字包含在投影中,那将是非常棒的。
发布于 2013-08-10 23:47:28
我通常不通过代码构造查询,因为我只需要解析查询字符串,或者使用参数化的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-11-28 15:06:37
虽然约书亚提出的解决方案对我很有帮助,并产生了正确的字符串输出,但我发现它包含了一个问题;行:
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 (不是Var)“
https://stackoverflow.com/questions/8206319
复制相似问题