Cypher SET语句的用法(非常详细,附带实例)
若需要向现有节点或关系添加新属性,那么可以使用 SET 语句。
下面先删除图中所有的节点和关系,代码如下:
然后创建节点,代码如下:

图 1 节点和关系所构成的图(SET 语句)
我们可以使用较复杂的表达式在节点或关系上设置属性,例如,可以在 SET 语句中使用 CASE WHEN 语句来匹配条件。具体代码如下:
下面将 CASE WHEN 语句中的 n.age 值修改为 36,代码如下:
使用 SET 语句删除匹配到的节点的 name 属性,代码如下:
同理,如果大括号中为空,则表示删除匹配节点的所有属性。
代码如下:
下面先删除图中所有的节点和关系,代码如下:
MATCH (n) DETACH DELETE n上述代码会删除所有的节点及关系,读者在使用过程中一定要谨慎。
然后创建节点,代码如下:
CREATE ({name:"Stefan"}) CREATE (n:Swedish {hungry:true,name:"Andy",age:36}) CREATE ({name:"Peter",age:34}) CREATE (n2{name:"George"})最后创建关系,代码如下:
MATCH (Stefan{name:"Stefan"}),(Andy{name:"Andy"}),(Peter{name:"Peter"}),(George{name:"George"}) CREATE (Stefan) - [:KNOWS] -> (Andy) CREATE (Andy) - [:KNOWS] -> (Peter) CREATE (George) - [:KNOWS] -> (Peter)由节点和关系构成的图如下图所示:

图 1 节点和关系所构成的图(SET 语句)
SET语句设置属性值
使用 SET 语句为 name 属性值为 Andy 的节点设置 surname 属性,其值为 Taylor,代码如下:MATCH (n { name: 'Andy' }) SET n.surname = 'Taylor' RETURN n.name, n.surname返回值为:
│"n.name"│"n.surname"│ │"Andy" │"Taylor" │从结果可以看出,节点添加了一个新的属性 surname,其值为 Taylor。
我们可以使用较复杂的表达式在节点或关系上设置属性,例如,可以在 SET 语句中使用 CASE WHEN 语句来匹配条件。具体代码如下:
MATCH (n { name: 'Andy' }) SET ( CASE WHEN n.age = 55 THEN n END ).worksIn = 'Malmo' RETURN n.name, n.worksIn返回值如下:
│"n.name"│"n.worksIn"│ │"Andy" │null │在 CASE WHEN 语句中,节点的 name 属性值为 Andy,但节点的 age 属性值不为 55,所以无法进行匹配,故该节点的 worksIn 属性值为 null。
下面将 CASE WHEN 语句中的 n.age 值修改为 36,代码如下:
MATCH (n { name: 'Andy' }) SET ( CASE WHEN n.age = 36 THEN n END ).worksIn = 'Malmo' RETURN n.name, n.worksIn返回值如下:
│"n.name"│"n.worksIn"│ │"Andy" │"Malmo" │这是因为 n.age 的值为 36,与图 1 中的 Andy 节点匹配,所以可以正常设置该节点的 worksIn 属性为 'Malmo'。
SET语句更新属性值
使用 SET 语句修改匹配到的节点的 age 属性值数据类型,将其改为字符串类型,代码如下:MATCH (n { name: 'Andy' }) SET n.age = toString(n.age) RETURN n.name, n.age返回值如下:
│"n.name"│"n.age"│ │"Andy" │"36" │从结果可以看出,节点的 age 属性形式为"36",这说明其数据类型为字符串类型。
SET语句删除属性值
前文中提到了 REMOVE 语句可以删除属性,其实 SET 语句也可删除属性。使用 SET 语句删除匹配到的节点的 name 属性,代码如下:
MATCH (n { name: 'Andy' }) SET n.name = NULL RETURN n.name, n.age返回值如下:
│"n.name"│"n.age"│ │null │"36" │从结果可以看出,节点的name属性已经被删除。
SET语句使用map和=完成替换所有属性
属性替换操作符(=)与 SET 语句一起使用,其作用是替换节点上的所有现有属性。代码如下:MATCH (p { name: 'Peter' }) SET p = { name: 'Peter Smith', position: 'Entrepreneur' } RETURN p.name, p.age, p.position返回值如下:
│"p.name" │"p.age"│"p.position" │ │"Peter Smith"│null │"Entrepreneur"│可以看出,name 属性值为 Peter 的节点上的所有属性均被大括号中的属性所替换。
同理,如果大括号中为空,则表示删除匹配节点的所有属性。
SET语句用map和+=改变特定的属性
属性操作符 += 可以与 SET 语句一起使用,以一种细粒度的方式从 map 映射中改变属性,具体如下:- 任何不存在于节点或关系上的局部追加的属性会被添加到节点或关系中;
- 不是局部追加的属性,但在节点或关系上存在的原有属性将保持不变;
- 同时存在于 map 映射和节点或关系中的属性,会根据 map 映射中的属性进行替换,如果映射中对应的属性为空,则将从节点或关系中删除该属性。
代码如下:
MATCH (p { name: 'Stefan' }) SET p + = { age: 38, hungry: TRUE , position: 'Entrepreneur' } RETURN p.name, p.age, p.hungry, p.position返回值如下:
│"p.name"│"p.age"│"p.hungry"│"p.position" │ │"Stefan"│38 │true │"Entrepreneur"│