我有一个组中帖子的链接列表。一个 Group 有一个 FIRST_POST 和随后的 NEXT_POST 关系。GraphQL typedef 如下所示:
type Group {
id: ID!
name: String!
membersList: [User] @relation(direction: IN, name: "MEMBER_OF")
engagesIn: Conversation @relation(direction: OUT, name: "ENGAGES_IN")
posts: [Post] @cypher(statement: """
MATCH (g:Group {id: this.id})-[:FIRST_POST|NEXT_POST*]->(post:Post)
RETURN post
""")
createdAt: DateTime
updatedAt: DateTime
}
密码查询MATCH (g:Group {id: this.id})-[:FIRST_POST|NEXT_POST*]->(post:Post) RETURN post
返回特定组的所有帖子。我想创建一个新帖子并将其添加到我模式的 typedef 中的组中。这是我知道不正确的一个尝试,但这是我目前的努力所在:
CreatePost(body: String!, userId: ID!): Post
@cypher(
statement: """
MATCH (u:User {id: $userId})-[:MEMBER_OF]->(g:Group)-[:FIRST_POST|NEXT_POST*]->(lp:Post) return Last(collect(p))
CREATE (p:Post { id: apoc.create.uuid(), body: $body, createdAt: datetime(), updatedAt: datetime() })
WITH p, lp
MATCH (u:User)
WHERE u.id = $userId
CREATE (p)<-[:WROTE]-(u)
CREATE (p)-[:NEXT_POST]->(lp)
RETURN u, p
""")
这是一个接受 post body 和 userId 参数的自定义突变。此行将MATCH (u:User {id: $userId})-[:MEMBER_OF]->(g:Group)-[:FIRST_POST|NEXT_POST*]->(lp:Post) return Last(collect(p))
返回最后一篇文章,尽管我知道我无法返回此处并且还没有成功找到为 MATCH 设置别名的方法。最终,我需要从该组中的最后一个 NEXT_POST 中创建 NEXT_POST 关系CREATE (p)-[:NEXT_POST]->(<LAST POST IN GROUP>)
。第一行还使用 userId 来查找组,因为用户是 MEMBER_OF 只有一个组,而帖子只属于一个组。