Как интегрировать базу данных Neo4j, фреймворк NestJS и GraphQL?

Я пытаюсь интегрировать свой 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*/);
    }
}

Может быть, попробуйте показать нам то, что вы пытались

Jesse Carter 30.11.2018 19:02

@Gonzalo De Benito Cassadó Посмотрим, может ли это помочь. medium.com/@faaizhussain/nestjs-graphql-neo4j-1e3e6e552a80

Faaiz 12.12.2019 11:12

Проверьте DRIVINE.ORG. Я еще не добавил поддержку GraphQL, но думаю, что в противном случае вам понравится.

Jasper Blues 15.07.2020 03:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
1 279
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я не работал над GraphQL, но знаю, что есть пакет npm (Neo4j-graphql-js) для перевода запросов GraphQL в запросы Cypher. Это упрощает совместное использование GraphQL и Neo4j.

Также проверьте GRANDstack, это интеграция с полным стеком разработки для создания приложений на основе Graph.

Предлагаю вам посетить Сообщество Neo4j.

Я читаю всю документацию по этому фреймворку и не могу найти ответ на свой вопрос ... Спасибо! :)

gonzalo 03.12.2018 20:03
Ответ принят как подходящий

Для этого я использую 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 - вы не проверяли, принимаете этот ответ .. могу ли я предположить, что это не сработало для вас? ... вы нашли лучшее решение?

MichaelE 07.10.2019 08:03

Я поменял фреймворк время назад, думаю, это лучшее решение

gonzalo 08.10.2019 09:35

@Christian Lutz ... не могли бы вы прояснить здесь использование augmentSchema? ... Я так понимаю, у вас есть 'augmentSchema = makeAugmentedSchema (typeDefs) где-то в вашем коде ... поскольку вы не используете' определения ', я полагаю вы используете 'definitionsFactory.generate' для создания файла schema.ts ... Я получаю сообщение об ошибке 'неизвестное отношение', когда я это делаю ... он отклоняет директивы @ Relations в файле SDL, как вы вычислили 'augmentSchema'?

MichaelE 01.11.2019 03:54

@MichaelE Функция augmentSchema - это функция из neo4j-graphql-jsgrandstack.io/docs/…. Чтобы заставить @relation работать, я добавил directive @relation(name: String, direction: String) on FIELD_DEFINITION в свой файл SDL. К сожалению, у меня не было возможности работать с graphql и nest с тех пор, как я опубликовал этот ответ. Так что, возможно, с тех пор дела пошли лучше.

Christian Lutz 02.11.2019 21:32

@ChristianLutz на самом деле была введена новая переменная augmentTypeDefs, которая теперь требует const schema = makeExecutableSchema({ typeDefs: augmentTypeDefs(typeDefs), }); , чтобы заставить директивы @relation и neo4j работать

MichaelE 03.11.2019 23:40

@ChristianLutz Я только что вернулся к вопросу, и у меня есть дополнительный вопрос к вам. Вы указали, что использовали GRANDStack для создания augmentedSchema ... у меня вопрос ... вы создали для этого дублированные файлы типа SDL? typePaths: ['./**/*.gql'] создал бы схему inmemory для nest ... поэтому я хотел бы увидеть код, используемый для создания augmentedSchema .... если вы не возражаете .. .Благодарность

MichaelE 17.02.2020 08:36

Это то, что у меня работает ... не так элегантно, как хотелось бы, но работает; Я хочу, чтобы только один сервис / провайдер имел доступ к моей базе данных, а не к сервису из каждого модуля, хотя это тоже работает. Поэтому я придерживаюсь формата 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). Надеюсь, это поможет!

NestJS + GraphQL + Neo4j

С декораторами это довольно легко читать и реализовывать! Спасибо

gonzalo 13.12.2019 10:04

Другие вопросы по теме