0

我有一个组中帖子的链接列表。一个 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 只有一个组,而帖子只属于一个组。

4

1 回答 1

0

所以,我有些困惑。其他人创建了架构,其中 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

创建一个新帖子并相应地更新关系。

于 2020-10-09T15:47:12.353 回答