“ Cypher是Neo4j的操作语言,本章以Neo4j4.4.17版本进行介绍。”
-
基础操作
-
进阶操作 本部分主要包括:合并、循环和路径的操作。
通过本章的学习,可以满足对大多数场景中Neo4j的操作。
注意:
-
相关的基础概念和Cypher的基础操作。参考学习视频 -
如果直接复制文章中的语句,进行执行的话,遇到报错是正常现象。改为手动输入即可
01
—
Cypher基础操作:增
“ Neo4j中的新增操作,主要使用关键字 create,用来实现neo4j中节点、关系的新增。”
-
新增节点
create (n:Person) return n
-
create :新增关键字
-
( ) :一对小括号表示 node (节点)
-
n :变量,用来代表当前节点
-
Person :节点n的标签,类似表
-
return :用来把结果进行返回
-
新增属性
对属性的新增,有两种方式:
方式一:已有节点
match (n:Person) set n.name = "张三" , n.age = 18 return n
此时,先使用关键字 match 进行查询,然后通过关键字 set 进行属性的设置。
-
match :查询关键字,在neo4j中用来执行查询操作,类似mysql中的select
-
set :用来设置属性
方式二:没有节点
create (n:Person{name:"里斯"}) set n.age = 20 return n
-
新增关系
match (n:Person{name:"张三"})
match (n1:Person{name:"里斯"})
create p = (n)-[r:KNOWS{date:"2023-04-02",city:"北京"}]->(n1)
return p
关系总是从一个起点指向一个终点。因此,需要有两个已知点。
-
()-[]->():关系结构。箭头总是从起点指向终点
-
p:表示当前路径。包含起点、终点、关系信息
-
r :表示当前关系。仅仅包含关系信息
02
—
Cypher基础操作:删
“ Neo4j中的删除操作,主要使用关键字 delete、remove,用来实现neo4j中节点、关系和属性的删除操作。”
-
删除属性
属性的删除有两种方式:
方式一:remove
match (n:Person{name:"里斯"}) remove n.age return n
可以看到,节点上age属性已经不存在了。
方式二:set
match (n:Person{name:"张三"}) set n.age = null return n
在Neo4j中,可以通过给属性赋值为 null,来进行属性的删除操作。
-
删除关系
match (s:Person{name:"里斯"})-[r]->(t:Person) delete r
可以看到,张三和里斯之间的关系已经删除了。
-
删除节点
match (n:Person{name:"里斯"}) delete n
可以看到,Person节点只剩下张三了。
注意:如果两个节点之间有关系的时候。此时,执行节点删除,会提示删除失败。需要先删除关系,然后才能对节点进行删除。
针对这种情况,还有另外一种删除方法。可以同时删除节点和关系
match (n:Person) detach delete n
-
detach :关键字,执行节点删除时,添加该关键字,会同时删除节点之间的关系。
需要注意的是:如果数据量大的情况下,该操作是危险的,有可能导致内存溢出。针对此种情况,后续会介绍别的方式,可以解决该问题。
03
—
Cypher基础操作:改
“ Neo4j中的修改操作,主要针对属性,使用set关键字进行更新。”
-
更新属性
match (n:Person{name:"张三"}) set n.name = "小红" return n
可以看到,Person节点张三,已经被改为了小红。
04
—
Cypher基础操作:查
“ Neo4j中的查询操作,主要用来查询节点、属性或者关系。”
-
查询节点
match (n:Person{name:"张三"} return n
-
match:neo4j中的查询关键字
-
查询属性
match (n:Person{name:"里斯"}) return n.name as name
在return的时候,通过节点的别名变量 n,来对属性进行引用,从而返回需要的属性信息。
-
查询关系
match p = (s:Person)-[r]->(e) return p
05
—
Cypher进阶操作:合并
“ Neo4j中的合并操作,主要是使用关键字merge,对节点和关系进行操作。”
-
合并节点
merge (n:Person{name:"里斯"}) set n.city = "北京" return n
语句执行之前,我们先进行查询操作,查看一下Person节点中name为里斯的节点有几个,结果如下:
此时,执行上面的语句,结果如下:
然后,继续执行查询,查看一下结果:
可以看到,结果还是只有一个name为里斯的Person节点。并且比merge之前多了一个属性city。
结果可知:merge对节点进行了更新操作。
接着往下看:
此时我们执行另外一个merge语句
merge (n:Person{name:"里斯",city:"河南"}) return n
可以看到,结果报错,错误信息为:已经 存在一个name属性为里斯的Person节点
Neo.ClientError.Schema.ConstraintValidationFailed
Node(4) already exists with label `Person` and property `name` = '里斯'
首先,出现该错误的原因是:Person节点存在唯一属性,可以执行以下命令进行查询
show index
可以看到:节点Person在name属性上有一个唯一约束。
那么问题来了:如果删除Person节点中name上的约束呢,结果是什么样?
通过以下命令,进行约束删除
drop constraint constraint_550b2518
此时,我们再次执行上面的merge语句,结果如下:
然后,我们查询一下Person节点中,name属性的值为里斯的节点有几个:
可以看到:结果中有两个。
此时此刻,你的心中,是否对我进行了怀疑 ?
上面明明说了:merge对节点进行了更新。但是,这里怎么对了一个节点呢?
此处要说的内容,需要划线,考试要考的
merge原理:
在执行merge的时候,首先根据提供的条件进行查询操作,如果找到匹配的结果,进行更新;反这,就会进行新增。也就是说,merge的结果是一定会存在的。
细心的同学可能已经注意到了,我们第一个merge语句,有一个条件"{name:"里斯"}",而在第二个merge语句中,条件是"{name:"里斯",city:"河南"}"。
在第二个merge执行之前,我们的数据库中,不存在一个name属性为里斯,同时city属性为河南的Person节点。所以,会执行新建操作。
可能有的同学就该有问题了:那么我们merge操作之后,到底是执行了新增,还是执行了更新呢?
好的, 我们可以接着往下看。
merge (n:Person{name:"张三"})
on match set n.flag = "update"
on create set n.flag = "add"
return n
我们在merge的时候,可以配合 on match 和 on create 进行
-
on match:当匹配到结果时执行的操作
-
on create:当匹配不到结果时执行的操作。
从上图结果中,我们可以看到,我在执行merge时,通过on match 和 on create 以及一个flag属性,来标记当前进行了更新还是操作。如果匹配到结果则给flag属性赋值update,反之,则赋值为add。以此来表明merge之后,到底进行了更新还是新增操作。
同时还有另外一个需要注意的地方:具体参考视频
-
合并关系
neo4j中关系的合并和节点的一样,在这里不在进行演示了,同学们可以自己尝试下,具体操作视频中已经有了。可以参考视频中的内容进行验证。
06
—
Cypher进阶操作:循环
“ Neo4j中的循环操作,主要是使用关键字foreach和 unwind,对集合进行操作。”
-
foreach
match p = (s:Person)-[r]->(t:Person)
foreach (n in nodes(p) | set n.country = "中国")
-
foreach:循环操作
可以看到,我们查询了Person之间的关系,并对所有有关系的Person节点添加了一个country属性,并且赋值为:中国
-
unwind
unwind [1,2,3,4] as ids
create (n:Country) set n.businessId = ids
-
unwind:对集合进行循环
可以看到,我们给unwind传递了一个集合,然后在创建Country节点的时候设置了businessId属性为集合中的元素。从而批量创建了4个Country节点
那么,可能有的同学就该想了,我们是不是可以直接用unwind进行批量创建节点,并且赋值所有的属性呢?答案显而易见是可以的
unwind [{name:"中国",age:100},{name:"日本",age:-1}] as n
create (c:Country) set c.name = n.name ,c.age = n.age
可以看到,在我们执行完之后,多了两个节点。在当前cypher中,我们的集合中是个对象,因此我们可以在循环的时候,指定对象中的属性赋值给节点
07
—
Cypher进阶操作:路径
“ Neo4j中的路径操作,主要是用来查询节点之间的路径。”
-
最短路径
match p = shortestPath((s:Person{name:"张三",age:18})-[*]-(e:Person{name:"小红",country:"中国"})) return p
-
shortestPath:最短路径函数,可以用来判断两个点之间是否有关系
-
指定深度查询关系
match p = (s:Person{name:"张三"})-[*..2]-(e:Person{name:"小红"}) return p
-
()-[*..2]->():通过在关系中指定查询的深度,来查询指定深度的关系
详细的操作请参考视频。
获取操作视频,公众号回复:neo4j语法
发表评论