Как импортировать файл JSON в коллекцию JSONiq?

Я искал повсюду, и даже в документации JSONiq говорится, что "это выходит за рамки этого документа". У меня есть файл JSON (массив объектов JSON), который я хочу импортировать в JSONiq (в частности, в Zorba, что, кстати, является ужасным именем, поскольку делает поиск информации в Интернете бесполезным) для использования в качестве коллекции для запроса. Есть ли учебник, или спецификация, или еще что-нибудь, что говорит мне, как это сделать?

1 ответ

Решение

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

Если сценарий использования - просто запрос файла JSON, хранящегося на вашем локальном диске, тогда может быть проще использовать файловый модуль EXPath, а также parse-json, например, так:

jsoniq version "1.0";

import module namespace file = "http://expath.org/ns/file";

let $my-object := parse-json(file:read-text("/path/to/document.json"))
return $my-object.foo

Приведенный выше запрос возвращает "bar" если /path/to/document.json содержит

{ "foo" : "bar" } 

parse-json предоставляет дополнительные параметры для анализа документов с несколькими объектами (строки JSON и т. д.).

Для опытных пользователей, вот как использовать коллекции, чтобы избежать чтения файлов каждый раз:

jsoniq version "1.0";

import module namespace file = "http://expath.org/ns/file";
import module namespace ddl = "http://zorba.io/modules/store/dynamic/collections/ddl";
import module namespace dml = "http://zorba.io/modules/store/dynamic/collections/dml";

(: Populating the collection :)
variable $my-collection := QName("my-collection");
ddl:create($my-collection, parse-json(file:read-text("/tmp/doc.json")));

(: And now the query :)

for $object in dml:collection($my-collection)
group by $value := $object.foo
return {
  "value" : $value,
  "count" : count($object)
}

Это /tmp/doc.json:

{ "foo" : "bar" }
{ "foo" : "bar" }
{ "foo" : "foo" }
{ "foo" : "foobar" }
{ "foo" : "foobar" }

И запрос выше возвращает:

{ "value" : "bar", "count" : 2 }
{ "value" : "foobar", "count" : 2 }
{ "value" : "foo", "count" : 1 }

Для полноты картины, для Rumble, распределенной реализации JSONiq на Spark, файлы JSON читаются с помощью json-doc() (при распределении по нескольким строкам) или json-line() (где есть одно значение JSON на строку, на возможно миллиарды строк).

Другие вопросы по тегам