繁体   English   中英

在 Sqlite JSON1 中将三元组转换为对象表

[英]Convert triple-triple to object-table in Sqlite JSON1

我有一个 Sqlite 表triples ,其中包含{ id, rel, tgt }格式的三元组信息 [1]。 我想创建一个视图,将这种三重格式数据公开为“对象格式”,从该数据库读取的应用程序更容易使用这种格式。 理论上 sqlite 的 JSON1 扩展允许我构建这样的对象,但我正在努力。

我当前的查询

select distinct json_object(
  'id', id,
  rel, json_group_array(distinct tgt)
) as entity from content
group by src, rel, tgt
order by src, rel, tgt

无法正常工作。 它产生像这样的对象

{ id: 'a', 'is': ['b'] }
{ id: 'a', 'is': ['c'] }

而不是

{ id: 'a', 'is': ['b', 'c'] }

它还会产生重复的键,例如

{ id: 'a', id: ['a'] } 

编辑

这更接近,但不能正确处理 ID。 它构造一个数组,而不是一个字符串

create view if not exists entity as
  select distinct json_group_object(
    rel, json_array(distinct tgt)
  ) as entity from content
  group by src

我认为iif可能会有所帮助

题;

你能帮我调整查询以生成正确的 output(见下文)吗? 如果有任何需要消除歧义或澄清的地方,请发表评论

所需 Output

输入:

三重格式

id   | rel   | tgt
-----------------------
Bob   | is     | Bob
Bob   | is     | Person
Bob   | age    | 20
Bob   | likes  | cake
Bob   | likes  | chocolate
Alice | id     | Alice
Alice | is     | Person
Alice | hates  | chocolate

Output:

Object 格式[2]:

{
  id:    Bob,
  is:    [ Person ],
  age:   [ 20 ],
  likes: [ cake, chocolate ]
}

{
  id:    Alice,
  is:    [ Person ],
  hates: [ chocolate ]
}

细节

[1] 该数据集具有不可预测的结构; 我可以假设没有关于id之外存在哪些“rel”键的先验知识。 每个src参数都将存在一个三重<src> id <src>

[2] 对象应具有以下格式。 id不能被覆盖。

{ 
  id: <id>
  <distinct rel>: [ 
    < tgt >
  ]
}

相关信息

CREATE TABLE content (
  id    VARCHAR(32),
  rel   VARCHAR(32),
  tgt   VARCHAR(32)
);
INSERT INTO
  content
VALUES
  ('Bob'  , 'id'   , 'Bob'),
  ('Bob'  , 'is'   , 'Person'),
  ('Bob'  , 'age'  , '20'),
  ('Bob'  , 'likes', 'cake'),
  ('Bob'  , 'likes', 'chocolate'),
  ('Alice', 'id'   , 'Alice'),
  ('Alice', 'is'   , 'Person'),
  ('Alice', 'hates', 'chocolate')
WITH
  id_rel AS
(
  SELECT
    id,
    rel,
    JSON_GROUP_ARRAY(tgt)  AS tgt
  FROM
    content
  GROUP BY
    id,
    rel
)
SELECT
  JSON_GROUP_OBJECT(
    rel,
    CASE WHEN rel='id'
         THEN JSON(tgt)->0
         ELSE JSON(tgt)
    END
  )
    AS entity
FROM
  id_rel
GROUP BY
  id
ORDER BY
  id
实体
{“讨厌”:[“巧克力”],“id”:“爱丽丝”,“是”:[“人”]}
{"age":["20"],"id":"Bob","is":["Person"],"likes":["cake","chocolate"]}

小提琴

必须分两步进行聚合,因为您编辑的代码不会cakechocolate组合成一个包含两个元素的数组......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM