自托管 GraphQL
|
这是 GraphQL Library 7 版本的文档。对于长期支持 (LTS) 版本 5,请参考 GraphQL Library 5 LTS 版本。 |
本教程将向您展示如何:
-
安装 Neo4j GraphQL 库及其依赖项。
-
设置代表您的图数据库结构的类型定义。
-
启动库实例以生成 GraphQL 模式 (Schema)。
-
运行服务器实例以针对您的模式执行查询和变更 (Mutation)。
设置目录
-
创建一个新目录并
cd进入该目录mkdir neo4j-graphql-example cd neo4j-graphql-example -
创建一个新的 Node.js 项目(通过使用 es6 选项启用 ESM 模块)
npm init es6 --yes -
创建一个空的
index.js文件,其中将包含本教程的所有代码touch index.js
安装依赖项
安装 Neo4j GraphQL 库及其依赖项:
npm install @neo4j/graphql graphql neo4j-driver @apollo/server
-
@neo4j/graphql是官方的 Neo4j GraphQL 库包。它接收您的 GraphQL 类型定义并生成由 Neo4j 数据库支持的模式。 -
graphql是用于生成模式并执行查询和变更的包。 -
neo4j-driver是官方的 JavaScript 版 Neo4j 驱动包,必须将其实例传递给 Neo4j GraphQL 库。
安装一个 GraphQL 服务器包来托管您的模式,并允许对其执行查询和变更。@apollo/server 是 Apollo Server 的默认包。
添加 GraphQL 类型定义
Neo4j GraphQL 库由映射到 Neo4j 数据库中节点和关系的类型定义驱动。在编辑器中打开设置目录中创建的 index.js 文件,并将以下类型定义与必要的包导入语句一起粘贴进去
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 Product @node {
productName: String
category: [Category!]! @relationship(type: "PART_OF", direction: OUT)
}
type Category @node {
categoryName: String
products: [Product!]! @relationship(type: "PART_OF", direction: IN)
}
`;
这些类型定义仅定义了节点标签 “Product” 和 “Category”,以及两者之间的关系 “PART_OF”。生成模式后,您可以执行 products 和 category 查询,从数据库中读取数据。
注意,您也可以通过内省模式 (introspecting the schema) 从现有数据库自动生成类型定义。
创建 Neo4jGraphQL 实例
对于位于默认地址 "neo4j://:7687"(有关端口配置的更多信息)的数据库,且用户名为 "username"、密码为 "password",请将以下代码添加到 index.js 文件的底部
const driver = neo4j.driver(
"neo4j://:7687",
neo4j.auth.basic("username", "password")
);
const neoSchema = new Neo4jGraphQL({ typeDefs, driver });
|
不建议像这样硬编码凭据,因为它会将凭据暴露给任何能够访问您源代码的人。在实际应用中,请保护好您的凭据。 |
创建 ApolloServer 实例
要创建使用所生成模式的 Apollo Server 实例,以便在其中执行查询,请将以下代码添加到 index.js 的底部
const server = new ApolloServer({
schema: await neoSchema.getSchema(),
});
const { url } = await startStandaloneServer(server, {
listen: { port: 4000 },
});
console.log(`🚀 Server ready at ${url}`);
启动服务器
请确保您的 index.js 文件看起来与此完整示例一致
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 Product @node {
productName: String
category: [Category!]! @relationship(type: "PART_OF", direction: OUT)
}
type Category @node {
categoryName: String
products: [Product!]! @relationship(type: "PART_OF", direction: IN)
}
`;
const driver = neo4j.driver(
"neo4j://:7687",
neo4j.auth.basic("username", "password")
);
const neoSchema = new Neo4jGraphQL({ typeDefs, driver });
const server = new ApolloServer({
schema: await neoSchema.getSchema(),
});
const { url } = await startStandaloneServer(server, {
context: async ({ req }) => ({ req }),
listen: { port: 4000 },
});
console.log(`🚀 Server ready at ${url}`);
现在您可以启动 GraphQL 服务器了。回到命令行,运行:
node index.js
如果成功,您应该会看到以下输出
🚀 Server ready at https://:4000/
地址 https://:4000/ 是 Apollo Server 启动的 URL。
在数据库中创建节点
-
在浏览器中访问 https://:4000/。您应该会被重定向到 Apollo Sandbox。
-
目前您的数据库是空的。要开始添加数据,请复制以下变更 (Mutation) 并粘贴到 Operation 面板中,以创建一个产品及其所属的类别:
mutation { createProducts( input: [ { productName: "New Product" category: { create: [{ node: { categoryName: "New Category" } }] } } ] ) { products { productName category { categoryName } } } } -
点击右上角的 Run。在 Response 面板中,您应该会收到以下确认信息,表明数据已在数据库中创建:
{ "data": { "createProducts": { "products": [ { "productName": "New Product", "category": [ { "categoryName": "New Category" } ] } ] } } } -
查询您刚才添加的数据。复制以下查询并粘贴到 Operations 面板:
query { products { productName category { categoryName } } }由于您仅创建了一个 “Product” 节点和一个 “Category” 节点,Response 面板应显示如下:
{ "data": { "products": [ { "productName": "New Product", "category": [ { "categoryName": "New Category" } ] } ] } }
教程到此结束。您现在拥有了一个连接到 Neo4j 数据库的 GraphQL API,并成功添加了两个节点。
要了解更多信息,请参阅查询与聚合和Neo4j GraphQL 工具箱。有关更高级的数据库设置,请参考驱动配置。
通过 GraphAcademy 上的 GraphQL 课程 获得实践经验。