如何防止 neo4j MERGE 创建重复关系?
How to prevent neo4j MERGE from creating duplicate relationships?
我正在尝试创建不存在的节点和关系。我不知道数据库中是否存在任何内容。
这是我的初始查询:
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)
这会正确生成如下图表:
然后我再次运行这个查询,但是这次我将“模型”对象的名称更改为“bbc”(而不是“bbb”):
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)
然而,现在我的图表看起来像这样:
除了三个重复的关系外,一切看起来都是正确的。
我意识到 MATCH
如果不存在,将创建整个路径。不过,肯定有一些方法可以避免创建重复关系。
如果有人指出正确的方向,我将不胜感激!
MERGE
语句检查整个模式是否已经存在。因此,如果有一个节点不同,则整个模式被确定为不存在,并创建所有关系。
解决方案是将此 MERGE
语句拆分为多个,即每个关系一个 MERGE
:
MERGE (t)-[:HAS]-(m)-[:HAS]-(r)-[:HAS]-(p)-[:HAS]-(i)-[:HAS]-(u)
变成
MERGE (t)-[:HAS]-(m)
MERGE (m)-[:HAS]-(r)
MERGE (r)-[:HAS]-(p)
MERGE (p)-[:HAS]-(i)
MERGE (i)-[:HAS]-(u)
我正在尝试创建不存在的节点和关系。我不知道数据库中是否存在任何内容。
这是我的初始查询:
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)
这会正确生成如下图表:
然后我再次运行这个查询,但是这次我将“模型”对象的名称更改为“bbc”(而不是“bbb”):
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)
然而,现在我的图表看起来像这样:
除了三个重复的关系外,一切看起来都是正确的。
我意识到 MATCH
如果不存在,将创建整个路径。不过,肯定有一些方法可以避免创建重复关系。
如果有人指出正确的方向,我将不胜感激!
MERGE
语句检查整个模式是否已经存在。因此,如果有一个节点不同,则整个模式被确定为不存在,并创建所有关系。
解决方案是将此 MERGE
语句拆分为多个,即每个关系一个 MERGE
:
MERGE (t)-[:HAS]-(m)-[:HAS]-(r)-[:HAS]-(p)-[:HAS]-(i)-[:HAS]-(u)
变成
MERGE (t)-[:HAS]-(m)
MERGE (m)-[:HAS]-(r)
MERGE (r)-[:HAS]-(p)
MERGE (p)-[:HAS]-(i)
MERGE (i)-[:HAS]-(u)