Вычислить отклонение длины wikiPageLength с помощью SPARQL в dbpedia

#sparql #semantic-web #dbpedia

#sparql #semantic-web #dbpedia

Вопрос:

Я хотел рассчитать отклонение (или стандартное отклонение) истории длины страницы Википедии для книг light novel (Light_novels) с помощью dbpedia (http://live.dbpedia.org/sparql ).

SPARQL здесь:

 PREFIX dbpedia0: <http://dbpedia.org/ontology/> 
PREFIX term: <http://purl.org/dc/terms/>

SELECT DISTINCT ?item ((SUM((?n - ?mean)*(?n - ?mean)))/(COUNT(?n) - 1) AS ?variance) 
WHERE
{
    
?item term:subject dbc:Light_novels . 

  ?item dbpedia0:wikiPageLength ?n
  {
      SELECT ?item (AVG(?n) AS ?mean) WHERE {
        ?item dbpedia0:wikiPageLength ?n . 
      } 
  }

}        
  

Это выдает ошибку Virtuoso 37000 Error SP031: SPARQL compiler: The name ?n is used in multiple clauses, without any logical connection
, и я пытался изменять код вслепую бесчисленное количество раз, но в итоге понятия не имел, как я могу этого добиться.

Я действительно ценю ваши полезные комментарии. Спасибо.

Комментарии:

1. работает для меня на dbpedia.org/sparql

2. вы можете отключить флаги «Строгая проверка пустых переменных» и «Строгая проверка имен переменных, используемых в нескольких предложениях, но логически не связанных друг с другом» на live.dbpedia.org/sparql — Я имею в виду, это буквально то, что написано в вашей ошибке.

3. Я бы также ввел ?item term:subject dbc:Light_novels . подзапрос по соображениям эффективности. Таким образом, вы получите ?item term:subject dbc:Light_novels . во внутреннем и внешнем запросе

4. Благодаря @UninformedUser, похоже, проблема с ошибкой решена. но по-прежнему я не получаю результата по запросу. у вас есть идея?

5. какую конечную точку вы используете сейчас? В dbpedia.org/sparql данные для dbo:wikiPageLength не существует. В live.dbpedia.org/sparql это так и есть

Ответ №1:

Обычно это должно работать

 PREFIX dbpedia0: <http://dbpedia.org/ontology/> 
PREFIX term: <http://purl.org/dc/terms/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>


SELECT ?item IF(?count=1,0,(SUM(?x)/(?count-1))) as ?var
{
SELECT ?item ?n xsd:integer(?n) as ?ni ?mean xsd:integer(?ni-?mean) as ?nmean ((?nmean)*(?nmean)) as ?x ?count
{
  ?item dbpedia0:wikiPageLength ?n 
  {
     SELECT ?item AVG(?n2) as ?mean (COUNT(?item)) as $count
     {
       ?item term:subject dbc:Light_novels . 
       ?item dbpedia0:wikiPageLength ?n2
     }
     GROUP BY ?item
  }
}
} GROUP BY ?item ?count
  

но он выдает эту ошибку

Ошибка внутреннего оптимизированного компилятора: неверный dfe в sqlo_place_exp в sqldf.c:2491

Итак, я изменил его на этот:

 PREFIX dbpedia0: <http://dbpedia.org/ontology/> 
PREFIX term: <http://purl.org/dc/terms/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT ?item IF(?count=1,-1,(?sx/(?count-1))) as ?var
{
SELECT ?item SUM(?x) as ?sx ?count
{
SELECT ?item ?n xsd:integer(?n) as ?ni ?mean xsd:integer(?ni-?mean) as ?nmean ((?nmean)*(?nmean)) as ?x ?count
{
  ?item dbpedia0:wikiPageLength ?n 
  {
     SELECT ?item AVG(?n2) as ?mean (COUNT(?item)) as $count
     {
       ?item term:subject dbc:Light_novels . 
       ?item dbpedia0:wikiPageLength ?n2
     }
     GROUP BY ?item
  }
}
} GROUP BY ?item ?count
}
  
  • нам нужны агрегации a. для вычисления среднего и b. для вычисления суммы разностей каждого n из них от среднего.

  • Мне нужно было преобразовать тип переменной в целое xsd:integer(?ni-?mean) число, иначе она не отображает результат умножения

  • Запустив второй внутренний подзапрос, вы можете увидеть, как изменяются переменные

Комментарии:

1. сработало! огромная помощь, спасибо. Сейчас я работаю над вычислением дисперсии данных с измененной датой wikiPageModified, я ценю это, если у вас также есть представление об этом. еще раз спасибо.