Я пытаюсь интегрировать свой REST API (NestJS) с новой базой данных Neo4j с запросами GraphQL. Кому-нибудь удастся? заранее спасибо
РЕДАКТИРОВАТЬ 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.info("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, но думаю, что в противном случае вам понравится.





Я не работал над GraphQL, но знаю, что есть пакет npm (Neo4j-graphql-js) для перевода запросов GraphQL в запросы Cypher. Это упрощает совместное использование GraphQL и Neo4j.
Также проверьте GRANDstack, это интеграция с полным стеком разработки для создания приложений на основе Graph.
Предлагаю вам посетить Сообщество Neo4j.
Я читаю всю документацию по этому фреймворку и не могу найти ответ на свой вопрос ... Спасибо! :)
Для этого я использую 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: расширение схемы)
Надеюсь, это немного поможет!
@ GonzaloDeBenitoCassad - вы не проверяли, принимаете этот ответ .. могу ли я предположить, что это не сработало для вас? ... вы нашли лучшее решение?
Я поменял фреймворк время назад, думаю, это лучшее решение
@Christian Lutz ... не могли бы вы прояснить здесь использование augmentSchema? ... Я так понимаю, у вас есть 'augmentSchema = makeAugmentedSchema (typeDefs) где-то в вашем коде ... поскольку вы не используете' определения ', я полагаю вы используете 'definitionsFactory.generate' для создания файла schema.ts ... Я получаю сообщение об ошибке 'неизвестное отношение', когда я это делаю ... он отклоняет директивы @ Relations в файле SDL, как вы вычислили 'augmentSchema'?
@MichaelE Функция augmentSchema - это функция из neo4j-graphql-jsgrandstack.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 работать
@ChristianLutz Я только что вернулся к вопросу, и у меня есть дополнительный вопрос к вам. Вы указали, что использовали GRANDStack для создания augmentedSchema ... у меня вопрос ... вы создали для этого дублированные файлы типа SDL? typePaths: ['./**/*.gql'] создал бы схему inmemory для nest ... поэтому я хотел бы увидеть код, используемый для создания augmentedSchema .... если вы не возражаете .. .Благодарность
Это то, что у меня работает ... не так элегантно, как хотелось бы, но работает; Я хочу, чтобы только один сервис / провайдер имел доступ к моей базе данных, а не к сервису из каждого модуля, хотя это тоже работает. Поэтому я придерживаюсь формата Nest myModule-> myResolver-> myService -> Neo4jService. Итак, Neo4jService внедряется во все xService (ы). При необходимости я использую 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 ... поэтому я бы рекомендовал пропустить его ... пока
Вот пример, который я создал для (NestJS + GraphQL + Neo4j). Надеюсь, это поможет!
С декораторами это довольно легко читать и реализовывать! Спасибо
Может быть, попробуйте показать нам то, что вы пытались