目录: [TOC]
MERGE
MERGE确保模式在graph中存在,要么已经存在要么创建
MERGE是MATCH和CREATE结合
为了性能考虑,在标签和属性创建索引是推荐使用MERGE
当MERGE使用在全模式时候,要么全部匹配,要么全部创建;MERGE不会部分匹配,要么nothing要么all;如果需要匹配部分,建议分开使用MERGE
CREATE INDEX PersonIndex FOR (n:Person) ON (n.name)
创建所以提高MERGE性能
Cypher不能创建null的属性 MERGE和ON CREATE和ON MATCH,如果创建则,如果匹配则
MERGE节点
//创建单个节点
MERGE (robert:Critic)
RETURN robert, labels(robert)
//MERGE带属性的节点
MERGE (charlie { name: 'Charlie Sheen', age: 10 })
RETURN charlie
//MERGE带标签和属性的节点
MERGE (michael:Person { name: 'Michael Douglas' })
RETURN michael.name, michael.bornIn
//从已有的节点MERGE节点
//节点City只会创建一个
MATCH (person:Person)
MERGE (city:City { name: person.bornIn })
RETURN person.name, person.bornIn, city
Use ON CREATE and ON MATCH
- 如果有节点和属性,其他属性将被创建
- 如果没有这个节点,创建并创建属性
//没有则创建节点,并设置节点属性
MERGE (keanu:Person { name: 'Keanu Reeves' })
ON CREATE SET keanu.created = timestamp()
RETURN keanu.name, keanu.created
//没有则创建,并设置节点属性
MERGE (person:Person)
ON MATCH SET person.found = TRUE
RETURN person.name, person.found
//有这个属性则不变
// 没有则穿创建
MERGE (keanu:Person { name: 'Keanu Reeves' }) //这个节点已经存储所以是MATCH
ON CREATE SET keanu.created = timestamp()
ON MATCH SET keanu.lastSeen = timestamp() //这条语句会执行
RETURN keanu.name, keanu.created, keanu.lastSeen
//上面这条语句是如果只创建的节点,这走ON CREATE,如果是MATCH则走ON MATCH
//MERGE ON MATCH 设置多个属性
MERGE (person:Person)
ON MATCH SET person.found = TRUE , person.lastAccessed = timestamp()
RETURN person.name, person.found, person.lastAccessed
MERGE关系
//MERGE一个关系
MATCH (charlie:Person { name: 'Charlie Sheen' }),(wallStreet:Movie { title: 'Wall Street' })
MERGE (charlie)-[r:ACTED_IN]->(wallStreet)
RETURN charlie.name, type(r), wallStreet.title
//MERGE多个关系
//下面这个会创建新的Movie节点
MATCH (oliver:Person { name: 'Oliver Stone' }),(reiner:Person { name: 'Rob Reiner' })
MERGE (oliver)-[:DIRECTED]->(movie:Movie)<-[:ACTED_IN]-(reiner)
RETURN movie
//MERGE无向关系
//当没有时候,这创建这个关系,会随机加入方向
MATCH (charlie:Person { name: 'Charlie Sheen' }),(oliver:Person { name: 'Oliver Stone' })
MERGE (charlie)-[r:KNOWS]-(oliver)
RETURN r
//MERGE已经存在的两个j节点
MATCH (person:Person)
MERGE (city:City { name: person.bornIn })
MERGE (person)-[r:BORN_IN]->(city)
RETURN person.name, person.bornIn, city
//MERGE存在的节点和MERGE的节点
MATCH (person:Person)
MERGE (person)-[r:HAS_CHAUFFEUR]->(chauffeur:Chauffeur { name: person.chauffeurName })
RETURN person.name, person.chauffeurName, chauffeur
MERGE时使用唯一约束
为了MERGE冲突的结果,引入唯一约束,使得最多一个节点匹配
//创建约束
CREATE CONSTRAINT ON (n:Person) ASSERT n.name IS UNIQUE;
CREATE CONSTRAINT ON (n:Person) ASSERT n.role IS UNIQUE;
//
MERGE (laurence:Person { name: 'Laurence Fishburne' })
RETURN laurence.name
本文使用 文章同步助手 同步