如何将 JSON 文件导入 JSONiq 集合?

How do I import a JSON file into a JSONiq collection?

我到处都看了,甚至 JSONiq 文档也说 "this is beyond the scope of this document." 我有一个 JSON 文件(一个 JSON 对象的数组)我想导入进入 JSONiq(特别是 Zorba,顺便说一句,这是一个糟糕的名字,因为它使 Internet 搜索信息变得徒劳)用作查询的集合。是否有教程、规范或任何地方告诉我如何执行此操作?

Zorba 支持将文档添加到集合中。这样做的框架记录在案 here。但是请注意,Zorba 是一种内存存储,不会保留超出一个查询范围的任何内容,因此如果没有持久层,它的用途有限。

如果用例只是查询存储在本地驱动器上的 JSON 文件,那么使用 EXPath's file module as well as 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

以上查询returns "bar" if /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" }

和上面的查询 returns:

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

为了完整起见,对于 Rumble,Spark 上的分布式 JSONiq 实现,JSON 文件使用 json-doc() 读取(当分布在多行)或 json-line()(其中每行有一个 JSON 值,可能有数十亿行)。