GraphQL如何查询多态关系?

GraphQL如何查询多态关系?,graphql,relationship,Graphql,Relationship,假设我有一个“爸爸”实体,它可能引用一个“儿子”或“女儿”实体 我想构建一个graph ql查询,它将获取爸爸的名字+孩子的名字(儿子或女儿) 我发现使用碎片可能是一种方法: { DadCollection { items { name child { __typename ...Son{ name } ...Daughter{ name }

假设我有一个“爸爸”实体,它可能引用一个“儿子”或“女儿”实体

我想构建一个graph ql查询,它将获取爸爸的名字+孩子的名字(儿子或女儿)

我发现使用碎片可能是一种方法:

{
  DadCollection {
    items {
      name
      child {
        __typename
        ...Son{
          name
        }
        ...Daughter{
          name
        }
      }
    }
  }
}
只是想知道是否有更优雅的方式来执行上述查询,以避免代码冗余, 或者如果有更好的方法获取信息


还有。。。这是graphQL的一般行为,还是取决于此特定graphQL架构服务器实例是如何配置为检索数据的?

这归结为单个架构

GraphQL有两种抽象类型——接口和联合。字段可以返回抽象类型,但该类型必须在运行时始终解析为对象类型。联合和接口在功能上是相同的,只是有两个区别:1)联合显式定义其可能的类型,而类型必须显式实现接口;接口定义了一组所有实现类型都必须具有的公共字段

后一个区别的含义是,在查询接口字段时,在查询共享字段**时,不必使用片段来指定可能的类型*。换句话说,对联合字段的查询如下所示:

query {
  someUnion {
    # no fields allowed outside fragments
    ... on Foo {
      foo
    }
    ... on Bar {
      bar
    }
  }
}
query {
  someInterface {
    aCommonField
    anotherCommonField
    ... on Foo {
      foo
    }
    ... on Bar {
      bar
    }
  }
}
对接口字段的查询可能如下所示:

query {
  someUnion {
    # no fields allowed outside fragments
    ... on Foo {
      foo
    }
    ... on Bar {
      bar
    }
  }
}
query {
  someInterface {
    aCommonField
    anotherCommonField
    ... on Foo {
      foo
    }
    ... on Bar {
      bar
    }
  }
}
然而需要注意的是,仅仅因为两种类型共享一个字段,并且两种类型都实现了一个接口,并不一定意味着该字段就是接口上的字段。仅仅让字段成为通用字段来执行上述查询是不够的——它们必须明确地成为接口定义的一部分


因此,实际上是否可以避免为每个内联片段键入
name
,取决于1)字段是否是接口,2)所讨论的字段是否是接口定义的一部分。

这归结为单个模式

GraphQL有两种抽象类型——接口和联合。字段可以返回抽象类型,但该类型必须在运行时始终解析为对象类型。联合和接口在功能上是相同的,只是有两个区别:1)联合显式定义其可能的类型,而类型必须显式实现接口;接口定义了一组所有实现类型都必须具有的公共字段

后一个区别的含义是,在查询接口字段时,在查询共享字段**时,不必使用片段来指定可能的类型*。换句话说,对联合字段的查询如下所示:

query {
  someUnion {
    # no fields allowed outside fragments
    ... on Foo {
      foo
    }
    ... on Bar {
      bar
    }
  }
}
query {
  someInterface {
    aCommonField
    anotherCommonField
    ... on Foo {
      foo
    }
    ... on Bar {
      bar
    }
  }
}
对接口字段的查询可能如下所示:

query {
  someUnion {
    # no fields allowed outside fragments
    ... on Foo {
      foo
    }
    ... on Bar {
      bar
    }
  }
}
query {
  someInterface {
    aCommonField
    anotherCommonField
    ... on Foo {
      foo
    }
    ... on Bar {
      bar
    }
  }
}
然而需要注意的是,仅仅因为两种类型共享一个字段,并且两种类型都实现了一个接口,并不一定意味着该字段就是接口上的字段。仅仅让字段成为通用字段来执行上述查询是不够的——它们必须明确地成为接口定义的一部分


因此,您是否可以实际上避免为每个内联片段键入
name
,这取决于1)字段是否是接口,2)所讨论的字段是否是接口定义的一部分。

您正在谈论的服务器实例的架构是什么?(对于相关类型)@wazner这是一个托管系统,我实际上没有访问服务器或架构定义的权限。但是要有一个GraphiQLUI来查询服务器。您所说的服务器实例的模式是什么?(对于相关类型)@wazner这是一个托管系统,我实际上没有访问服务器或架构定义的权限。但是有一个GraphiQL用户界面来查询服务器。谢谢你的解释。所以。。。因为查询接口给了我一个错误(看起来公共字段是不允许的)。我想我会坚持使用带有片段的原始查询联合。是否有一些graphQL语法可以知道字段的类型,或者我只能通过尝试查询来确定?通过graphiQL文档管理器,我可以看到:Dad的字段是child(preview:Boolean,locale:String):DadChild,并且DadChild可能有子类型和子类型。但它并没有说明什么是接口或联合。
DadChild
会列出字段以及可能的类型(如果它是接口)。如果没有列出任何字段,那么这就是一个联合。我发现了这篇有趣的文章:他们解释了如何运行一个脚本来构建碎片类型并获取所需的所有细节。谢谢你的解释。所以。。。因为查询接口给了我一个错误(看起来公共字段是不允许的)。我想我会坚持使用带有片段的原始查询联合。是否有一些graphQL语法可以知道字段的类型,或者我只能通过尝试查询来确定?通过graphiQL文档管理器,我可以看到:Dad的字段是child(preview:Boolean,locale:String):DadChild,并且DadChild可能有子类型和子类型。但它并没有说明什么是接口或联合。
DadChild
会列出字段以及可能的类型(如果它是接口)。我发现了这篇有趣的文章:它们解释了如何运行一个脚本来构建碎片类型并获取所需的所有细节。