Cypher语法关键字(二)CREATE、MERGE、CREATE UNIQUE、SET

cypher关键字

cypher关键字可分为三类。

  • 读关键字:MATCH、OPTIONAL MATCH、WHERE、START、Aggregation和LOAD CSV
  • 写关键字:CREATE、MERGE、SET、DELETE、REMOVE、FOREACH和CREATE UNIQUE
  • 通用关键字:RETURN、ORDER BY、LIMIT、SKIP、WITH、UNWIND、UNION和CALL

1,CREATE

CREATE语句用于创建图元素:节点和关系、索引。

创建节点

//创建单个节点
CREATE (n)

//创建多个节点
CREATE (n),(m)

//创建带有标签的节点
CREATE (p:Person)

//创建同时带有标签和属性的节点
CREATE (p:Person { name: 'Andres', title: 'Developer' })

创建关系

//创建两个节点之间的关系:关系必须有箭头指向
MATCH (a:Person),(b:Person)
WHERE a.name = 'NodeA' AND b.name = 'NodeB'
CREATE (a)-[r:RELTYPE]->(b)
RETURN r
    
//创建关系并设置属性
MATCH (a:Person),(b:Person)
WHERE a.name = 'NodeA' AND b.name = 'NodeB'
CREATE (a)-[r:RELTYPE{ name: 'abc' }]->(b)
RETURN r

//创建一个完整路径:当使用CREATE和模式时,模式中所有还不存在的部分都会被创建
CREATE p =(andres { name:'Andres' })-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael { name: 'Michael' })
RETURN p

创建索引

CREATE INDEX ON :Person(name)

2,MERGE

​ MERGE可以确保图数据库中存在某个特定的模式(pattern)。如果该模式不存在,那就创建它。

MERGE 节点

//合并带标签的节点:如果没有包含Ctritic标签的节点,就会创建一个新节点。
MERGE (robert:Critic)
RETURN robert, labels(robert)

//合并带多个属性的单个节点
MERGE (charlie { name: 'Charlie Sheen', age: 10 })
RETURN charlie

//合并同时指定标签和属性的节点
MERGE (michael:Person { name: 'Michael Douglas' bornIn:'newyork'})
RETURN michael.name, michael.bornIn

//合并属性来自已存在节点的单个节点
MATCH (person:Person{ bornIn:'newyork'})
MERGE (city:City { name: person.bornIn })
RETURN person.name, person.bornIn, city    

MERGE在CREATE和MATCH中的使用

//MERGE与CREATE搭配:检查节点是否存在,如果不存在则创建它并设置属性
MERGE (keanu:Person { name: 'Keanu Reeves' })
ON CREATE SET keanu.created = timestamp()
RETURN keanu.name, keanu.created

//MERGE与MATCH搭配:匹配节点,并在找到的节点上设置属性。
MERGE (person:Person { name: 'Keanu Reeves2' })
ON MATCH SET person.found = TRUE 
RETURN person.name, person.found

//MERGE与CREATE和MATCH同时使用:检查节点是否存在,如果不存在则创建它并设置created属性,如果存在就修改lastSeen属性。
MERGE (keanu:Person { name: 'Keanu Reeves' })
ON CREATE SET keanu.created = timestamp()
ON MATCH SET keanu.lastSeen = timestamp()
RETURN keanu.name, keanu.created, keanu.lastSeen

MERGE关系

//匹配或者创建关系:使用MERGE去匹配或者创建关系时,必须至少指定一个绑定的节点。
MATCH (p:Person { name: 'Charlie Sheen' }),(m:Movie { title: 'The Matrix' }) 
MERGE (p)-[r:ACTED_IN]->(m)
RETURN p.name, type(r), m.title

//合并多个关系:当MERGE应用于整个模式时,要么全部匹配上,要么全部新创建。
MATCH (oliver:Person { name: 'Lilly Wachowski' }),(reiner:Person { name: 'Rob Reiner' })
MERGE (oliver)-[:DIRECTED]->(movie:Movie)<-[:ACTED_IN]-(reiner)
RETURN movie

//合并无方向关系:MERGE也可以用于合并无方向的关系。当需要创建一个关系的时候,它将选择一个任意的方向。
MATCH (p1:Person { name: 'Charlie Sheen' }),(p2:Person { name: 'Lilly Wachowski' })
MERGE (p1)-[r:KNOWS]-(p2)
RETURN r

//合并已存在两节点之间的关系:MERGE可用于连接前面的MATCH和MERGE语句。
MATCH (person:Person { name: 'riky' })
MERGE (city:City { name: person.bornIn })
MERGE (person)-[r:BORN_IN]->(city)
RETURN person.name, person.bornIn, city

//同时合并\创建一个新节点和关系
MATCH (person:Person{name: 'Demi Moore'})
MERGE (person)-[r:HAS_CHAUFFEUR]->(chauffeur:Chauffeur { name: person.name })
RETURN person.name, person.chauffeurName, chauffeur

MERGE的唯一性约束

​ 当使用的模式涉及唯一性约束时,Cypher可以通过MERGE来防止获取相冲突的结果。

​ 下面的例子在Person的name属性上创建一个唯一性约束。

CREATE CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE;
//如果节点未找到,使用唯一性约束创建该节点
MERGE (laurence:Person { name: 'Laurence Fishburne' })
RETURN laurence.name

//唯一性约束与部分匹配:当只有部分匹配时,使用唯一性约束合并将失败。
CREATE CONSTRAINT ON (n:Person) ASSERT n.role IS UNIQUE;
CREATE (alisanda:Person { name: 'alisanda', role: 'Gordon Gekko' })

MERGE (michael:Person { name: 'Michael Douglas', role: 'Gordon Gekko' })
RETURN michael
//错误消息:Node(1578733) already exists with label `Person` and property `role` = 'Gordon Gekko'

CREATE UNIQUE

​ CREATE UNIQUE语句相当于MATCH和CREATE的混合体—尽可能地匹配,然后创建未匹配到的。

​ 可能会想到用MERGE来代替CREATE UNIQUE,然而MERGE并不能很强地保证关系的唯一性。

创建唯一节点

//创建未匹配到的节点:root节点没有任何LOVES关系。因此,创建了一个节点及其与root节点的LOVES关系。注意这里可以不指定关系方向
MATCH (root { name: 'root' })
CREATE UNIQUE (root)-[:LOVES]-(someone)
RETURN someone

//用含值的模式创建节点:没有与root节点相连的name为D的节点,所以创建一个新的节点来匹配该模式。
MATCH (root { name: 'A' })
CREATE UNIQUE (root)-[:X]-(leaf { name: 'D' })
RETURN leaf

//创建未匹配到带标签的节点
MATCH (a { name: 'Node A' })
CREATE UNIQUE (a)-[:KNOWS]-(c:blue)
RETURN c

创建唯一关系

//创建未匹配到的关系:匹配一个左节点和两个右节点之间的关系。其中一个关系已存在,因此能匹配到。然后创建了不存在的关系。
MATCH (lft { name: 'A' }),(rgt)
WHERE rgt.name IN ['B', 'C']
CREATE UNIQUE (lft)-[r:KNOWS]->(rgt)
RETURN lft, rgt

//用含值的模式创建关系
MATCH (root { name: 'root' })
CREATE UNIQUE (root)-[r:X { since: 'forever' }]-()
RETURN r

//描述复杂模式
MATCH (root { name: 'root' })
CREATE UNIQUE (root)-[:FOO]->(x),(root)-[:BAR]->(x)
RETURN x

SET

​ SET语句用于更新节点的标签以及节点和关系的属性。

//设置属性
MATCH (n { name: ' Taylor Hackford' })
SET n.surname = 'Taylor'
RETURN n

//删除属性
MATCH (n { name: 'Taylor Hackford' })
SET n. surname = NULL 
RETURN n

//在节点和关系间拷贝属性
MATCH (at { name: 'Andres' }),(pn { name: 'Peter' })
SET at = pn
RETURN at, pn

//从map中添加属性:当用map来设置属性时,可以使用+=形式的SET来只添加属性,而不删除图元素中已存在的属性。
MATCH (peter { name: 'Peter' })
SET peter += { hungry: TRUE , position: 'Entrepreneur' }

//使用一个SET语句设置多个属性
MATCH (n { name: 'Andres' })
SET n.position = 'Developer', n.surname = 'Taylor'

//设置节点的标签
MATCH (n { name: 'Stefan' })
SET n :German
RETURN n

//给一个节点设置多个标签
MATCH (n { name: 'Emil' })
SET n :Swedish:Bossman
RETURN n
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342