GraphQL解析多个接口
我正在使用本机图形数据库 我的数据对象由许多较小的属性集组成,我希望能够一次查询所有属性,而无需在模式中添加额外的人工层。这些属性定义得很好,但它们的组成却不是 假设从查询中输出此对象对我来说很简单:GraphQL解析多个接口,graphql,graph-databases,graphql-js,Graphql,Graph Databases,Graphql Js,我正在使用本机图形数据库 我的数据对象由许多较小的属性集组成,我希望能够一次查询所有属性,而无需在模式中添加额外的人工层。这些属性定义得很好,但它们的组成却不是 假设从查询中输出此对象对我来说很简单: { "name": "Zapdos", "wingspan": 40, "airspeed": 120, "maxVoltage": 100000000 } 假设翼展和风速属性来自飞行类型属性,而最大电压来自电气类型属性。这些属性和其他属性定义良好。其他口袋妖怪可能会混合和匹配应
{
"name": "Zapdos",
"wingspan": 40,
"airspeed": 120,
"maxVoltage": 100000000
}
假设翼展
和风速
属性来自飞行类型
属性,而最大电压
来自电气类型
属性。这些属性和其他属性定义良好。其他口袋妖怪可能会混合和匹配应用于它们的属性,定义它们的所有组合可能没有意义
理想情景
是否可以运行以下查询并获取相同格式的数据
graphql js
是否必须处理resolveType
函数返回的数组?默认的resolveType
函数是否在调用isTypeOf
的第一个真值时停止
query {
Pokemon(name: "Zapdos") {
name
... on isFlyingType {
wingspan
airVelocity
}
... on isElectricType {
maxVoltage
}
}
}
可能是什么情况
我真的需要用我所需要的一切来构建一个新类型吗?我有许多组成我的数据的属性,这意味着要考虑接口的每个组合需要很多类型。我必须做以下事情吗
type FlyingElectricPokemon implements isPokemon, isFlyingType, isElectricType {
name: String!
wingspan: Int
airVelocity: Int
maxVoltage: Int
}
我是不是为了避免在我的弱类型图形数据上使用GraphQL的强类型而太过努力了
解决问题,但增加复杂性
我希望避免以下情况,以增加复杂性:
type Query {
Pokemon(name: String): Pokemon
}
type Pokemon {
name: String!
attributes: [isAttribute!]
}
interface isAttribute {
type: String!
}
type FlyingType implements isAttribute {
type: String!
wingspan: Int
}
type ElectricType implements isAttribute {
type: String!
maxVoltage: Int
}
需要以下格式的数据
{
"name": "Zapdos",
"attributes": [
{ "type": "flying", "wingspan": 40 },
{ "type": "electric", "maxVoltage": 100000000 }
]
}
这后一点我真的要做了。这是一个有趣的场景。我不认为香草GraphQL真的提供了一个工具来实现您所描述的。问题是,最终返回的任何对象必须只有一种类型
\uuuuResolveType
无法返回数组,即使您为多个类型声明了一个\uuuuIsTypeof
,这些类型将对给定对象求值为true,但只有第一个求值为true的类型将与该特定对象相关联
最后,如果您打算返回可能属性的子集(基于Pokemon的一种或多种类型),最简单的解决方案可能是将所有可能的属性放入Pokemon
类型的字段中,而不必担心在类型周围实现接口。这实现了响应中所需的平面数据结构。最大的缺点是,作为响应的一部分,可能会返回大量空字段
您还可以研究类似的东西,它支持类型继承和泛型。我只建议将相关类型分组到接口中,然后使用联合来弥补任何差距。如果给我一个选择,我会选择工会,因为他们不会花费太多的开销来进行推理。我不能给出具体的建议,因为您没有给出整个API,但它看起来有点笨拙。有时重温1000英尺的图片是有帮助的(如果你还没有太投入的话)谢谢你。我还意识到,如果没有多态输入类型,我也无法创建突变。我现在正在研究如何将属性组(每个属性组都是图上的一条边)查询到属性数组中。然后,我可以为每个属性创建一个变异,将相同的ID传递给多个属性以更新父对象(图上的节点)。令人惊讶的是,这种变异的输入对象应该适用于DBs语言。
query {
Pokemon(name: "Zapdos") {
name
attributes {
... on FlyingType {
wingspan
airVelocity
}
... on ElectricType {
maxVoltage
}
}
}
}
{
"name": "Zapdos",
"attributes": [
{ "type": "flying", "wingspan": 40 },
{ "type": "electric", "maxVoltage": 100000000 }
]
}