首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARQ从头开始查询

ARQ从头开始查询
EN

Stack Overflow用户
提问于 2011-11-21 01:24:47
回答 2查看 771关注 0票数 5

我在从零开始构建查询时遇到了一个问题,无论是语法上还是代数上,都是基于https://jena.apache.org/documentation/query/manipulating_sparql_using_arq.html

例如,我有以下查询

代码语言:javascript
复制
 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>))))) 

可以用示例代码指导我从零开始构建上面的查询吗?我试图从语法上构建,但不知道如何将上面的聚合化成别名。

如果有人至少能引导我把聚合和它的别名名字包含在投影中,那将是非常棒的。

EN

回答 2

Stack Overflow用户

发布于 2013-08-10 23:47:28

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

代码语言:javascript
复制
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 );
    }
}

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

代码语言:javascript
复制
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> .}
票数 3
EN

Stack Overflow用户

发布于 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)“

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8206319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档