如何防止neo4j MERGE创建重复关系?

如何防止neo4j MERGE创建重复关系?,neo4j,cypher,Neo4j,Cypher,如果节点和关系不存在,我将尝试创建它们。我事先不知道数据库中是否存在任何内容 这是我的初始查询: MERGE (t:type { name: 'aaa'}) MERGE (m:model { name: 'bbb'}) MERGE (r:region {name: 'ccc'}) MERGE (p:param {name: 'ddd'}) MERGE (i:init {value: 123}) MERGE (u:forecast {url: 'http://something.png'}) ME

如果节点和关系不存在,我将尝试创建它们。我事先不知道数据库中是否存在任何内容

这是我的初始查询:

MERGE (t:type { name: 'aaa'})
MERGE (m:model { name: 'bbb'})
MERGE (r:region {name: 'ccc'})
MERGE (p:param {name: 'ddd'})
MERGE (i:init {value: 123})
MERGE (u:forecast {url: 'http://something.png'})
MERGE (t)-[:HAS]-(m)-[:HAS]-(r)-[:HAS]-(p)-[:HAS]-(i)-[:HAS]-(u)
这将正确地生成如下图形:

然后我再次运行此查询,但这次我将“model”对象的名称更改为“bbc”(而不是“bbb”):

但现在,我的图表如下所示:

除了三个重复的关系外,所有内容看起来都是正确的。 我意识到,
MATCH
将创建整个路径,如果它不存在。不过,一定有办法避免创建重复的关系


如果能给我指出正确的方向,我将不胜感激

MERGE语句检查整个模式是否已经存在。因此,如果存在一个不同的节点,则整个模式将被确定为不存在,并创建所有关系

解决方案是将此
MERGE
语句拆分为多个,即每个关系一个
MERGE

MERGE(t)-(HAS)-(m)-(HAS)-(r)-(HAS)-(p)-(HAS)-(i)-(HAS)-(u)
变成

MERGE(t)-[:HAS]-(m)
合并(m)-[:HAS]-(r)
合并(r)-[:HAS]-(p)
合并(p)-[:HAS]-(i)
合并(i)-[:HAS]-(u)
MERGE (t:type { name: 'aaa'})
MERGE (m:model { name: 'bbc'})
MERGE (r:region {name: 'ccc'})
MERGE (p:param {name: 'ddd'})
MERGE (i:init {value: 123})
MERGE (u:forecast {url: 'http://something.png'})
MERGE (t)-[:HAS]-(m)-[:HAS]-(r)-[:HAS]-(p)-[:HAS]-(i)-[:HAS]-(u)