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

Я пытаюсь немного узнать об интеграции Neo4j с GraphQL. Я использую стартовое приложение GrandStack, которое можно найти здесь. Grand Stack Starter. Стартер не использует много шаблонов, которые вы видите в других приложениях 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.log("Database Connected")
} else{
    console.log("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.log(`GraphQL API ready at ${url}`);
});

Сообщение об ошибке:  введите описание изображения здесь

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


person Michael Porter    schedule 24.07.2018    source источник


Ответы (1)


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

person Michael Porter    schedule 09.08.2018