ARQ делает запрос с нуля - PullRequest
       34

ARQ делает запрос с нуля

5 голосов
/ 21 ноября 2011

У меня проблема с построением запроса с нуля синтаксически или в алгебре на основе 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>))))) 

Может ли кто-нибудь направить меняс примером кода, как построить вышеупомянутый запрос с нуля?Я пытался построить его синтаксически , но не знал, как псевдоним агрегации выше.

Если кто-нибудь хотя бы может подсказать мне, как включить агрегацию с ее псевдонимом в проекцию, это будет очень здорово.

Ответы [ 2 ]

3 голосов
/ 11 августа 2013

Обычно я не создаю запросы с помощью кода, так как я могу просто проанализировать строку запроса или использовать параметризованный запрос 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> .}
0 голосов
/ 28 ноября 2013

Хотя решение, предложенное Джошуа, было очень полезно для меня и дает правильный вывод 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 Var) найден"

...