从现有 Neo4j 数据库自省模式

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

通过一个独立的 npm 包 @neo4j/introspector,Neo4j 提供了一个工具,可以从现有数据库生成 GraphQL 类型定义。这通常是一次性的操作,应被视为 GraphQL 模式的起点。

@neo4j/introspector 全面支持生成类型定义,包括:

  • @relationship 指令,包括关系属性。

  • @node 类型特性包括:

    • label 用于映射节点标签可能使用 GraphQL 不支持的字符集中的字符的情况。

    • additionalLabels 用于具有多个标签的节点。

  • GraphQL 类型定义的只读版本。

如果元素属性在整个图中具有混合类型,则该属性将从生成的类型定义中排除。原因是如果您的 GraphQL 服务器发现数据与指定类型不匹配,它将抛出错误。

如果跳过任何属性,这将在调试日志中注明。

使用示例

您可以使用编程 API 来自省 Neo4j 模式并生成 GraphQL 类型定义。以下是一些您可能会遇到的场景。

自省并持久化到文件

此示例自省数据库模式,生成 GraphQL 类型定义并将其持久化到文件 schema.graphql。然后您可以使用您的 GraphQL 服务器来提供此文件。

import { toGraphQLTypeDefs } from "@neo4j/introspector";
import fs from "fs";
import neo4j from "neo4j-driver";

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

const sessionFactory = () => driver.session({ defaultAccessMode: neo4j.session.READ })

// We create a async function here until "top level await" has landed
// so we can use async/await
async function main() {
    const typeDefs = await toGraphQLTypeDefs(sessionFactory)
    fs.writeFileSync('schema.graphql', typeDefs)
    await driver.close();
}
main()

自省并启动只读模式

此示例从数据库生成模式的只读版本,并立即启动一个 Apollo 服务器。在此处,类型定义从不持久化到磁盘。

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

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

const sessionFactory = () =>
    driver.session({ defaultAccessMode: neo4j.session.READ });

// We create a async function here until "top level await" has landed
// so we can use async/await
async function main() {
    const readonly = true; // We don't want to expose mutations in this case
    const typeDefs = await toGraphQLTypeDefs(sessionFactory, readonly);

    const neoSchema = new Neo4jGraphQL({ typeDefs, driver });

    const server = new ApolloServer({
        schema: await neoSchema.getSchema(),
    });

    await startStandaloneServer(server, {
        context: async ({ req }) => ({ req }),
    });
}

main();
© . All rights reserved.