#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 не очень хорошо визуализирует данные, и в этом случае выполнение постобработки на стороне клиента может быть более перспективным.