我有一个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
可能会有帮助
问题;
你能帮我调整我的查询,以产生正确的输出(见下文)?请评论,如果有任何需要消除歧义或澄清
预期输出
输入:
- 三重格式**:
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
之外存在什么"rel"键的先验知识。对于每个src
参数,将存在一个三元组<src> id <src>
。
[2]对象应具有以下格式。id
不能被覆盖。
{
id: <id>
<distinct rel>: [
< tgt >
]
}
1条答案
按热度按时间zhte4eai1#
| 实体|
| - ------|
| {“讨厌”:[“巧克力”],“身份”:“爱丽丝”,“是”:[“人”]}|
| {“年龄”:[“20”],“身份证”:“鲍勃”,“是”:[“人”],“喜欢”:[“蛋糕”,“巧克力”]}|
fiddle
您***必须***在两个步骤中进行聚合,因为您编辑的代码***不会***将
cake
和chocolate
合并到一个包含两个元素的数组中...