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 }
  ]
}