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

Posted

技术标签:

【中文标题】Neo4j/GraphQL - 获取链表中的最后一个节点,以便使用新创建的节点继续链表【英文标题】:Neo4j/GraphQL - get the last node in a linked list in order to continue the linked list with newly created nodes 【发布时间】:2021-01-24 14:37:33 【问题描述】:

我有一个群组中帖子的链接列表。一个 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]-&gt;(g:Group)-[:FIRST_POST|NEXT_POST*]-&gt;(lp:Post) return Last(collect(p)) 将返回最后一个帖子,尽管我知道我不能返回这里并且还没有成功找到一种方法来为 MATCH 设置别名。最终,我需要使用CREATE (p)-[:NEXT_POST]-&gt;(&lt;LAST POST IN GROUP&gt;) 从该组中的最后一个 NEXT_POST 中创建 NEXT_POST 关系。第一行还使用 userId 来查找组,因为用户是 MEMBER_OF 只有一个组,帖子只属于一个组。

【问题讨论】:

尝试引入指向最新帖子的指针关系 -> neo4j.com/blog/moving-relationships-neo4j 谢谢!现在正在调查。是的,我们可能奇怪地设置了 Group 与 Post 的关系只是线性的,即 Group->FIRST_POST->NEXT_POST->NEXT_POST 等。Post 节点与 Group 没有任何其他关系。 【参考方案1】:

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

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

【讨论】:

以上是关于Neo4j/GraphQL - 获取链表中的最后一个节点,以便使用新创建的节点继续链表的主要内容,如果未能解决你的问题,请参考以下文章

每日一练(剑指offer)链表中倒数最后k个节点

无法删除链表中的最后一个节点

1.7交换链表中的相邻节点

牛客网高频算法题系列-BM8-链表中倒数最后k个结点

Leetcode删除排序链表中的重复元素

递归查找链表中的第 n 个到最后一个元素