2015-06-13 1 views
2

Я пытаюсь выполнить следующий запрос в Basex,Basex: Обновления не записываются обратно

let $c := doc('t.xq')//entry return (replace value of node $c/author with 'BaseX') 

Входной файл t.xq является

<entry> 
    <title>Transform expression example</title> 
    <author>BaseX Team</author> 
    </entry> 

Я ожидаю, что возвращать измененные данные, но он выполняет и ничего не возвращает. он говорит Updates are not written back

Как я могу увидеть измененный entry? какие команды возвращают измененные данные?

ответ

3

Цитируется из http://docs.basex.org/wiki/XQuery_Update:

В Basex, все обновления выполняются на узлах базы данных или в основной памяти . По умолчанию операции обновления не влияют на исходный файл ввода (информация о запросе «Обновления не записаны») отображается в запросе , чтобы указать это). Следующие решения существуют, чтобы написать XML документов и двоичные ресурсы на диск:

  • Обновление на случаях основной памяти файлов, которые были извлечены с помощью Fn: документ или Fn: сбор будет распространяться обратно на диск , когда Опция WRITEBACK включена. Эта опция также может быть активирована в командной строке через -u. Перед выполнением запросов убедитесь, что вы создали резервные копии исходных документов .
  • Такие функции, как fn: put или file: write могут использоваться для записи отдельных документов XML на диск. С файлом: write-binary вы можете написать двоичные ресурсы .
  • Команда EXPORT может использоваться для записи всех ресурсов баз данных на диск.

Однако, если вам нужно только, чтобы получить выход на команду обновления вы можете скопировать его в переменную (в памяти) и преобразовать эту переменную следующим образом:

copy $c := doc('t.xq')//entry 
modify (
    replace value of node $c/author with 'BaseX' 
) 
return $c 

Вы также можете используйте update, который является удобным оператором для написания простых выражений преобразования.

doc('t.xq')//entry update replace value of node ./author with 'BaseX' 
+1

Обратите внимание, что Basex имеет сокращенный 'update' ключевого слова (см http://docs.basex.org/wiki/XQuery_Update#update) упростить выражение преобразования. Ваш код такой же, как 'doc ('t.xq') // обновление для входа заменить значение узла ./author с 'BaseX'' – dirkk

+0

Я нашел это немного странным, так как если по умолчанию входные ресурсы просто« загружены » »и никогда не трогали снова, зачем вообще поддерживать ссылку на исходные ресурсы? Настоящей базой данных являются файлы данных, которые находятся внутри '~/BaseXData'. Вместо добавления ресурсов в БД его следует просто называть «импортом» как противоположность «export». – CMCDragonkai