cypher 语法

ads

 Cypher是Neo4j的操作语言,本章以Neo4j4.4.17版本进行介绍。



Cypher是一种声明式的图数据库查询语言,表现力丰富,查询效率高,能高效的查询和更新图数据库。对于初学者来说 Cypher使用相对简单,但是它的功能非常强大,即使非常复杂的数据库查询也能用Cypher简要的表达出来。本章通过两部分进行介绍Cypher的操作。

  • 基础操作
本部分主要包括:关系、节点、属性的增、删、改、查

  • 进阶操作
    本部分主要包括:合并、循环和路径的操作。


通过本章的学习,可以满足对大多数场景中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



没有节点的情况下,直接在create时,使用set进行赋值,或者是在节点标
签后,使用一对大括号,进行赋值





  • 新增关系

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.ConstraintValidationFailedNode(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 (in nodes(p) | set n.country = "中国")

  • foreach:循环操作


可以看到,我们查询了Person之间的关系,并对所有有关系的Person节点添加了一个country属性,并且赋值为:中国

  • unwind

unwind [1,2,3,4] as idscreate (n:Countryset n.businessId = ids

  • unwind:对集合进行循环


可以看到,我们给unwind传递了一个集合,然后在创建Country节点的时候设置了businessId属性为集合中的元素。从而批量创建了4个Country节点

那么,可能有的同学就该想了,我们是不是可以直接用unwind进行批量创建节点,并且赋值所有的属性呢?答案显而易见是可以的

unwind [{name:"中国",age:100},{name:"日本",age:-1}] as ncreate (c:Countryset 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语法 

最后编辑于:2024/1/16 拔丝英语网

admin-avatar

英语作文代写、国外视频下载

高质量学习资料分享

admin@buzzrecipe.com