neo4j图数据库,如何使用match语句查询某个节点数据?
发布于 作者:苏南大叔 来源:程序如此灵动~![](/usr/themes/panda/assets/img/icon/ok.png)
neo4j
图数据库的cypher
语言的入门文章,这里还是按照CRUD
的思路来讲述。那么,第二篇文章就应该讲述查询部分了,在cypher
里面,称之为match
。本文讲述的就是,在neo4j
里面,主要有节点和关系两种情况组成,本文中主要讲述查询节点,关系的查询将放入下一篇文章中讲述。
![苏南大叔到底是谁?!? - neo4j-match节点 苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - neo4j-match节点](/usr/img/water/d8/d8bec4508c21d397.png)
大家好,这里是苏南大叔的“程序如此灵动”博客,这里记录苏南大叔和计算机代码的故事。本文讲述,在cyphar
查询语言中,如何利用match
语句查找想要的节点数据。本文测试环境:win10
,neo4j社区版@4.4.5
。龙套数据还是官方自带的movie
数据。
基本思路
本文中主要介绍的就是cql
中的match
系列语句,类似于sql
中的select
语句。
使用match
的时候,首先要理解:
节点是用关系连接起来的,这种描述就是:
当然,因为关系有方向,所以,还可以写成
或者无方向版本:
还可以省略关系描述,只描述节点:
上面n1
/r
/n2
都是变量,match
系列语句最基本的框架就是:
虽然关键字是大写的,但是大小写并不敏感,小写的也能顺利执行。
查询所有节点
正常来说,这个选择所有节点(和关系)的方式是:
数据上返回的仅仅是节点数据,但是在"图"上还是表现出来了关系,似乎是有些不妥。
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - match n 苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - match n](/usr/img/water/4d/4d59b5d7d93c5d13.png)
下面的节点中,结果以组的形式出现的。由于没有指明关系的方向,两侧的节点相同,但是顺序相反。
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - matchnm-graph 苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - matchnm-graph](/usr/img/water/8b/8bfd8f95925e024d.png)
考虑到关系的方向性,以及查询节点时,关系描述可以省略。相关的组合如下:
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - matchnrm 苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - matchnrm](/usr/img/water/f4/f493be51e8e6c457.png)
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - matchnm 苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - matchnm](/usr/img/water/d7/d7fa99f92518263c.png)
统计节点数据
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - cnt统计 苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - cnt统计](/usr/img/water/2a/2a6e2aa92f099032.png)
注意:不能在returncount(n)
的时候,再return
别的,这个时候count()
出来的数据就不是你想要的了。
利用属性查找节点
不等号的正确表述是:<>
,而不是!=
。
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - 不等于符号的使用 苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - 不等于符号的使用](/usr/img/water/4b/4b061161564fc956.png)
这里的属性有两种描述方式,一种是写在节点描述里面,这种方式很赞,另外一种是传统的where
语句。
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - match-props 苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - match-props](/usr/img/water/c0/c027b117235e4dcc.png)
利用标签查找节点
这种情况下,就可以对节点做进一步的限制,苏南大叔觉得,就类似于sql
中的select * from Person
。
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - 通过标签查询数据 苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - 通过标签查询数据](/usr/img/water/37/37ae31a525743331.png)
利用关系查找节点
这里就是描述关系类型为ACTED_IN
的演员数据。
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - 通过关系查询数据 苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - 通过关系查询数据](/usr/img/water/4e/4e50f980572825b4.png)
利用identity查找节点
每个节点在插入数据库的时候,系统都给它自动配置了一个identity
,是个从0开始的自增数值。那么在cypher
里面就表现为id()
。
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - match-by-id 苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - match-by-id](/usr/img/water/c9/c956daaea52ba2c2.png)
查找孤立节点
关系成立的前提是有节点,节点存在的前提可是无需关系。所以,世界上是可能存在孤立节点的。
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - 孤立节点 苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - 孤立节点](/usr/img/water/12/12311bc1eabe8ca3.png)
孤单是一群人的狂欢,狂欢是一群人的孤单~
order处理结果
查询结果排序,查询到的结果如果是一系列数据的话,还可以使用order by
或者limit
来进行进一步处理,这个和以往的sql
经验是一样的。
注意order by
的位置,在语句的最后面,如果放到return
之前的话,是会报错的。
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - 节点排序 苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - 节点排序](/usr/img/water/28/28f9bb8cef99f3ce.png)
limit处理结果
传统的limit 0,2
,这里是skip 0 limit 2
,而且skip 0
这块经常是被忽略的。
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - skip和limit 苏南大叔:neo4j图数据库,如何使用match语句查询某个节点数据? - skip和limit](/usr/img/water/d0/d00001b32774098b.png)
参考文献
综述
本文就介绍最基本的match...return...
语句,更加高级的应用场景在以后的文章中说明。更多cypher
文章,请点击苏南大叔的博客:
![](/usr/themes/panda/assets/img/icon/end.gif)
![](/usr/themes/panda/assets/img/icon/ok.png)
![](/usr/themes/panda/assets/img/icon/stop.png)