密码链表并发插入

时间:2017-04-10 15:06:31

标签: neo4j linked-list cypher

问题

我正在尝试使用cypher和neo4j构建linked list。如果插入一次发生,则查询有效。

但是如果插入同时发生,则linked list变得一团糟。

插图 蓝色节点代表一个组。 黄色节点代表帖子。这些帖子应作为链表连接到该组。

(GROUP)-[LAST_POST]->(POST)-[PREVIOUS_POST]->(POST)-...->(POST)

enter image description here

据我所知,我们无法锁定写入以进行一次写入,因为这会影响性能。有没有办法强制执行单个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

2 个答案:

答案 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