首页 > 编程笔记 > MySQL笔记 阅读:13

Cypher SET语句的用法(非常详细,附带实例)

若需要向现有节点或关系添加新属性,那么可以使用 SET 语句。

下面先删除图中所有的节点和关系,代码如下:
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 映射中改变属性,具体如下:
代码如下:
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"│

相关文章