Neo4j合并行为

时间:2014-05-23 16:58:02

标签: neo4j cypher

所以我有一个用例,我会定期用复杂的子图更新我的图形。在这些子图中,将有图中已有的节点和新的节点。我曾经认为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,而不是简单地将占用附加到现有版本。

enter image description here

即使您使用以下情况,也会发生这种情况:

CREATE CONSTRAINT ON (p:Crew) ASSERT p.name IS UNIQUE

虽然现在它只是拒绝创建任何东西,因为它不会匹配两个neo,因为一个属性是空白的,并且也不允许创建新节点。

2 个答案:

答案 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 *

另请参阅:http://docs.neo4j.org/refcard/2.1/