Neo4j / GraphQL-获取链表中的最后一个节点,以便使用新创建的节点继续链表

问题描述

我在一个论坛中有一个链接列表。组具有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

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