Sparql - запросы на удаление перестают работать после обновления

Я создал приложение, которое работает с модулями openrdf sesame и owlim. Недавно мне нужно было обновить лицензионный ключ на owlim (я получил ключ для самой новой версии owlim), поэтому я был вынужден обновить и sesame.

Приложение было создано с использованием sesame 2.6.0 и owlim 4.3, теперь обновлено до sesame 2.6.8 и owlim 5.2.

Есть проблемы с удалением sparql-запросов, которые работают в более старой версии, поэтому у меня есть подозрение, что проблема заключается в обновлении.

Вот один из таких запросов:

PREFIX oporg: <http://sesame.company.org/OPropertiesOrg#>

WITH <users:>
DELETE {
?userID oporg:sessionID ?sessionID
}
INSERT {
?userID oporg:sessionID "qafnsi9p1172c0dprf9e4bhm23"
}
WHERE{
?userID oporg:name "admin"
}

это должно (согласно тому, что я помню :) удалить каждую тройку sessionID с userID=admin и вставить новую тройку sessionID.

Вставить часть работает, а удалить часть - нет.


person apocalypz    schedule 02.08.2012    source источник


Ответы (1)


Причина, по которой это больше не работает, заключается в том, что ваше предложение DELETE содержит переменную (?sessionID), которая никогда и нигде не привязана к значению, поэтому во время оценки операции это преобразуется в неполный тройной шаблон и игнорируется.

В более ранних версиях Sesame несвязанная переменная в предложении DELETE интерпретировалась как подстановочный знак. Однако это противоречит спецификации SPARQL и поэтому было исправлено как ошибка в выпуске Sesame 2.6.7. См. http://www.openrdf.org/issues/browse/SES-1047 для подробностей.

Вам следует немного изменить операцию DELETE, добавив шаблон ?sessionID в предложение WHERE, например:

PREFIX oporg: <http://sesame.company.org/OPropertiesOrg#>

WITH <users:>
DELETE {
   ?userID oporg:sessionID ?sessionID
}
INSERT {
   ?userID oporg:sessionID "qafnsi9p1172c0dprf9e4bhm23"
}
WHERE{
   ?userID oporg:name "admin" ; 
           oporg:sessionID ?sessionID .
}
person Jeen Broekstra    schedule 03.08.2012
comment
Лол, у меня недостаточно репутации, чтобы голосовать. Так что спасибо, ваш ответ был правильным, и теперь он работает. - person apocalypz; 03.08.2012