gpt4 book ai didi

graphql - 如何在GraphQL中为递归数据结构建模

转载 作者:行者123 更新时间:2023-12-03 20:50:05 29 4
gpt4 key购买 nike

我有一个树数据结构,我想通过GraphQL API返回。

该结构不是特别大(足够小不会在一次调用中将其返回)。

没有设置结构的最大深度。

我已经将结构建模为:

type Tag{
id: String!
children: [Tag]
}

当人们想要使标签达到任意深度时,就会出现问题。

为了使所有子级都达到(例如)3级,可以编写如下查询:

{
tags {
id
children {
id
children {
id
}
}
}
}

有没有办法编写查询以将所有标签返回到任意深度?

如果不是这样,建议使用什么方法在GraphQL API中对类似于上述结构的结构进行建模。

最佳答案

前一段时间,我想出了另一种解决方案,就像@WuDo建议的一样。

想法是使用ID引用树(每个有其父级的 child )并在ID上平整树,并标记树的根,然后在客户端再次递归地构建树。

这样,您不必担心像@samcorcos的答案那样限制查询的深度。

模式:

type Query {
tags: [Tag]
}

type Tag {
id: ID!
children: [ID]
root: Boolean
}

响应:
{ 
"tags": [
{"id": "1", "children": ["2"], "root": true},
{"id": "2", "children": [], "root": false}
]
}

客户端树构建:
import find from 'lodash/find';
import isArray from 'lodash/isArray';

const rootTags = [...tags.map(obj => {...obj)}.filter(tag => tag.root === true)];
const mapChildren = childId => {
const tag = find(tags, tag => tag.id === childId) || null;

if (isArray(tag.children) && tag.children.length > 0) {
tag.children = tag.children.map(mapChildren).filter(tag => tag !== null);
}
}
const tagTree = rootTags.map(tag => {
tag.children = tag.children.map(mapChildren).filter(tag => tag !== null);
return tag;
});

关于graphql - 如何在GraphQL中为递归数据结构建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44746923/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com