我在Neo4J中遇到了并行插入问题。我一直用这种方式开发包含链表的新闻源:
(Resource)-[:NEWS]->(Latest_New)-[:NEXT]->(Second_latest)-[:NEXT]->...
我有以下查询,以便在列表的头部插入([:NEWS] - >(latest_new)):
CREATE CONSTRAINT ON (c:New) ASSERT c.head_id IS UNIQUE
MERGE (head: New {head_id: unique_id})
REMOVE head.head_id
WITH head
MATCH (resource)
WHERE resource.uid = resource_uid
OPTIONAL MATCH (resource)-[rel:NEWS]->(last_head)
WITH resource,head,rel, collect(last_head) as previous
DELETE rel
FOREACH (x IN previous | CREATE resource-[:NEWS]->(new_head:New {head_id: unique_id})-[:NEXT]->x)
WITH resource, head, rel
WHERE rel IS NULL
CREATE resource-[:NEWS]->head
SET header.head_id = unique_id
当我依次运行此查询时,一切都很顺利。另一方面,当我同时运行它时,它只创建没有关系的空(新)节点,有时我遇到了死锁。我对MERO + UNIQUE CONSTRAINT和Neo4j中其他并行内容的锁定行为感到困惑。
你对失败的事情有什么想法吗?关于MERGE + UNIQUE CONSTRAINT的锁定beaviour的一些解释将是受欢迎的。谢谢。