2014-01-21 1 views
3

Ниже приведен фрагмент кода, который я использую для запроса конечной точки DBPEDIA SPARQL. Запрос select count(?y) where {?x ?y ?z .} работает нормально, но нижний запрос не запускается, давая ошибку для переменной ?count?COUNT агрегат не работает на DBPedia при выпуске через Jena

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

 int count=0; 

     String queryStringNew="select count(distinct ?y) where {?x ?y ?z .}"; 

     Query query=QueryFactory.create(queryStringNew); 

     ARQ.getContext().setTrue(ARQ.useSAX); 
     QueryExecution qexec = QueryExecutionFactory.sparqlService("http://DBpedia.org/sparql", query); 

     ResultSet results = qexec.execSelect(); 



     while(results.hasNext()) 
     { 
      QuerySolution soln=results.nextSolution(); 
      //System.out.println(soln.get("?x")); 
      count++; 
     } 
+0

@ Ответ Робва прав. Для дальнейшего использования. У sparql.orq есть [проверка запроса] (http://sparql.org/query-validator.html). Если вы вставляете текст 'select count (distinct? Y), где {? X? Y? Z.}' Там, вы получите правильное сообщение об ошибке «Encountered» «count» «count» »в строке 1, столбец 8. Ожидал один из: ... «Несмотря на то, что [вы] считаете, что синтаксис прав,« всегда рекомендуется проверять. Также полезно разместить сообщение об ошибке, которое вы получаете от Йены. Я ожидал бы, что это, вероятно, синтаксическая ошибка или синтаксическая ошибка, и, вероятно, это ключевое слово 'count', а не переменная. –

ответ

0

Как вы используете Jena, правильный синтаксис строки запроса должен быть:

String queryStringNew = "select ?y count(distinct ?y) where {?x ?y ?z .}";

или

SELECT ?y (COUNT(?y) as ?yCount)

+0

Можете ли вы это прояснить? Я знаю, что некоторые двигатели SPARQL могут не интерпретировать спецификацию точно (они могут допускать некоторые искаженные запросы), но я не вижу в вашем ответе вашего ответа. –

+0

См. [@RobV] (http://stackoverflow.com/users/107591/robv) ответ со сводным объяснением, которое я должен был лениться. – loopasam

+1

Но, как я понимаю, Йена не должна принимать 'select? Y count (distinct? Y), где {? X? Y? Z.}' Либо, так как 'count (...)' не должен появляться без '((count (...) as ...)'. Поэтому я не понимаю первый блок кода. –

5

Проблема в том, что ваш запрос не является действительным SPARQL 1.1

Virtuoso (программное обеспечение, используемое для DBPedia) печально известно, что имеет нестандартную реализацию SPARQL, которая поддерживает различные расширения синтаксиса, которые недействительны в стандартном SPARQL. Вот почему, когда вы вводите запрос в конечной точке DBPedia непосредственно, он принимается.

Для того чтобы быть действительным SPARQL, все агрегаты (и выражения проекта) должны быть заключены в скобки и псевдонимы (имеют предложение AS), например.

SELECT ?y (COUNT(DISTINCT ?y) AS ?count) WHERE { ?x ?y ?z } 

Если вы хотите поддерживать нестандартную SPARQL через Jena вы можете включить расширенный синтаксис, когда вы разбираете запрос:

Query q = QueryFactory.create("SELECT ?y COUNT(DISTINCT ?y) WHERE { ?x ?y ?z }", Syntax.syntaxARQ); 

Обратите внимание, что даже при этом включении есть еще много нестандартные синтаксические конструкции SPARQL, которые Virtuoso поддерживает, что ARQ все равно отклонит.

Однако лучше использовать стандартный SPARQL там, где это возможно, поскольку в противном случае вы связываете свои запросы с конкретной реализацией и ограничиваете переносимость ваших запросов.