在cypher的MERGE查询中使用/(不使用)MATCH有什么区别?

时间:2016-02-17 21:49:57

标签: neo4j cypher

在neo4j中创建可能存在的节点时,我对MATCH的使用感到困惑。这两种情况有什么区别?

1.- MERGE (n:Person { user_id: 1234 ,sex:'male'})

2.- MATCH (a:Person) WHERE a.user_id = 1234 AND a.sex = 'male' MERGE (n:Person { user_id: 1234 ,sex:'male'})

实际上即使在阅读完文档后我也无法理解MATCH

的有用性

2 个答案:

答案 0 :(得分:1)

MERGE是"获取或创建"。如果模式存在,则获取它(绑定到指定的变量)。如果指定的模式不存在,则创建它。

MATCH只是"得到"。如果模式存在,则绑定到指定的变量。如果模式不存在,则没有任何内容与变量绑定。

答案 1 :(得分:0)

以下是您的2个查询之间的差异。

  • 当且仅当找不到这样的节点时,查询#1将创建具有指定标签和属性的节点。

  • 查询#2基本上是浪费时间。它调用MATCH来查找具有指定标签和属性的节点,并且只有在找到它时才会调用MERGE(当且仅当它不存在时才会创建节点)。所以,#2最终没有做任何改变。如果节点已经存在,它将继续存在(因为MERGE将发现它不需要做任何事情)。如果它不存在,它将不存在(因为甚至不会调用MERGE)。

毋庸置疑,人们永远不会以与#2相同的方式使用MATCHMERGE。以下是MATCHMERGE的更典型示例,它确保了已在数据库中的2个人之间存在SPOUSE_OF关系:

MATCH (a:Person {user_id: 1234}), (b:Person {user_id: 5678})
MERGE (a)-[:SPOUSE_OF]->(b);