图数据库Neo4j学习三——cypher语法总结

1MATCH

1.1作用

MATCH是Cypher查询语言中用于从图数据库中检索数据的关键字。它的作用是在图中查找满足指定条件的节点和边,并返回这些节点和边的属性信息。

在MATCH语句中,通过节点标签和边类型来限定查找范围,然后通过WHERE语句来筛选符合条件的节点和边。最后,通过RETURN语句返回查询结果中的属性信息。

1.2语法规则

sql 复制代码
MATCH (node1:Label1)-[edge:RELATIONSHIP]->(node2:Label2)
WHERE <condition>
RETURN <expression>
  1. Label1/ Label2表示节点的标签
  2. node1和node2是节点变量,可以用来引用节点的属性信息
  3. RELATIONSHIP表示边的类型
  4. edge是边变量,可以用来引用边的属性信息
  5. 是可选的查询条件,可以用来筛选满足条件的节点和边
  6. 是要返回的属性信息

在MATCH语句中,通过节点标签和边类型来限定查找范围,然后通过条件语句来筛选符合条件的节点和边。最后,通过RETURN语句返回查询结果中的属性信息。

1.3查询示例

假设我们有一个拥有Person和City两种标签的图数据库,其中Person节点有name、age和gender属性,City节点有name和population属性,它们之间的关系是Person节点居住在City节点中。我们要查找居住在人口大于100万的城市中女性的姓名和年龄。

sql 复制代码
MATCH (person:Person)-[:LIVES_IN]->(city:City)
WHERE city.population > 1000000 AND person.gender = 'F'
RETURN person.name, person.age

2OPTIONAL MATCH

2.1作用

在Cypher中,OPTIONAL MATCH用于查找可能匹配但不是必须的模式。这意味着,如果匹配失败或者找不到匹配的节点、关系或路径,OPTIONAL MATCH语句不会导致整个查询失败。相反,它将返回一个空结果。

2.2语法规则

sql 复制代码
OPTIONAL MATCH (node1:Label1)-[edge:RELATIONSHIP]->(node2:Label2)

2.3查询示例

sql 复制代码
//查找节点及其关系,如果关系不存在则返回空结果
MATCH (a:User)
OPTIONAL MATCH (a)-[r:RELATION]->(b)
RETURN a, r, b

例如如下所示,我们当我们使用OPTIONAL MATCH (a)-[r:RELATION]->(b) ,查询时,由于这里的RELATION 是可选的匹配,因此,该关系就是,有就返回,没有就返回null,但是对于 (a:User) 则会全量返回,而对于 (b) 而言,因为b节点是通过关系查找的,因此如果关系不存在,那么这里的b节点一样也返回null。

提问:明明只有西子->念念、西子->老司、老司->念念这三个关系为RELATION,为什么上图中把西子->小跟班的老公关系也带出来?

这里其实不是RELATION查询出来的,而是MATCH (a:User)中,包含了西子,和小跟班,西子的老公是小跟班,然后用Neo4j来默认渲染上的拓扑节点。

我们实际查看数据的时候,可以看到返回的table中,西子和小跟班之间是没有找到关系,这是因为西子和小跟班之间的关系是老公,不是RELATION,所以用RELATION查询,是没有关系的,但是Neo4j在绘制拓扑图的时候会按照老公的关系,进行绘制。

这里我们做两个试验查询即可

sql 复制代码
//查询西子和小跟班,并没有查询他们的关系,返回的实际数据中,也没有两人的关系,但是确实neo4j绘制了拓扑图
MATCH (a:User{userName:'小跟班'}),(b:User{userName:'西子'}) RETURN a,b


而小跟班和念念没有建立关系,因此把西子改成念念以后,他们就变成两个孤立的点

因此得出一个结论,当neo4j返回的节点A和B,如果节点A和B本身具有关系,那么neo4j会自动把关系给补上

这里我们返回名称,用表格的关系来查看,就能看到如下所示,没有的值则是null,我们可以使用**type()**这个方法来查看关系类型

sql 复制代码
//查找节点及其关系,如果关系不存在则返回空结果
MATCH (a:User)
OPTIONAL MATCH (a)-[r:RELATION]->(b)
RETURN a.userName,type(r),r.nane, b.userName

2.4对比MATCH

OPTIONAL MATCH查询比MATCH多了一个OPTIONAL,那么我们把OPTIONAL删除掉来看看效果

sql 复制代码
//查找节点及其关系,如果关系不存在则返回空结果
MATCH (a:User) OPTIONAL MATCH (a)-[r:RELATION]->(b) RETURN a, r, b

//如果我们把OPTIONAL去掉,那么会发生什么效果?
MATCH (a:User) MATCH (a)-[r:RELATION]->(b) RETURN a, r, b

不难发现,只保留了RELATION 关系的节点,没有RELATION关系的节点都没了

同样的查看表格数据,我们发现,确实只有RELATION,也就是有就有,没有就没有,没有就不返回了,由于没有返回节点,因此neo4j也没办法使用默认关系来绘制关系图

sql 复制代码
MATCH (a:User) MATCH (a)-[r:RELATION]->(b) RETURN a.userName,type(r),r.nane, b.userName

3RETURN

3.1作用

在Neo4j中使用Cypher查询语言,RETURN 关键字用于指定查询的结果集。查询的结果集可以是节点、关系、属性或一组这些元素的组合。

查询中的 RETURN 子句指定了查询返回的结果,可以返回节点、关系、属性、子图等。例如,可以使用 RETURN 显示特定节点的属性,也可以使用 RETURN 显示已匹配的节点和关系的子图。

使用 RETURN 子句的查询会返回一个结果集,这个结果集可以在Neo4j中进行进一步的处理,如排序、筛选、分组等。同时,RETURN 子句也可以与其他Cypher子句一起使用,如 MATCH 和 WHERE 等,以实现更复杂的查询操作。

3.2语法规则

sql 复制代码
RETURN <expression>
sql 复制代码
显示所有节点
MATCH (n) RETURN n

显示特定节点和它的标签
MATCH (n:Label) RETURN n, labels(n)

显示节点、关系和属性
MATCH (n)-[r]->(m) RETURN n, r, m

返回最短路径
MATCH p=shortestPath((a)-[r:REL_TYPE*]->(b)) RETURN p

显示节点计数
MATCH (n) RETURN count(n)

在Cypher中,RETURN 还允许你选择使用聚合函数,如 COUNT,SUM,MIN,MAX 和 AVG 等。

4WITH

4.1作用

在Neo4j中,WITH 关键字用于将查询结果传递到下一个查询中,并将其作为输入数据。WITH 关键字可以将查询分为多个部分,并允许在这些部分之间传递数据。

4.2使用场景

WITH 子句通常用于以下几种情况:
1为表达式求值结果引入新变量

sql 复制代码
MATCH (george {name: 'George'})<--(otherPerson)
WITH otherPerson, toUpper(otherPerson.name) AS upperCaseName
WHERE upperCaseName STARTS WITH 'C'
RETURN otherPerson.name

2查询分割 :您可以使用WITH子句将一个查询分成几个部分,以便执行更复杂的操作。

例如,以下查询将找到所有与Alice有共同朋友的人,然后计算每个人有多少个共同朋友

sql 复制代码
MATCH (alice:Person {name: 'Alice'})-[:FRIEND]->(commonFriend:Person)<-[:FRIEND]-(person:Person)
WITH person, count(commonFriend) as numCommonFriends
RETURN person.name, numCommonFriends

3聚合 :WITH子句还可以用于聚合数据。

例如,以下查询将计算每个标签的出现次数:

sql 复制代码
MATCH (n)
UNWIND labels(n) as label
WITH label, count(*) as count
RETURN label, count

在WITH子句中,还可以使用DISTINCT关键字来确保结果集中没有重复项,以及ORDER BY子句来对结果集进行排序

相关推荐
XYN6128 分钟前
【嵌入式学习3】UDP发送端、接收端
网络·笔记·python·网络协议·学习·udp
tianyukun022339 分钟前
MATLAB学习笔记(二) 控制工程会用到的
笔记·学习·matlab
ahauedu1 小时前
CentOS 环境下 MySQL 数据库全部备份的操作指南
数据库·mysql·centos
張萠飛1 小时前
Redis如何判断哨兵模式下节点之间数据是否一致
数据库·redis·缓存
RaLi和夕2 小时前
单片机学习笔记8.定时器
汇编·笔记·单片机·嵌入式硬件·学习
北漂老男孩2 小时前
MySQL、Oracle 和 PostgreSQL 是三种主流的关系型数据库的主要原理性差异分析
数据库·mysql·postgresql·oracle
知识中的海王2 小时前
猿人学题库第七题——请求规律检测——采坑式学习
学习
GalaxyPokemon3 小时前
MySQL基础 [六] - 内置函数+复合查询+表的内连和外连
linux·运维·数据库·mysql·ubuntu
Linux运维老纪4 小时前
Linux 命令清单(Linux Command List)
linux·运维·服务器·数据库·mysql·云计算·运维开发
可观测性用观测云4 小时前
阿里巴巴 Druid 可观测性最佳实践
数据库