[英]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(见下文)吗? 如果有任何需要消除歧义或澄清的地方,请发表评论
输入:
三重格式:
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"]} |
您必须分两步进行聚合,因为您编辑的代码不会将cake
和chocolate
组合成一个包含两个元素的数组......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.