Apache Jena агрегирует несколько выражений

#sparql #jena #arq

#sparql #jena #arq

Вопрос:

Для следующего файла data.ttl:

 A SAVINGS_1 200
A SAVINGS_2 300
A SAVINGS_3 370
A EMAIL emailidone
B SAVINGS_1 400
B SAVINGS_2 300
B SAVINGS_3 100
B EMAIL emailidtwo
C SAVINGS_1 200
C SAVINGS_2 600
  

Запрос:

 SELECT ?NAME ?SAVINGS_1_VALUE ?SAVINGS_2_VALUE ?SAVINGS_3_VALUE WHERE { 
                                                                  ?NAME SAVINGS_1 ?SAVINGS_1_VALUE .
                                                                  ?NAME SAVINGS_2 ?SAVINGS_2_VALUE .
                                                                  ?NAME SAVINGS_3 ?SAVINGS_3_VALUE .
                                                                  ?NAME EMAIL ?email . }
  

Выдает вывод:

 NAME  SAVINGS_1_VALUE  SAVINGS_2_VALUE  SAVINGS_3_VALUE
 A      200                 300              370
 B      400                 300              100
     
  

Есть ли способ вычислить МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ SAVINGS_1, SAVINGS_2 и SAVINGS_3 для пользователей A, B и C, у которых также есть электронная почта с использованием процессора JENA ARQ?

Ожидаемый результат запроса будет

 Expected Query output: NAME  SAVINGS_1_VALUE  SAVINGS_2_VALUE   SAVINGS_3_VALUE  MAXIMUM
                         A      200                 300              370           370
                         B      400                 300              100           400
                     
                     
  

Функция MAX() принимает только один аргумент, она может вычислить максимум ?SAVINGS_1_VALUE или максимум ?SAVINGS_2_VALUE и так далее. Есть ли способ оценить максимум ?SAVINGS_1_VALUE, ?SAVINGS_2_VALUE, ?SAVINGS_3_VALUE проекций и добавить результат в виде другого столбца? Если существующий процессор Jena не способен этого достичь, какие могут быть возможные точки расширения для достижения этого? Пользовательские агрегаторы также, похоже, оценивают выражение отдельной переменной.

Примечание: существует множество переменных выражений, для которых я хочу это оценить! Поэтому свяжите (если … Для меня это не вариант!

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

1. зачем вам нужен агрегат? Не думайте слишком сложно: BIND(if(?SAVINGS_1_VALUE > ?SAVINGS_2_VALUE, if(?SAVINGS_1_VALUE > ?SAVINGS_3_VALUE, ?SAVINGS_1_VALUE, ?SAVINGS_3_VALUE), ?SAVINGS_2_VALUE) as ?MAXIMUM) — Обратите внимание, это непроверено, поскольку вы не предоставили данные в надлежащем формате Turtle, а я слишком ленив, чтобы конвертировать ваши данные

2. Что делать, если существует 100 таких значений экономии. Привязка if не является опцией для данных, на которых я пытаюсь это реализовать! Есть ли какой-либо другой способ, которым существующий процессор может справиться с этим?

3. Я не понимаю, почему ПРИВЯЗКА не является вариантом, это, безусловно, самый очевидный и, вероятно, самый эффективный способ… и если у вас есть 100 сохраняемых значений, вам нужно добавить 100 переменных проекции и 100 тройных шаблонов, то есть 100 соединений во время оценки — звучит странно.

4. В любом случае, вы могли бы попробовать UNION все значения, а затем GROUP BY ИМЯ, может быть, просто использовать VALUES так и выполнить группировку. Например, VALUES ?p {SAVINGS_1 SAVINGS_2 ... SAVINGS_N} ?NAME ?p ?v . } даст вам все значения, привязанные к одной переменной. Но тогда вам придется использовать group by для всех ваших переменных прогнозов…

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