Расширенная схема Neo4j / GraphQL

Я пытаюсь немного узнать об интеграции Neo4j с GraphQL. Я использую стартовое приложение GrandStack, которое можно найти здесь. Стартовый стек Grand Stack. Стартер не использует много шаблонов, которые вы видите в других приложениях GrapQL, потому что, насколько я понимаю, интеграция Neo4j должна обойти необходимость двойного объявления схемы и преобразователей. Вместо этого он использует Apollo Server и augmentedSchema. Используя начальный код, я попытался добавить в схему несколько мутаций, в данном случае мутацию deleteUser. Я все время получаю сообщение об ошибке, что идентификатор мутации определен более одного раза, когда я знаю, что помещаю его в код только в одном месте. Это мой schema.js:

    import { neo4jgraphql } from "neo4j-graphql-js";

export const typeDefs = `
type User {
  id: ID!
  name: String
  friends(first: Int = 10, offset: Int = 0): [User] @relation(name: "FRIENDS", direction: "BOTH")
  reviews(first: Int = 10, offset: Int = 0): [Review] @relation(name: "WROTE", direction: "OUT")
  avgStars: Float @cypher(statement: "MATCH (this)-[:WROTE]->(r:Review) RETURN toFloat(avg(r.stars))")
  numReviews: Int @cypher(statement: "MATCH (this)-[:WROTE]->(r:Review) RETURN COUNT(r)")
}

type Business {
  id: ID!
  name: String
  address: String
  city: String
  state: String
  reviews(first: Int = 10, offset: Int = 0): [Review] @relation(name: "REVIEWS", direction: "IN")
  categories(first: Int = 10, offset: Int =0): [Category] @relation(name: "IN_CATEGORY", direction: "OUT")
}

type Review {
  id: ID!
  stars: Int
  text: String
  business: Business @relation(name: "REVIEWS", direction: "OUT")
  user: User @relation(name: "WROTE", direction: "IN")
}

type Category {
  name: ID!
  businesses(first: Int = 10, offset: Int = 0): [Business] @relation(name: "IN_CATEGORY", direction: "IN")
}

type Query {
    users(id: ID, name: String, first: Int = 10, offset: Int = 0): [User]
    businesses(id: ID, name: String, first: Int = 10, offset: Int = 0): [Business]
    reviews(id: ID, stars: Int, first: Int = 10, offset: Int = 0): [Review]
    category(name: ID!): Category
    usersBySubstring(substring: String, first: Int = 10, offset: Int = 0): [User] @cypher(statement: "MATCH (u:User) WHERE u.name CONTAINS $substring RETURN u")
}

type Mutation {

    deleteUser(id: ID!): User
}

`;

export const resolvers = {
    Query: {
        users: neo4jgraphql,
        businesses: neo4jgraphql,
        reviews: neo4jgraphql,
        category: neo4jgraphql,
        usersBySubstring: neo4jgraphql
    },

    Mutation: {
        deleteUser: neo4jgraphql
    }
};

Вот мой индекс:

import { typeDefs, resolvers } from "./graphql-schema";
import { ApolloServer, gql, makeExecutableSchema } from "apollo-server";
import { v1 as neo4j } from "neo4j-driver";
import { augmentSchema } from "neo4j-graphql-js";
import dotenv from "dotenv";

dotenv.config();

const schema = makeExecutableSchema({
  typeDefs,
  resolvers
});

// augmentSchema will add autogenerated mutations based on types in schema
const augmentedSchema = augmentSchema(schema);

const driver = neo4j.driver(
    process.env.NEO4J_URI || "bolt://localhost:7687",
    neo4j.auth.basic(
    process.env.NEO4J_USER || "neo4j",
    process.env.NEO4J_PASSWORD || "neo4j"
    )
);

if (driver){
    console.info("Database Connected")
} else{
    console.info("Database Connection Error")
}

const server = new ApolloServer({
  // using augmentedSchema (executable GraphQLSchemaObject) instead of typeDefs and resolvers
  //typeDefs,
  //resolvers,
  context: { driver },
  // remove schema and uncomment typeDefs and resolvers above to use original (unaugmented) schema
  schema: augmentedSchema
});

server.listen(process.env.GRAPHQL_LISTEN_PORT, '0.0.0.0').then(({ url }) => {
  console.info(`GraphQL API ready at ${url}`);
});

Сообщение об ошибке: Расширенная схема Neo4j / GraphQL

Никакой другой код от стартера не менялся. Мне не удалось найти в документации много информации об augmentedSchema. Если кто-то может указать мне правильное направление, я был бы признателен.

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
472
1

Ответы 1

Проблема была вызвана augmentedSchema, которая автоматически создает мутации по умолчанию для каждого типа, то есть в этом случае уже были созданы удалить пользователя, обновить пользователя и добавить пользователя. Вы можете увидеть это, когда запустите сервер GraphiQL. Таким образом, я дважды объявлял о мутации пользователя для удаления.

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