neo4j使用详解(三、cypher插入语法——最全参考)

在这里插入图片描述


Neo4j系列导航:
neo4j及简单实践
cypher语法基础
cypher插入语法
cypher插入语法
cypher查询语法
cypher通用语法
cypher函数语法
neo4j索引及调优


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 n

    merge带标签和属性的节点:

    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 r

    merge多个关系:

    match (n:Person {name:"张三"}),(m:Person {name:"李四"}) merge (n)-[:Watch]->(movie:Movie{name:"万达”,created:timestamp()})<-[:Watch]-(m) return movie

    merge非直接关系:

    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

  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值