在Sqlite JSON1中将triple-triple转换为对象表



我有一个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可能会有帮助

问题;

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

期望输出值

输入:

<三格式/strong>:

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

输出:

对象格式[2]:

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

详细信息[1]这个数据集具有不可预测的结构;我可以假设没有关于id之外存在什么"真实"键的先验知识。每个src参数都存在一个三重<src> id <src>

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

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

相关信息
  • https://www.sqlite.org/json1.html

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
tbody><{"hates":["chocolate"],"id":"Alice","女儿家;:["Person"]}{"age":"20","id":"Bob","女儿家;:["Person"],"likes":["cake","chocolate"]}

最新更新