Как выполнить директиву graphql @relation для различных объектов - PullRequest
0 голосов
/ 30 марта 2020

У меня есть следующие typeDefs:

const typeDefs = `
    type Movie {
        genres: String
        movieId: Int!
        title: String
        seenBy: [User] @cypher(statement: "with $this as m match (m)<-[:RATED]-(u:User) return u")
    }

    type User {
        userId: Int!
        name: String
        seen: [Movie] @relation(name: "RATED", direction: "OUT")
        recommended(first: Int = 5): [Movie] @cypher(statement: "with $this as u match (u)-->(:Movie)<--(:User)-->(reco:Movie) where not (u)-[:RATED]->(reco) return reco, count(*) as score order by score desc limit $first")
    }

    type Query {
        movieById(movieId: Int!): Movie,
        movieBySubstring(subString: String!): [Movie]
        userById(userId: Int!): User
        userBySubstring(subString: String!): [User]
    }
`;

Проблема в полях на Mov ie и User с директивами на нем (seenBy, видимый и рекомендуемый). Когда я выполняю запросы movieById или userById и возвращаю только один объект, директивы работают нормально.

Однако при выполнении movieBySubstring или userBySubstring и возвращении массива объектов я получаю ошибку

Функция разрешения для \ "Mov ie .seenBy \" вернула undefined

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 31 марта 2020

Я нашел решение этой проблемы. Я реализовал пользовательские преобразователи для запросов movieBySubstring и userBySubstring, и именно это вызвало проблему.

Решением было использование директивы @cypher в определении запроса следующим образом:

    type Query {
        movieById(movieId: Int!): Movie
        moviesBySubstring(subString: String!): [Movie] @cypher (statement: "match (m:Movie) where m.title contains $subString return m")
        userById(userId: Int!): User
        usersBySubstring(subString: String!): [User] @cypher (statement: "match (u:User) where u.name contains $subString return u")
    }

Это решило проблему для меня, однако, поскольку я не имел опыта с cypher или neo4j, я не знаю, может ли это в какой-то момент нарушить ограничения.

...