#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, я ценю это, если у вас также есть представление об этом. еще раз спасибо.