【问题标题】:How to integrate Neo4j database, NestJS framework and GraphQL?Neo4j 数据库、NestJS 框架和 GraphQL 如何集成?
【发布时间】:2019-05-01 20:41:15
【问题描述】:

我正在尝试将我的 REST API (NestJS) 与带有 GraphQL 查询的新 Neo4j 数据库集成。有人成功吗?提前致谢

编辑1:(我添加了我的代码)

import { Resolver } from "@nestjs/graphql";
import { Query, forwardRef, Inject, Logger } from "@nestjs/common";
import { Neo4jService } from "src/shared/neo4j/neoj4.service";
import { GraphModelService } from "./models/model.service";
import { Movie } from "src/graphql.schema";

@Resolver('Movie')
    export class GraphService {
    constructor(private readonly _neo4jService: Neo4jService) {}

    @Query()
    async getMovie() {
        console.log("hello");
        return neo4jgraphql(/*i don't know how get the query and params*/);
    }
}

【问题讨论】:

标签: neo4j cypher graphql nestjs resolver


【解决方案1】:

我没有研究过 GraphQL,但我知道有一个 npm 包 (Neo4j-graphql-js) 可以将 GraphQL 查询转换为 Cypher 查询。它让 GraphQL 和 Neo4j 更容易结合使用。

另外,请查看GRANDstack,它是用于构建基于 Graph 的应用程序的全栈开发集成。

建议您访问Neo4j Community

【讨论】:

  • 我正在阅读这个框架的所有文档,但我找不到我的答案的解决方案......谢谢! :)
【解决方案2】:

这是我为 (NestJS + GraphQL + Neo4j) 创建的示例。我希望这可能会有所帮助!

NestJS + GraphQL + Neo4j

【讨论】:

  • 使用装饰器非常容易阅读和实现!谢谢
【解决方案3】:

这对我有用……不像我想要的那样优雅,但它有效;我希望只有一个服务/提供者访问我的数据库,而不是每个模块的服务,即使这也有效。所以我坚持使用 myModule->myResolver->myService-->Neo4jService 的 Nest 格式。所以 Neo4jService 被注入到所有的 xService(s) 中。我在必要时使用 neo4jGraphql 和 augmentSchema 和 Cypher。

代码

**appmodule.ts**
....
import { makeExecutableSchema } from 'graphql-tools';
import { v1 as neo4j } from 'neo4j-driver';
import { augmentTypeDefs, augmentSchema  } from 'neo4j-graphql-js';
import { Neo4jService } from './neo4j/neo4j.service';
import { MyModule } from './my/my.module';
import { MyResolver } from './my/my.resolver';
import { MyService } from './my/my.service';
....
import { typeDefs } from './generate-schema';  // SDL type file
...
const driver =  neo4j.driver('bolt://localhost:3000', neo4j.auth.basic('neo4j', 'neo4j'))

const schema = makeExecutableSchema({
  typeDefs: augmentTypeDefs(typeDefs),
 });
const augmentedSchema = augmentSchema(schema);   // Now we have an augmented schema

@Module({
  imports: [
    MyModule,

    GraphQLModule.forRoot({
      schema: augmentedSchema,       
      context: {
      driver,
       },
     }),
    ],
  controllers: [],

  providers: [ Neo4jService,
               myResolver,
             ],
})
export class AppModule {}

**myResolver.ts**

import { Args, Mutation, Query, Resolver  } from '@nestjs/graphql';

import { MyService } from './my.service';

@Resolver('My')
export class MyResolver {

    constructor(
        private readonly myService: MyService) {}

      @Query()
      async getData(object, params, ctx, resolveInfo) {
       return await this.myService.getData(object, params, ctx, resolveInfo);
      }

     *//Notice I am just passing the graphql params, etc to the myService*

}

**myService.ts**

import { Injectable } from '@nestjs/common';
import { Neo4jService } from '../neo4j/neo4j.service';

@Injectable()
export class MyService {

    constructor(private neo4jService: Neo4jService) {}

    async getData(object, params, ctx, resolveInfo) {
        return await this.neo4jService.getData(object, params, ctx, resolveInfo);
   }

     *// Again I am just passing the graphql params, etc to the neo4jService*
 }
**neo4jService.ts**
import { Injectable } from '@nestjs/common';
import { neo4jgraphql } from 'neo4j-graphql-js';


@Injectable()
export class Neo4jService {

        getData(object, params, ctx, resolveInfo) {
              return neo4jgraphql(object, params, ctx, resolveInfo);
            }
     .....
     ......
}

所以基本上我推迟了使用 neo4jgraphql,直到我们到达 neo4jService。现在我所有的数据库调用都在这里......正如我所说的不优雅但它有效。

挑战:Graphql generate 不接受@relation...我发现已经进行了更改,现在您需要 augmentTypeDefs。 ...希望这可以帮助 编辑 Nestjs 需要很长时间来处理 augmentSchema ......所以我建议跳过它......现在

【讨论】:

    【解决方案4】:

    我正在使用NestInterceptor 来完成此操作:

    @Injectable()
    export class Neo4JGraphQLInterceptor implements NestInterceptor {
      intercept(
        context: ExecutionContext,
        next: CallHandler<any>,
      ): Observable<any> | Promise<Observable<any>> {
        const ctx = GqlExecutionContext.create(context);
        return neo4jgraphql(
          ctx.getRoot(),
          ctx.getArgs(),
          ctx.getContext(),
          ctx.getInfo(),
        );
      }
    }
    

    在您的Resolver 中使用它:

    @Resolver('Movie')
    @UseInterceptors(Neo4JGraphQLInterceptor)
    export class MovieResolver {}
    

    我的GraphQLModule 是这样配置的:

    @Module({
      imports: [
        GraphQLModule.forRoot({
          typePaths: ['./**/*.gql'],
          transformSchema: augmentSchema,
          context: {
            driver: neo4j.driver(
              'bolt://neo:7687',
              neo4j.auth.basic('neo4j', 'password1234'),
            ),
          },
        }),
      ],
      controllers: [...],
      providers: [..., MovieResolver, Neo4JGraphQLInterceptor],
    })
    

    注意使用transformSchema: augmentSchema 来启用自动生成的突变和查询 (GRANDStack: Schema Augmentation)

    希望能有所帮助!

    【讨论】:

    • @GonzaloDeBenitoCassadó 你没有检查接受这个答案..我应该假设它对你不起作用吗?......你找到更好的解决方案了吗?
    • 我前段时间改了框架,我觉得这个方案比较好
    • @Christian Lutz .....你能澄清一下你在这里使用的 augmentSchema 吗?......我认为你的代码中有 'augmentSchema = makeAugmentedSchema(typeDefs) ......因为你没有使用“定义”我假设您正在使用“定义工厂.generate”来生成 schema.ts 文件......当我这样做时出现错误“未知关系”......它拒绝 @ 关系指令在 SDL 文件中,您是如何计算“augmentSchema”的?
    • @MichaelE augmentSchema 函数来自 neo4j-graphql-js grandstack.io/docs/…。为了使@relation 工作,我将directive @relation(name: String, direction: String) on FIELD_DEFINITION 添加到我的SDL 文件中。不幸的是,自从我发布了这个答案以来,我没有机会使用 graphql 和 nest。所以也许从那以后情况有所改善。
    • @ChristianLutz 实际上引入了一个新变量“augmentTypeDefs”,现在需要const schema = makeExecutableSchema({ typeDefs: augmentTypeDefs(typeDefs), }); 才能使@relation 和neo4j 指令正常工作
    猜你喜欢
    • 2021-08-17
    • 2020-02-11
    • 2021-07-28
    • 2018-07-09
    • 2016-07-24
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多