
1.插入语法
create, merge, set, delete, remove, create unique, load csv(import)
 除插入语法外另外的语法详情请博主其他文章:
 查询语法
 其他语法
1.1.create语法
-  创建单个节点: create(n)# (ID:n)
-  创建带标签的节点: create (n:Person)# (ID:n, label:Person)
-  创建带多个标签的节点: create (n:Person:Student:Man)# (ID:n, label:Person,Student,Man)
-  创建带标签和属性的节点: create (n:Person {name:"张三",age:18})# (ID:n, label:Person, {name:“张三”})- 返回创建的节点:
 create (n:Person {name:"张三",age:18}) return n
-  创建多个节点: create (n:Person {name:"张三"}), (m:Person {name:"李四"}) return n, m
-  创建节点和关系: create (n:Person {name:"张三"})-[r:Friend]->(m:Person {name:"李四"})
-  创建节点和带属性的关系: 
create (n:Person {name:"张三"})-[r:Friend {time:8}]->(m:Person {name:"李四"})
- 创建关系(节点已存在): 
  match (n:Person{name:“张三”}), (m:Person{name:“李四”}) create (n)-[r:Friend{time:1994}]->(m) retur r
- 创建一个完整路径: 
  create p =(n:Person {name:"张三"})-[:Friend]->(m:Person{name:"李四"})<-[:Friend]-(s:Person{name:"王五"}) return p
1.2.merge语法
是match和create的结合,可以确保模式在graph中存在(要么已经存在要么创建)。为了性能考虑,在标签和属性中创建了索引时推荐使用merge。
- merge: 存在则匹配,不存在则创建 
  merge单个节点: merge (n:Person) return n,labels(n)merge带属性的节点: merge (n{name:"张三",age:18}) return nmerge带标签和属性的节点: merge(n:Person{name:"张三", age:18}) return n.name, n.age合并来自已存在节点的单个节点的属性: match (person:Person{name:"张三") merge (city:City{name:person.name}) return person, city
- merge…on create: 没有则创建节点,并设置节点属性 
  merge (n:Person{name:"name01"}) on create set n.created=timestamp() return n
- merge…on match: 如果找到节点就设置属性,否则仅创建节点 
  merge (n:Person{name:"张三"}) on match set person.sex="男" return n
- merge… on create… on match: 如果找到就设置属性(on match后跟的属性),没找到创建节点并设置属性(on create后跟的属性) 
  merge (n:Person{name:"张三"}) on create set n.created = timestamp() on match set n.lastSeen = timestamp() return n
- merge关系: 匹配或者创建关系,使用MERGE去匹配或者创建关系时,必须至少指定一个绑定的节点 
  merge一个关系: match (n:Person {name:"张三"}),(m:Person {name:"李四"}) merge (n)-[r:Friend]->(m) return rmerge多个关系: match (n:Person {name:"张三"}),(m:Person {name:"李四"}) merge (n)-[:Watch]->(movie:Movie{name:"万达”,created:timestamp()})<-[:Watch]-(m) return moviemerge非直接关系: match (n:Person {name:"张三"}),(m:Person {name:"李四"}) merge (n)-[r:Watch]-(m) RETURN r
- merge的唯一性约束: 当使用的模式涉及唯一性约束时,Cypher可以通过merge来防止获取相冲突的结果 
  创建索引: create constraint on (n:Person) assert n.name is unique
 create constraint on (n:Person) assert n.age IS unique如果节点未找到,使用唯一性约束创建该节点: merge (n:Person {name:"张三"}) return n
1.3.set语法
用于更新一个节点和关系的标签或属性(属性存在则更新,不存在则创建)
- 更新属性: 
  match (n:Person {name:"张三"}) set n.age=21 return n
- 删除属性: 
  match (n:Person {name:"张三"}) set n.age=null return n
 Neo4j不允许属性存储空值null。如果属性的值不存在,那么节点或者关系中的属性将被删除
- 在节点和关系间复制属性: 
  match (n:Person {name:"张三"}),(m:movie {created:1711093191056}) set n=m return n,m
- 从map添加属性:
match (n:Person {name:"张三"}) set n+={age:18, sex:"男"} return n
当用map来设置属性时,可以使用+=形式的SET来只添加属性,而不删除图元素中已存在的属性
- 设置多个属性:
match (n:Person {name:"张三"}) set n.age=21, n.sex='男' return n
- 设置节点的标签:
match (n:Person{name:"张三"}) set n:Chinese return n
- 节点设置多个标签: 
  match (n:Person{name:"张三"}) set n:Chinese:Student return n
1.4.delete语法
用于删除节点和关系
- 删除单个节点: 
  match (n:Person) delete n
- 删除不含关系的节点: 
  match (n) where size ((n)--())=0 delete n
- 删除节点和连接它的关系: 
  match (n:Person{name:"张三" })-[r]-() delete n, r
- 删除节点和连接它的关系(使用detach): 
  match (n {name:"张三"}) detach delete n
- 删除路径: 
  match p=(d{name:"张三"})--(e{ name:"王五"}) delete p
- 删除所有节点和关系: 
  match (n) optional match (n)-[r]-() delete n,r
- 删除所有节点和关系(使用start): 
  start n=node(*) match (n)-[r]-() delete n,r
- 删除所有节点和关系(使用detach): 
  match (n) detach delete n
1.5.remove语法
用于删除图元素的属性和标签
- 删除属性: 
  match (n:Person{name:"张三"}) remove n.age return n
- 删除标签: 
  match (n:Person{name:"张三"}) remove n:Person return n
- 删除多个标签: 
  match (n:Person{name:"张三"}) remove n:Person:Student return n
- 删除所有属性(使用set): 
  match (n:Person{name:"张三"}) set n={} return n
1.6.foreach语法
foreach能够用于更新每一个path或者list中的元素,在foreach内可以使用createE创建节点
- 为所有节点设置age属性: 
  match p=(begin)-[*]->(end) where begin.name='A' and end.name='E' foreach (n in nodes(p)| set n.age=21)
1.7.create unique语法
create unique语句相当于match和create的结合体,尽可能的匹配然后创建未匹配到的
- 创建唯一节点/关系: 
  match (n{name:"name1"}) create unique (n)-[:Friend]-(e) return e
- 创建唯一节点/关系(多关系): 
  match (n{name:"name1"}) create unique (n)-[:Friend]->(e), (n)-[:Teacher]->(e) return e
1.8.load csv
用于导入csv文件,from后面接着csv的文件路径,用AS指定给变量。可以从http、https、ftp导入csv,支持gzip and deflate,其本地文件支持zip压缩, 经常和periodic commit一起使用,提交大量的数据,默认1000rows提交一次
-  导入数据: load csv from 'https://neo4j.com/docs/cypher-manual/4.1/csv/artists.csv' ad line create (:Artist {name:line[1], year:toInteger(line[2])})
-  导入带表头的数据: load csv with headers from 'https://neo4j.com/docs/cypher-manual/4.1/csv/artists-with-headers.csv' as line create (:Artist {name:line.Name, year:toInteger(line.Year)})
 文件artists-with-headers.csv列: Id,Name,Year
-  导入数据并指定分隔符: load csv from 'https://neo4j.com/docs/cypher-manual/4.1/csv/artists-fieldterminator.csv' as line fieldterminator ';' create (:Artist { name: line[1], year: toInteger(line[2])})
-  导入大批量数据并指定每次提交行数: 
-  
  using periodic commit 500 load csv from 'https://neo4j.com/docs/cypher-manual/4.1/csv/artists.csv' as line create (:Artist { name: line[1], year: toInteger(line[2])})
 using periodic commit 后面接每次提交的行数,默认为1000
-  获取导入数据的行数linenumber(): load csv from 'https://neo4j.com/docs/cypher-manual/4.1/csv/artists.csv' as line return linenumber() as number, line
-  获取导入文件的绝对路径: load csv from 'https://neo4j.com/docs/cypher-manual/4.1/csv/artists.csv' as line return distinct file() as path



















