2012-06-14 5 views
4

первый пост здесь. Я надеялся, что кто-то может помочь мне создать пользовательские функции SPARQL для использования в API Jena (ARQ). Мне нужно, чтобы SPARQL выполнял некоторую агрегацию, и я знаю, что он уже реализует avg, count, min, max и sum, но мне также нужно иметь возможность стандартного отклонения и медианы (мне также нужен диапазон, но это может быть с использованием только min и max).Пользовательские функции в SPARQL с API Jena

Я надеялся, что запрос может быть похож на то, что вы используете для уже реализованных функций:

PREFIX example: <http://www.examples.com/functions#> 
PREFIX core: <http://www.core.com/values#> 
SELECT (stddev(?price) as ?stddev) 
WHERE { 
    ?s core:hasPrice ?price 
} 

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

Все, что я знаю, это то, что функции будут написаны на Java, которые я уже хорошо знаю. Поэтому мне было интересно, знал ли кто-нибудь о хорошем способе этого или где начать искать какие-то рекомендации. Я пробовал искать документацию на нем, но, похоже, ничего нет. Любая помощь будет принята с благодарностью.

Заранее спасибо.

ответ

2

Я не уверен, что вы можете делать то, что хотите, без изменения грамматики.

SUM (...), например, является ключевым словом, определяемый грамматикой SPARQL:

функцию фильтра или функции собственности, вероятно, не то, что вы ищем.

Кстати, вы также не получаете STDDEV в SQL. Это потому, что необходимы два прохода над данными?

+0

Спасибо, посмотрев больше, кажется, что вы правы и мне не нужен фильтр или функция свойства. С учетом сказанного, можно ли каким-либо образом сохранить только результаты, а затем объединить их отдельно от SPARQL? (Я еще не очень хорошо знаком с ARQ) – endorphins

0

Да, ARQ расширяется различными способами. ARQ extensions page будет лучшим местом для начала.

+0

Я не уверен, что функция фильтра в этом случае будет работать. – castagna

+0

Это полезно, но как я могу использовать свой пример функции max для определения максимального значения набора результатов? (максимальный пример находится в [link] (http://jena.apache.org/documentation/query/writing_functions.html)) – endorphins

2

Агрегатные функции являются частным случаем функций SPARQL (и, следовательно, ARQ). Я думаю, что в ARQ нелегко расширить набор совокупных функций, в то время как легко (и документировано) расширить набор функций фильтра и функцию функций. Вы могли бы вычислить в любом случае стандартное отклонение с чем-то вроде этого:

PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#> 
PREFIX core: <http://www.core.com/values#> 
SELECT (afn:sqrt(sum((?price - ?avg) * (?price - ?avg))/(?count - 1)) as ?stddev) 
WHERE { 
    ?s core:hasPrice ?price . 
    { 
    SELECT (avg(?price) as ?avg) (count(*) as ?count) 
    WHERE { 
     ?s core:hasPrice ?price 
    } 
    } 
} 

я вынужден так или иначе использовать AFN: SQRT, что является «собственностью» функция ARQ не в 1.1 проекта SPARQL, поэтому этот запрос Wouldn» t работа на каркасах, отличных от Jena

Смежные вопросы