2016-01-15 11 views
1

Я очень новшество для технологий баз данных XML, Xquery/Xpath и т. Д. Так что это, вероятно, очень новичок вопрос.Как сохранить результаты XQuery в качестве нового документа в BaseX

Сценарий: на эти XML-документы (с использованием XQuery) можно запустить несколько XML-документов в качестве ввода, которые хотят запустить некоторое количество преобразований. Я хотел бы сохранить эти результаты. В том же хранилище данных XML, что и вход.

До сих пор я экспериментирую с использованием базы данных документов BaseX для хранения и обработки этих XML-документов, и до сих пор с ней было очень легко работать, я впечатлен.

В идеале я хотел бы взаимодействовать с BaseX с помощью XQJ API (http://xqj.net/basex/), поскольку мои рассуждения состоят в том, что XQJ будет поддерживать реализацию кода приложения независимо от BaseX, как может быть. Вторичный вариант будет писать мой Java-код непосредственно в BaseX API.

Проблема: Мне трудно понять, как сохранить результаты из XQuery в качестве нового «документа» в базе данных. Возможно, это скорее концептуальное отсутствие понимания с XQuery (или XQuery Update), чем любая проблема с API BaseX/XQJ.

В этом простом примере, если у меня есть запрос, как это, он возвращает некоторый вывод XML с в формате, который я хочу для моего нового документа

let $items := //firstName 
return <results> 
    { for $item in $items 
    return <result> {$item} </result> 
    } 
    </results> 

дает

<results> 
    <result> 
    <firstName>Bob</firstName> 
    </result> 
    <result> 
    <firstName>Joe</firstName> 
    </result> 
    <result> 
    <firstName>Tom</firstName> 
    </result> 
</results> 

Я хочу сохраните этот новый документ <result> обратно в базу данных, для использования в последующих запросах/преобразованиях и т. д. В SQL это имеет смысл для меня. Я бы сделал CREATE TABLE <name> SELECT <query> или INSERT INTO и т. Д. Но я не понимаю, что эквивалентно в XQuery. Я думаю, что функция XQuery Update - это то, что мне нужно здесь, но мне трудно найти конкретные примеры.

Это еще сложнее, когда дело с XQJ

XQResultSequence rs = xqe.executeQuery("//firstName"); 
// what do i do with it now?? 

Есть ли способ сохраняться этот XQResultSequence обратно в базу данных с помощью Basex? Или еще лучше, могу ли я запустить дополнительные XQueries непосредственно на XQResultSequence?

Спасибо за помощь!

ответ

2

Basex реализует XQuery Update Facility, так что вы должны быть в состоянии использовать fn:put:

let $items := //firstName 
return fn:put(
    <results>{ 
    for $item in $items 
    return <result> {$item} </result> 
    }</results>, 
    "/results/result-new.xml") 

Если вы работаете простые незапланированные запросы, как выше, он должен быть достаточно простым. Я не очень хорошо знаком с XQJ, но если вы хотите запускать запросы в последовательности, я подозреваю, что есть способ передать эти переменные XQResultSequence обратно в новый запрос, в котором вы, вероятно, согласитесь с ним, объявив переменную как внешнюю в следующем запросе:

declare variable $previous-result as item()* external; 
+0

Спасибо, используя функцию «fn: put» для меня. По крайней мере, я могу получить выходной файл * .xml, но похоже, что мне придется затем импортировать полученный файл обратно в базу данных для дальнейшей обработки. Есть ли способ пропустить этот промежуточный шаг? – barab157

+0

Я думаю, что нашел хорошее решение, используя пример клиента Java Base Base \t \t 'String results = session.execute (" xquery "+ QUERY_STRING); \t \t \t session.add ("Результаты/Results.xml", новый ByteArrayInputStream (results.getBytes())); ' – barab157

+1

@ barab157 То, что я собирался предложить просто делать все, что нужно в одном запросе. Это вопрос предпочтения, но я думаю, что чистое отделение от базы данных и промежуточного программного обеспечения делает приложения более удобными и эффективными. Но если вы нашли хороший способ сделать это на Java, пожалуйста, продолжайте и разместите свой ответ здесь. – wst

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

  • Нет связанных вопросов^_^