Relay 兼容性

这是 GraphQL Library 7 版本的文档。对于长期支持 (LTS) 版本 5,请参考 GraphQL Library 5 LTS 版本

Relay GraphQL 服务器规范规定,为了让服务器兼容 Relay,必须提供

  1. 用于重新获取对象的机制。

  2. 对连接进行分页的描述。

Neo4j GraphQL 库开箱即提供对连接进行分页的描述。然而,要让它提供重新获取对象的机制则需要进行配置,本文档对此进行详细说明。

对象标识

为了让 Relay 客户端能够重新获取对象,每种类型必须拥有唯一的对象标识符以供使用。服务器通过让类型实现 Node 指令来告知 Relay 客户端该要求已满足,Node 指令的定义如下

interface Node {
  id: ID!
}

例如,类型 Book 的定义可能是

type Book implements Node @node {
  id: ID!
  isbn: String!
}

有了此定义,Relay 客户端即可使用 node 查询字段重新获取 Book 对象。下面的章节将介绍如何在 Neo4j GraphQL 库中实现该功能。

@relayId

Neo4j GraphQL 库对必需的 id 字段提供了抽象,使数据库中任意唯一属性的值都可以作为对象标识符。这通过 @relayId 指令实现。

定义

@relayId 指令的定义如下

directive @relayId on FIELD_DEFINITION

使用

对于图书而言,ISBN 通常是唯一标识符

type Book @node {
  isbn: String! @relayId
}

当模式被增强后,该类型的输出为

type Book implements Node @node {
  id: ID!
  isbn: String!
}

使用 id 字段时,isbn 是数据库中实际使用的属性。同时,Book 类型现在可以通过 node 查询字段重新获取,已准备好与 Relay 客户端配合使用。

@relayId 指令并不保证唯一性。