我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

neo4j图数据库的cypher语言的入门文章,这里还是按照CRUD的思路来讲述。那么,第二篇文章就应该讲述查询部分了,在cypher里面,称之为match。本文讲述的就是,在neo4j里面,主要有节点和关系两种情况组成,本文中主要讲述查询节点,关系的查询将放入下一篇文章中讲述。

苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - neo4j-match节点
neo4j图数据库,如何使用match语句查询某个节点数据? (图14-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里记录苏南大叔和计算机代码的故事。本文讲述,在cyphar查询语言中,如何利用match语句查找想要的节点数据。本文测试环境:win10neo4j社区版@4.4.5。龙套数据还是官方自带的movie数据。

基本思路

本文中主要介绍的就是cql中的match系列语句,类似于sql中的select语句。
使用match的时候,首先要理解:

节点是用关系连接起来的,这种描述就是:

(n1)-[r]->(n2)

当然,因为关系有方向,所以,还可以写成

(n1)<-[r]-(n2)

或者无方向版本:

(n1)-[r]-(n2)

还可以省略关系描述,只描述节点:

(n1)--(n2)

上面n1/r/n2都是变量,match系列语句最基本的框架就是:

MATCH ... RETURN ...

虽然关键字是大写的,但是大小写并不敏感,小写的也能顺利执行。

查询所有节点

正常来说,这个选择所有节点(和关系)的方式是:

MATCH (n) RETURN n
数据上返回的仅仅是节点数据,但是在"图"上还是表现出来了关系,似乎是有些不妥。

苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - match n
neo4j图数据库,如何使用match语句查询某个节点数据? (图14-2)

下面的节点中,结果以组的形式出现的。由于没有指明关系的方向,两侧的节点相同,但是顺序相反。

苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - matchnm-graph
neo4j图数据库,如何使用match语句查询某个节点数据? (图14-3)

考虑到关系的方向性,以及查询节点时,关系描述可以省略。相关的组合如下:

MATCH (n)-[r]-(m) RETURN n,m
MATCH (n)--(m) RETURN n,m
MATCH (n)-[r]->(m) RETURN n,m
MATCH (n)-->(m) RETURN n,m
MATCH (n)<-[r]-(m) RETURN n,m
MATCH (n)<--(m) RETURN n,m

苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - matchnrm
neo4j图数据库,如何使用match语句查询某个节点数据? (图14-4)

苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - matchnm
neo4j图数据库,如何使用match语句查询某个节点数据? (图14-5)

统计节点数据

MATCH (n) RETURN COUNT(n)
MATCH (n) RETURN COUNT(n) as cnt

苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - cnt统计
neo4j图数据库,如何使用match语句查询某个节点数据? (图14-6)

注意:不能在return count(n)的时候,再return别的,这个时候count()出来的数据就不是你想要的了。

利用属性查找节点

MATCH (n{born:1964})--(m) RETURN n,m
MATCH (n{born:1964}) RETURN n
MATCH (n) where n.born=1964 and n.name<>"" RETURN n
MATCH (n) where n.born>=1964 RETURN n
不等号的正确表述是:<>,而不是!=

苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - 不等于符号的使用
neo4j图数据库,如何使用match语句查询某个节点数据? (图14-7)

这里的属性有两种描述方式,一种是写在节点描述里面,这种方式很赞,另外一种是传统的where语句。

苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - match-props
neo4j图数据库,如何使用match语句查询某个节点数据? (图14-8)

match (n:Person) where n.name =~ '苏.*' return n
match (n:Person) where n.name contains '苏' return n;

利用标签查找节点

MATCH (n:Person) RETURN n

这种情况下,就可以对节点做进一步的限制,苏南大叔觉得,就类似于sql中的select * from Person

苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - 通过标签查询数据
neo4j图数据库,如何使用match语句查询某个节点数据? (图14-9)

利用关系查找节点

MATCH (n)-[:ACTED_IN]->(m) RETURN n

这里就是描述关系类型为ACTED_IN的演员数据。

苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - 通过关系查询数据
neo4j图数据库,如何使用match语句查询某个节点数据? (图14-10)

利用identity查找节点

match (n) where id(n)>19 return n
match (n) where id(n)=2 return n
match (n) where id(n)<2 return n

每个节点在插入数据库的时候,系统都给它自动配置了一个identity,是个从0开始的自增数值。那么在cypher里面就表现为id()

苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - match-by-id
neo4j图数据库,如何使用match语句查询某个节点数据? (图14-11)

查找孤立节点

关系成立的前提是有节点,节点存在的前提可是无需关系。所以,世界上是可能存在孤立节点的。

MATCH (n) WHERE NOT (n)--() RETURN n

苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - 孤立节点
neo4j图数据库,如何使用match语句查询某个节点数据? (图14-12)

孤单是一群人的狂欢,狂欢是一群人的孤单~

order处理结果

查询结果排序,查询到的结果如果是一系列数据的话,还可以使用order by或者limit来进行进一步处理,这个和以往的sql经验是一样的。

match (n:Person) return n order by n.born desc
match (n:Person) return n order by id(n) desc

注意order by的位置,在语句的最后面,如果放到return之前的话,是会报错的。

苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - 节点排序
neo4j图数据库,如何使用match语句查询某个节点数据? (图14-13)

limit处理结果

match (n:Person) return n order by id(n) desc skip 0 limit 2
match (n:Person) return n limit 2

传统的limit 0,2,这里是skip 0 limit 2,而且skip 0这块经常是被忽略的。

苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - skip和limit
neo4j图数据库,如何使用match语句查询某个节点数据? (图14-14)

参考文献

综述

本文就介绍最基本的match...return...语句,更加高级的应用场景在以后的文章中说明。更多cypher文章,请点击苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   neo4j    cypher