所以我有一个用例,我会定期用复杂的子图更新我的图形。在这些子图中,将有图中已有的节点和新的节点。我曾经认为Merge应该这样做,但事实上,即使已经有一个唯一的节点,如果属性规范不相同,merge似乎也会创建一个新节点。
E.g。在Neo4j Console上,假设我这样做:
MERGE (a:Crew {name:'Neo', occupation:'The One'})
MERGE (a:Crew {name:'Adam', occupation:'Mechanic'})
CREATE UNIQUE (a)-[r:KNOWS]->(b)
RETURN *
这会导致控制台创建第二个版本的Neo,而不是简单地将占用附加到现有版本。
即使您使用以下情况,也会发生这种情况:
CREATE CONSTRAINT ON (p:Crew) ASSERT p.name IS UNIQUE
虽然现在它只是拒绝创建任何东西,因为它不会匹配两个neo,因为一个属性是空白的,并且也不允许创建新节点。
答案 0 :(得分:1)
它会创建第二个版本,因为它不是唯一的。您正在指定其他属性"占用",它当前不存在于原始Neo节点中,因此它不会找到匹配项,因此会创建新节点。
答案 1 :(得分:1)
请改用:
MERGE (a:Crew {name:'Neo'}) ON CREATE SET a.occupation='The One'
MERGE (a:Crew {name:'Adam'}) ON CREATE SET b.occupation='Mechanic'
MERGE (a)-[r:KNOWS]->(b)
RETURN *