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]->(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 只有一个组,帖子只属于一个组。
【问题讨论】:
尝试引入指向最新帖子的指针关系 -> 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 - 获取链表中的最后一个节点,以便使用新创建的节点继续链表的主要内容,如果未能解决你的问题,请参考以下文章