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}`);
设置
要继续转换,请按以下步骤操作
-
为新项目创建一个目录并
cd进入该目录mkdir neo4j-graphql-subgraph-example cd neo4j-graphql-subgraph-example -
使用
npm初始化一个新的 Node.js 项目npm init --yes npm pkg set type="module"本操作指南使用 ES 模块搭建项目,这允许使用诸如顶层
await等特性。 -
选择 TypeScript 或 JavaScript 继续设置
-
创建一个
src目录,并在其中放置一个空的index.js文件作为代码入口点mkdir src touch src/index.js -
将
package.json文件中默认的scripts条目替换为以下内容{ // ...etc. "scripts": { "start": "node index.js" } // other dependencies }
-
创建一个 src 目录,并放置一个空的
index.ts文件作为代码入口点mkdir src touch src/index.ts -
安装在 TypeScript 项目中工作所需的开发依赖
npm install --save-dev typescript @types/node @tsconfig/node-lts -
创建一个空的 tsconfig.json 文件,用于存放 TypeScript 的编译器配置
touch tsconfig.json -
在 tsconfig.json 文件中添加如下配置
{ "extends": "@tsconfig/node-lts/tsconfig.json", "compilerOptions": { "rootDir": "src", "outDir": "dist", } }此配置扩展了 Node.js LTS 社区基础,该基础由上面安装的 @tsconfig/node-lts 包提供。有关可用选项的更多信息,请参阅 TypeScript 编译器文档。
-
将 package.json 中默认的 scripts 条目替换为以下内容
{ // ...etc. "scripts": { "compile": "tsc", "start": "npm run compile && node ./dist/index.js" } // other dependencies }
-
要继续设置,请运行以下命令安装所需的依赖
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 |
定义实体
将类型定义为 实体,可以让其他子图向 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 的指南获取更多说明