自托管 GraphQL

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

本教程将向您展示如何:

  • 安装 Neo4j GraphQL 库及其依赖项。

  • 设置代表您的图数据库结构的类型定义。

  • 启动库实例以生成 GraphQL 模式 (Schema)。

  • 运行服务器实例以针对您的模式执行查询和变更 (Mutation)。

先决条件

  • 本教程假设您熟悉命令行和 JavaScript。

  • 请确保已安装 Node.js 20+ 版本。

  • 示例中使用默认的 npm 包管理器,但您也可以使用其他包管理器。

  • 设置一个 Neo4j 数据库。请确保它满足要求,包括必要的插件。

设置目录

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

    mkdir neo4j-graphql-example
    cd neo4j-graphql-example
  2. 创建一个新的 Node.js 项目(通过使用 es6 选项启用 ESM 模块)

    npm init es6 --yes
  3. 创建一个空的 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”。生成模式后,您可以执行 productscategory 查询,从数据库中读取数据。

注意,您也可以通过内省模式 (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。

在数据库中创建节点

  1. 在浏览器中访问 https://:4000/。您应该会被重定向到 Apollo Sandbox。

  2. 目前您的数据库是空的。要开始添加数据,请复制以下变更 (Mutation) 并粘贴到 Operation 面板中,以创建一个产品及其所属的类别:

    mutation {
      createProducts(
        input: [
          {
            productName: "New Product"
            category: { create: [{ node: { categoryName: "New Category" } }] }
          }
        ]
      ) {
        products {
          productName
          category {
            categoryName
          }
        }
      }
    }
  3. 点击右上角的 Run。在 Response 面板中,您应该会收到以下确认信息,表明数据已在数据库中创建:

    {
      "data": {
        "createProducts": {
          "products": [
            {
              "productName": "New Product",
              "category": [
                {
                  "categoryName": "New Category"
                }
              ]
            }
          ]
        }
      }
    }
  4. 查询您刚才添加的数据。复制以下查询并粘贴到 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 课程 获得实践经验。