Neo4j 第十篇:更新数据
更新图包括图的节点和关系的创建、更新和删除,也能更新图的节点和关系的属性、节点标签和关系类型。
一,创建节点
1,创建空的节点
CREATE (n)
CREATE (a),(b)
2,创建带标签的节点
CREATE (n:Person)
CREATE (n:Person:Swedish)
3,创建带标签和属性的节点
CREATE (n:Person { name: 'Andres', title: 'Developer' })
二,创建关系
创建节点之前的关系
1,在两个节点之间创建关系
在两个节点之间创建关系,并设置关系类型
MATCH (a:Person),(b:Person) WHERE a.name = 'A' AND b.name = 'B' CREATE (a)-[r:RELTYPE]->(b) RETURN type(r)
2,创建关系,并设置关系的属性
MATCH (a:Person),(b:Person) WHERE a.name = 'A' AND b.name = 'B' CREATE (a)-[r:RELTYPE { name: a.name + '<->' + b.name }]->(b) RETURN type(r), r.name
3,CREATE子句和模式
在CREATE子句和模式中,对于模式中的任意部分,如果它不存在于图中,那么CREATE子句创建它;如果存在于图中,那么就会引用它。
CREATE p =(andres { name:'Andres' })-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael { name: 'Michael' }) RETURN p
三,删除节点和关系
使用delete子句删除节点、关系和路径,当删除节点时,该节点必须是孤立的节点,也就是说,必须首先删除跟节点相关的所有关系。
detach delete: 表示删除一个节点或多个节点,跟节点相关的所有关系也都被删除。
1,删除节点
MATCH (n:Person { name: 'UNKNOWN' }) DELETE n
2,删除所有节点和关系
MATCH (n)
DETACH DELETE n
3,删除一个节点和它的所有关系
MATCH (n { name: 'Andres' }) DETACH DELETE n
4,删除关系
MATCH (n { name: 'Andres' })-[r:KNOWS]->() DELETE r
四,更新属性或标签
set子句用于更新节点的标签,向节点和关系中添加属性
1,向节点或关系中添加属性
MATCH (n { name: 'Andres' }) SET n.surname = 'Taylor' RETURN n.name, n.surname
2,移除属性
如果设置属性的值是NULL,相当于把该属性从节点或关系中移除
MATCH (n { name: 'Andres' }) SET n.name = NULL RETURN n.name, n.age
3,复制属性
把一个节点的属性复制给另一个节点
MATCH (at { name: 'Andres' }),(pn { name: 'Peter' }) SET at = pn RETURN at.name, at.age, at.hungry, pn.name, pn.age
4,从Map中添加属性
MATCH (p { name: 'Peter' }) SET p += { hungry: TRUE , position: 'Entrepreneur' }
5,在一条set子句中添加多个属性
MATCH (n { name: 'Andres' }) SET n.position = 'Developer', n.surname = 'Taylor'
6,向节点中添加标签
MATCH (n { name: 'Stefan' }) SET n:German RETURN n.name, labels(n) AS labels
7,向节点中添加多个标签
MATCH (n { name: 'Emil' }) SET n:Swedish:Bossman RETURN n.name, labels(n) AS labels
五,移除属性
使用remove子句从节点中移除标签和属性,从关系中移除属性。
1,移除属性
默认情况下,Neo4j不允许存在值为null的属性;如果属性不存在,那么返回该属性的值是null。
MATCH (a { name: 'Andres' }) REMOVE a.age RETURN a.name, a.age
2,移除节点的标签
MATCH (n { name: 'Peter' }) REMOVE n:German RETURN n.name, labels(n)
3,移除节点的多个标签
当节点的标签为空时,labels(n)函数返回空的list
MATCH (n { name: 'Peter' }) REMOVE n:German:Swedish RETURN n.name, labels(n)
六,foreach子句
列表和路径是Cypher中的关键概念,foreach子句用于更新数据,例如,对路径中的元素或通过聚合创建的列表执行更新命令。
1,对路径中的元素执行更新命令
对路径中匹配的所有节点,添加marked属性,并设置属性值为TRUE
MATCH p =(begin)-[*]->(END ) WHERE begin.name = 'A' AND END .name = 'D' FOREACH (n IN nodes(p)| SET n.marked = TRUE )
参考文档: