我目前有一个试图模拟地理数据的图形数据库。
为了简单起见,我正在使用的一个关系是(Object) - [:IS_IN] - (Object)来关联实体(例如place1在city1中)。
现在我正在尝试向数据库添加某些位置,同时尝试保留任何类型的现有节点。所以,例如,如果我已经有一个关系,如(place1) - [:is_in] - >(city1),然后尝试添加一个(place2) - [is_in] - >(city1)关系,它应该链接的地方2返回现有的city1节点,而不是创建一个具有相同名称的新节点。所以我尝试使用CREATE UNIQUE:
MATCH(obj:Object {name:'place2'})CREATE UNIQUE(obj) - [:IS_IN] - >(city:Object {name:'city1'})
但是,这会不断创建名为city1的新节点。是什么赋予了?我应该使用MERGE吗?
答案 0 :(得分:1)
使用
MATCH (obj:Object {name: 'place2'}), (city:Object {name: 'city1' } CREATE UNIQUE (obj)-[:IS_IN]->(city)
代替。
答案 1 :(得分:1)
我遇到了同样的问题,发现这个解决方案适用于我:
MERGE (obj:Object {name: 'place2'}) MERGE (city:Object {name: 'city1' }) CREATE UNIQUE (obj)-[:IS_IN]->(city)
这是做什么的(据我所知):查找'place2'节点或创建它(如果它不存在),找到'city1'节点或创建它(如果它不存在),创建一个:IS_IN关系如果它不存在。 因此,无论最初的情况如何,您最终都会得到完整的模式,但没有任何节点或关系重复。 我用各种起始情况对它进行了测试,并按预期工作。
请注意,我是Neo4j和cypher初学者,这可能不是最好的解决方案。 问题是陈旧的,无论如何我都回答了,因为其他人可能觉得它很有用。