Apollo Federation

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

本指南展示了如何使用 Neo4j GraphQL 库创建子图,以便通过 Apollo 联邦组合成超级图。

目标是将以下单体模式转换为子图模式,以在联邦网关后使用。

import { ApolloServer } from "@apollo/server";
import { startStandaloneServer } from "@apollo/server/standalone";
import { Neo4jGraphQL } from "@neo4j/graphql";
import neo4j from "neo4j-driver";

const typeDefs = `#graphql
  type User @node {
    id: ID!
    name: String!
  }
`;

const driver = neo4j.driver(NEO4J_URI, neo4j.auth.basic("username", "password"));

const neo4jGraphQL = new Neo4jGraphQL({
  typeDefs,
  driver,
})

const schema = await neo4jGraphQL.getSchema();

const server = new ApolloServer({
  schema,
});

const { url } = await startStandaloneServer(server);
console.log(`🚀  Server ready at ${url}`);

设置

要继续转换,请按以下步骤操作

  1. 为新项目创建一个目录并 cd 进入该目录

    mkdir neo4j-graphql-subgraph-example
    cd neo4j-graphql-subgraph-example
  2. 使用 npm 初始化一个新的 Node.js 项目

    npm init --yes
    npm pkg set type="module"

    本操作指南使用 ES 模块搭建项目,这允许使用诸如顶层 await 等特性。

  3. 选择 TypeScript 或 JavaScript 继续设置

  1. 创建一个 src 目录,并在其中放置一个空的 index.js 文件作为代码入口点

    mkdir src
    touch src/index.js
  2. package.json 文件中默认的 scripts 条目替换为以下内容

    {
      // ...etc.
      "scripts": {
        "start": "node index.js"
      }
      // other dependencies
    }
  1. 创建一个 src 目录,并放置一个空的 index.ts 文件作为代码入口点

    mkdir src
    touch src/index.ts
  2. 安装在 TypeScript 项目中工作所需的开发依赖

    npm install --save-dev typescript @types/node @tsconfig/node-lts
  3. 创建一个空的 tsconfig.json 文件,用于存放 TypeScript 的编译器配置

    touch tsconfig.json
  4. 在 tsconfig.json 文件中添加如下配置

    {
      "extends": "@tsconfig/node-lts/tsconfig.json",
      "compilerOptions": {
        "rootDir": "src",
        "outDir": "dist",
      }
    }

    此配置扩展了 Node.js LTS 社区基础,该基础由上面安装的 @tsconfig/node-lts 包提供。有关可用选项的更多信息,请参阅 TypeScript 编译器文档

  5. 将 package.json 中默认的 scripts 条目替换为以下内容

    {
      // ...etc.
      "scripts": {
        "compile": "tsc",
        "start": "npm run compile && node ./dist/index.js"
      }
      // other dependencies
    }
  1. 要继续设置,请运行以下命令安装所需的依赖

    npm install @apollo/server @neo4j/graphql graphql neo4j-driver

    需要安装的依赖如下

    • @apollo/server 是 Apollo Server 的库,在本指南中用于托管子图。

    • @neo4j/graphql 是 Neo4j GraphQL 库,它将 GraphQL 转换为 Cypher 并返回结果。

    • graphql 是 GraphQL 规范的参考实现。@neo4j/graphql 正常工作需要它。

    • neo4j-driver 是 Neo4j 驱动的库,执行针对数据库的 Cypher 查询时需要它。

加入联邦

要使一组类型定义能够作为联邦的子图使用,必须包含以下模式扩展

const typeDefs = `#graphql
  extend schema @link(url: "https://specs.apollo.dev/federation/v2.0", import: ["@key"])

  type User @node {
    id: ID!
    name: String!
  }
`;

此示例仅包含 Federation @key 指令。如需使用更多 Federation 指令,请将它们添加到 import 数组中。

定义实体

将类型定义为 实体,可以让其他子图向 Movie 类型贡献字段。为此,请使用 @key 指令将字段(或字段集合)指定为键。

const typeDefs = `#graphql
  extend schema @link(url: "https://specs.apollo.dev/federation/v2.0", import: ["@key"])

  type User @key(fields: "id") @node {
    id: ID!
    name: String!
  }
`;

虽然本示例仅添加了 @key 指令,但建议在 id 字段上使用 @id 指令。联邦网关期望每个键只能解析为唯一结果,因此确保这些值在数据库中唯一是良好实践。

生成子图模式

使用 Neo4j GraphQL 库时,可通过调用 getSubgraphSchema 而不是 getSchema 来生成子图模式。为此,需要将以下代码行进行修改

const schema = neo4jGraphql.getSubgraphSchema();

结论

将所有前面的代码片段组合起来,您应该得到如下内容

import { ApolloServer } from "@apollo/server";
import { startStandaloneServer } from "@apollo/server/standalone";
import { Neo4jGraphQL } from "@neo4j/graphql";

const typeDefs = `#graphql
  type User @key(fields: "id") @node {
    id: ID!
    name: String!
  }
`;

const driver = neo4j.driver("bolt://:7687", neo4j.auth.basic("username", "password"));

const neo4jGraphQL = new Neo4jGraphQL({
  typeDefs,
  driver,
})

const schema = await neo4jGraphQL.getSubgraphSchema();

const server = new ApolloServer({
  schema,
});

const { url } = await startStandaloneServer(server);
console.log(`🚀  Server ready at ${url}`);

在进一步迭代时,此子图也可以组成超级图。请查阅 Apollo 的指南获取更多说明