如何在不使用MERGE Neo4J 3.5的情况下防止重复关系?

时间:2019-07-08 08:55:38

标签: neo4j cypher

如何在不使用MERGE Neo4J 3.5的情况下防止重复关系?

我想对从卡夫卡获得的每批批次运行以下查询。

MATCH (a:Dense1) where a.id <> "1" 
WITH a 
MATCH (b:Dense1) where b.id = "1" 
WITH a,b 
WHERE a.key = b.key 
CREATE (a)-[:PARENT_OF]->(b)

如果我将CREATE更改为MERGE,则由于双重锁定,性能会显着降低,如here所述,如果我将CREATE更改为CREATE UNIQUE,则性能会优于{{1} },但仍不如单独使用MERGE好。我的目标是,即使查询多次运行,甚至两个查询之间都存在关系,甚至什么也不做,甚至更好地向客户端驱动程序发送通知或异常,以便应用程序可以做一些有用的事情。我可以为每个关系创建一个CREATE属性并对其进行约束吗?那行得通吗?

1 个答案:

答案 0 :(得分:0)

您可以在最新的WHERE子句中添加检查是否存在这种关系:

MATCH (a:Dense1) where a.id <> "1" 
WITH a 
MATCH (b:Dense1) where b.id = "1" 
WITH a,b 
WHERE a.key = b.key AND NOT (a)-[:PARENT_OF]->(b)
CREATE (a)-[:PARENT_OF]->(b)

但这几乎是MERGE命令正在执行的操作...

您在属性idkey上有索引/约束吗?