Neo4j 数据库、NestJS 框架和 GraphQL 如何集成?
Posted
技术标签:
【中文标题】Neo4j 数据库、NestJS 框架和 GraphQL 如何集成?【英文标题】:How to integrate Neo4j database, NestJS framework and 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*/);
【问题讨论】:
也许尝试向我们展示您尝试过的东西 @Gonzalo De Benito Cassadó 看看这是否有帮助。 medium.com/@faaizhussain/nestjs-graphql-neo4j-1e3e6e552a80 查看DRIVINE.ORG。我还没有添加 GraphQL 支持,但是我认为您会喜欢它。 【参考方案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”的? @MichaelEaugmentSchema
函数来自 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 指令正常工作以上是关于Neo4j 数据库、NestJS 框架和 GraphQL 如何集成?的主要内容,如果未能解决你的问题,请参考以下文章
NestJS / TypeOrm / Neo4j :Nest 无法解析 NEO4J_DRIVER 的依赖关系
Neo4j - 图形数据科学库 - 如何对图形目录中的命名图形进行密码查询?