问题
我正在尝试使用cypher和neo4j构建linked list
。如果插入一次发生,则查询有效。
但是如果插入同时发生,则linked list
变得一团糟。
插图 蓝色节点代表一个组。 黄色节点代表帖子。这些帖子应作为链表连接到该组。
(GROUP)-[LAST_POST]->(POST)-[PREVIOUS_POST]->(POST)-...->(POST)
据我所知,我们无法锁定写入以进行一次写入,因为这会影响性能。有没有办法强制执行单个LAST_POST
关系?
我正在使用的查询
MATCH(group:group{id:{groupId}})
OPTIONAL MATCH (group)-[r:LAST_POST]->(oldPost)
DELETE r
merge (post:post{id: {postId}, type:{type}})
CREATE (group)-[:LAST_POST]->(post)
WITH post, collect(oldPost) as oldLatestPosts
FOREACH (x in oldLatestPosts|CREATE (post)-[:PREVIOUS_POST]->(x))
RETURN post
答案 0 :(得分:1)
我通过锁定节点并在完成操作后释放它来解决它。
查询应如下所示:
MATCH(group:group{id:{groupId}})
SET group.__lock = true
WITH group
OPTIONAL MATCH (group)-[r:LAST_POST]->(oldPost)
DELETE r
merge (post:post{id: {postId}, type:{type}})
CREATE (group)-[:LAST_POST]->(post)
WITH group, post, collect(oldPost) as oldLatestPosts
FOREACH (x in oldLatestPosts|CREATE (post)-[:PREVIOUS_POST]->(x))
SET group.__lock = false
RETURN post
答案 1 :(得分:0)
如果你想保持旧尾...(POST)-[PREVIOUS_POST]->(POST)-...->(POST)
连接,那么匹配旧列表的第一个元素并将该元素连接到新的帖子就是你想要做的。
MATCH(group:group{id:{groupId}})
OPTIONAL MATCH (group)-[r:LAST_POST]->(oldPost)
DELETE r
MERGE (group)-[:LAST_POST]->(post:post{id: {postId}, type:{type}})
WITH post, oldPost
CREATE (post)-[:PREVIOUS_POST]->(oldPost)
RETURN post