问题描述
我在一个论坛中有一个链接列表。组具有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
返回特定论坛的所有帖子。我想创建一个新的Post并将其添加到我的架构的typedef中的Group中。我知道这是不对的,但是我目前的努力是在这里:
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正文和userId参数。此行MATCH (u:User {id: $userId})-[:MEMBER_OF]->(g:Group)-[:FirsT_POST|NEXT_POST*]->(lp:Post) return Last(collect(p))
将返回最后一个帖子,尽管我知道我无法返回此处,并且还没有成功找到对MATCH进行别名的方法。最终,我需要使用CREATE (p)-[:NEXT_POST]->(<LAST POST IN GROUP>)
在该组中的最后一个NEXT_POST中创建NEXT_POST关系。第一行还使用userId来查找组,因为“用户是MEMBER_OF”仅是一个组,“帖子”仅属于一个组。
解决方法
所以,我有些困惑。其他人创建的架构以FIRST_POST为最新创建的帖子,而不是第一个创建的帖子。将其重命名为NEWEST_POST,我无法这样做:
MATCH (u:User {id: $userId})-[:MEMBER_OF]->(g:Group)-[rel:NEWEST_POST]->(previousNewestPost:Post)
DELETE rel
CREATE (p:Post { id: apoc.create.uuid(),body: 'test new post',createdAt: datetime(),updatedAt: datetime() })
WITH p,g,previousNewestPost
MATCH (u:User)
WHERE u.id = $userId
CREATE (p)<-[:WROTE]-(u)
CREATE (p)<-[:NEWEST_POST]-(g)
CREATE (p)-[:NEXT_POST]->(previousNewestPost)
RETURN u,p
创建一个新帖子并相应地更新关系。