【Neo4j系列】Neo4j之CQL语句和函数介绍

本文将对Neo4j中的CQL语句和CQL函数进行详细介绍。

作者:后端小肥肠

目录

1. 前言

2. CQL语句

2.1. CQL简介

2.2. CREATE命令

2.3. MATCH命令

2.4. RETURN命令

2.5. MATCH和RETURN

2.6. CREATE+MATCH+RETURN命令

2.7. 关系基础

2.8. CREATE创建标签

2.9. WHERE子句

2.10. DELETE命令

2.11. REMOVE命令

2.12. SET子句

2.13. ORDER BY排序

2.14. UNION和UNION ALL

2.15. LIMIT和SKIP子句

2.16. MERGE

2.17. IN操作符

3. CQL函数

3.1. 字符串函数

3.2. AGGEGATION聚合

3.3. 关系函数

4.结语


1. 前言

CQL是Neo4j的查询语言,专为图数据库设计,使得对图形数据的操作变得简单而直观。本文我们将深入研究CQL的基本语法和一些强大的函数,为读者提供全面的了解,让大家能够更好地利用Neo4j构建和查询图数据库。

2. CQL语句

2.1. CQL简介

Neo4j的Cypher语言是为处理图形数据而构建的,CQL代表Cypher查询语言。像Oracle数据库具有查询 语言SQL,Neo4j具有CQL作为查询语言。CQL是Neo4j图形数据库的查询语言,是一种声明性模式匹配语言,遵循SQL语法,其语法是非常简单且人性化、可读的格式。

CQL命令用法
CREATE创建节点,关系和属性
MATCH检索有关节点,关系和属性数据
RETURN返回查询结果
WHERE提供条件过滤检索数据
DALETE删除节点和关系
REMOVE删除节点和关系的属性
ORDER BY排序检索数据
SET添加或更新标签

2.2. CREATE命令

CQL中的CREATE命令可以实现以下操作:

1. 创建没有属性的节点

2. 使用属性创建节点

3. 在没有属性的节点之间创建关系

4. 使用属性创建节点之间的关系

5. 为节点或关系创建单个或多个标签

语法格式:

CREATE (<node-name>:<label-name>)

语法说明 : 

语法元素描述
CREATE一个Neo4j CQL命令
<node-name>我们要创建的节点名称
<label-name>一个节点标签名称

注意事项 -

1. Neo4j数据库服务器使用此<node-name>将此节点详细信息存储在Database中作为Neo4j DBA或Developer,我们不能使用它来访问节点详细信息。

2. Neo4j数据库服务器创建一个<label-name>作为内部节点名称的别名。作为Neo4j DBA或Developer,我们应该使用此标签名称来访问节点详细信息。

2.3. MATCH命令

CQL中的MATCH命令可以实现以下操作:

1. 从数据库获取有关节点和属性的数据

2. 从数据库获取有关节点,关系和属性的数据

语法格式:

MATCH (<node-name>:<label-name>)

语法说明:

语法元素描述
<node-name>节点名称
<label-name>0标签名称

2.4. RETURN命令

CQL中的RETURN命令可以实现以下操作:

1. 检索节点的某些属性

2. 检索节点的所有属性

3. 检索节点和关联关系的某些属性

4. 检索节点和关联关系的所有属性

语法格式:

RETURN <node-name>.<property1-name>,........<node-name>.<propertyn-name>

语法说明:

语法元素描述
<node-name>节点名称
<propertyn-name>属性名称

2.5. MATCH和RETURN

CQL中我们不能单独使用MATCH或RETURN命令,因此我们应该合并这两个命令以从数据库检索数据:

1. 检索节点的某些属性

2. 检索节点的所有属性

3. 检索节点和关联关系的某些属性

4. 检索节点和关联关系的所有属性

语法格式:

MATCH Command
RETURN Command

语法说明:

语法元素描述
MATCH命令
RETURN命令

2.6. CREATE+MATCH+RETURN命令

现在演示一下CREATE+MATCH+RETURN命令组合用的场景:

1.创建一个标签为xfc的节点,name为小肥肠,age为18

2.查询小肥肠节点对应信息

2.7. 关系基础

Neo4j图数据库遵循属性图模型来存储和管理其数据。根据属性图模型,关系应该是定向的, 否则,Neo4j将抛出一个错误消息。基于方向性,Neo4j关系被分为两种主要类型。

  • 单向关系

  • 双向关系

在以下场景中,我们可以使用Neo4j CQL CREATE命令来创建两个节点之间的关系。 这些情况适用于Uni和双向关系。

  • 在两个现有节点之间创建无属性的关系

  • 在两个现有节点之间创建有属性的关系

  • 在两个新节点之间创建无属性的关系

  • 在两个新节点之间创建有属性的关系

  • 在具有WHERE子句的两个退出节点之间创建/不使用属性的关系

下图为在两个节点之间创建关系例子:

2.8. CREATE创建标签

CQL中CREATE命令可以用来进行一下操作:

1. 可以创建单个标签或者多个标签

2. 可以根据CREATE语句来创建标签之间的关系

语法格式:

CREATE (node1-name:lable1-name) - [relationship-name:relationship-lable-name]->(node2-name:lable2-name)

语法说明:

语法元素描述
CREATE创建命令
node1-namefrom节点名称
lable1-namefrom节点标签
node2-nameto节点名称
lable2-nameto节点标签
relationship-name关系名称
relationship-lable-name关系标签

2.9. WHERE子句

像SQL一样,Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询的结果。

语法格式:

WHERE <condition>

复杂语法格式:

WHERE <condition> <boolean-operator> <condition>

Neo4j支持以下布尔运算符在Neo4j CQL WHERE子句中使用以支持多个条件。

布尔运算符描述示例
ADN逻辑与操作符,用于组合两个或多个条件,只有当所有条件为真时,整个表达式才为真。MATCH (n:Person) WHERE n.age > 25 AND n.name = 'John' RETURN n;
OR逻辑或操作符,用于组合两个或多个条件,只要至少有一个条件为真,整个表达式就为真。MATCH (n:Person) WHERE n.age > 25 OR n.name = 'John' RETURN n;
NOT逻辑非操作符,用于取反一个条件的真假。MATCH (n:Person) WHERE NOT n.name = 'John' RETURN n;

Neo4j 支持以下的比较运算符,在 Neo4j CQL WHERE 子句中使用来支持条件。

比较运算符描述示例
=用于检查两个值是否相等。MATCH (n:Person) WHERE n.age = 25 RETURN n;
<>用于检查两个值是否不相等。MATCH (n:Person) WHERE n.name <> 'John' RETURN n;
<用于检查一个值是否小于另一个值。MATCH (n:Person) WHERE n.age < 30 RETURN n;
>用于检查一个值是否大于另一个值。

MATCH (n:Person) WHERE n.age > 25 RETURN n;

<=用于检查一个值是否小于或等于另一个值。MATCH (n:Person) WHERE n.age <= 30 RETURN n;
>=用于检查一个值是否大于或等于另一个值。MATCH (n:Person) WHERE n.age >= 25 RETURN n;
 

where子句也可以创建关系:

语法格式:

MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>) 
WHERE <condition>
CREATE (<node1-label-name>)-[<relationship-label-name>:<relationship-name>{<relationship-properties>}]->(<node2-label-name>)

语法说明:

上面的语句(语法格式)就是寻找两个已存在节点并在他两直接建立关系,我这里就不用表格拆开讲解了。

2.10. DELETE命令

CQL中DELETE命令可以用来进行以下操作:

1. 删除节点:

MATCH (n:Label)
WHERE n.property = 'value'
DELETE n;

这将删除所有符合条件的节点(不包含关系)。替换 "Label" 和 "property" 为你的节点标签和属性。 

2. 删除节点的特定关系:

MATCH (n:Label)-[r:RELATIONSHIP]->()
WHERE n.property = 'value'
DELETE r;

这将删除所有符合条件的节点的特定关系。

3. 删除节点及其关系:

MATCH (n:Label)
WHERE n.property = 'value'
DETACH DELETE n;

 这将删除节点及其关系。

2.11. REMOVE命令

CQL中,REMOVE命令用于删除图元素的属性和标签:

1. 移除节点(关系)的属性:

MATCH (n:Label)
WHERE n.property = 'value'
REMOVE n.property;

 筛选出 n.property = 'value'的节点,移除属性。

2. 移除节点(关系)的标签:

MATCH (n:Label)
REMOVE n:Label;

3. 同时移除节点(关系)的属性和标签:

MATCH (n:Label)
WHERE n.property = 'value'
REMOVE n.property, n:Label;

 筛选出 n.property = 'value'的节点,移除属性和标签。

2.12. SET子句

有时,我们需要向现有节点或关系添加新属性,要做到这一点,Neo4j CQL 提供了一个SET子句,可以进行以下操作:

1. 设置节点属性

MATCH (n:标签 {id: 1})
SET n.属性 = '新值'

这个查询会匹配具有标签 "标签" 和属性 "id" 值为 1 的节点,并将它的 "属性" 属性设置为 "新值"。 

2. 设置关系属性

MATCH (a:节点标签)-[r:关系标签]->(b:节点标签)
WHERE a.id = 1 AND b.id = 2
SET r.属性 = '新值'

这个查询会将从节点 a 到节点 b 的关系的 "属性" 设置为 "新值"。 

3. 添加新属性或更新多个属性

MATCH (n:标签 {id: 1})
SET n.属性1 = '新值1', n.属性2 = '新值2'

2.13. ORDER BY排序

CQL在MATCH命令中提供了“ORDER BY”子句,对MATCH查询返回的结果进行排序。我们可以按升序或降序对行进行排序。默认情况下,它按升序对行进行排序。 如果我们要按降序对它们进行排序,我们需要使用DESC子句。以下是一些示例用法:

1. 按节点属性升序排序:

MATCH (n:Label)
RETURN n.property
ORDER BY n.property

这将按节点的 "property" 属性的升序顺序返回结果。 

2. 按节点属性降序排序:

MATCH (n:Label)
RETURN n.property
ORDER BY n.property DESC

 这将按节点的 "property" 属性的降序顺序返回结果。

2.14. UNION和UNION ALL

与SQL一样,Neo4j CQL有两个子句,将两个不同的结果合并成一组结果

  • UNION

  • UNION ALL

UNION子句:

它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。

限制:结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。

MATCH (cc:CreditCard)
RETURN cc.id as id,cc.number as number,cc.name as name,cc.valid_from as valid_from,cc.valid_to as valid_to
UNION
MATCH (dc:DebitCard)
RETURN dc.id as id,dc.number as number,dc.name as name,dc.valid_from as valid_from,dc.valid_to as valid_to

UNION ALL子句:

它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。

限制:结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的。

MATCH (cc:CreditCard)
RETURN cc.id as id,cc.number as number,cc.name as name,cc.valid_from as valid_from,cc.valid_to as valid_to
UNION ALL
MATCH (dc:DebitCard)
RETURN dc.id as id,dc.number as number,dc.name as name,dc.valid_from as valid_from,dc.valid_to as valid_to

2.15. LIMIT和SKIP子句

CQL中,LIMITSKIP 用于控制查询结果的数量和偏移。以下是它们的用法:

1. 使用 LIMIT 限制结果数量:

MATCH (n:Label)
RETURN n.property
LIMIT 10

这将返回满足条件的前 10 个节点的 "property" 属性。LIMIT 用于限制结果集的大小。 

2. 使用 SKIP 跳过指定数量的结果:

MATCH (n:Label)
RETURN n.property
SKIP 5

这将返回从满足条件的节点中跳过前 5 个节点的 "property" 属性。SKIP 用于指定结果集中要跳过的数量。 

3. 结合使用 LIMITSKIP 进行分页:

MATCH (n:Label)
RETURN n.property
SKIP 10
LIMIT 5

这将从满足条件的节点中跳过前 10 个,并返回接下来的 5 个节点的 "property" 属性。结合使用 SKIPLIMIT 可以实现分页效果

2.16. MERGE

CQL中,MERGE 用于根据指定的模式创建或匹配节点和关系。其作用是确保在图数据库中存在满足指定条件的节点和关系,如果不存在,则创建它们,如果已存在,则不做任何更改。以下是 MERGE 的一些用法示例:

1. 使用 MERGE 创建或匹配节点:

MERGE (n:Label {id: 1})
ON CREATE SET n.property = 'value'
RETURN n

这将创建一个具有标签 "Label" 和属性 "id" 值为 1 的节点,如果这样的节点已存在,则不会创建,并且如果节点是新创建的,将设置属性 "property" 为 'value'。 

2. 使用 MERGE 创建或匹配关系:

MATCH (a:Node), (b:Node)
WHERE a.id = 1 AND b.id = 2
MERGE (a)-[r:RELATIONSHIP]->(b)
ON CREATE SET r.property = 'value'
RETURN r

这将创建从节点 a 到节点 b 的关系 "RELATIONSHIP",如果这样的关系已存在,则不会创建,并且如果关系是新创建的,将设置属性 "property" 为 'value'。 

2.17. IN操作符

CQL中,IN 关键字用于筛选属性值是否在指定的值列表中。以下是 IN 的用法示例:

1. 使用 IN 进行单个属性的筛选:

MATCH (n:Label)
WHERE n.property IN ['value1', 'value2', 'value3']
RETURN n

这将返回具有标签 "Label" 并且属性 "property" 的值在 ['value1', 'value2', 'value3'] 中的节点。

 2. 使用 IN 结合其他条件进行复杂的筛选:

MATCH (n:Label)
WHERE n.type = 'Type1' AND n.status IN ['Active', 'Pending']
RETURN n

这将返回具有标签 "Label"、属性 "type" 为 'Type1' 且属性 "status" 在 ['Active', 'Pending'] 中的节点。 

3. CQL函数

3.1. 字符串函数

与SQL一样,Neo4J CQL提供了一组String函数,用于在CQL查询中获取所需的结果。 以下是一些常见的字符串函数及其用法示例:

  1. UPPERLOWER - 将字符串转为大写或小写:

    RETURN UPPER('hello') AS upper_result, LOWER('WORLD') AS lower_result

    这将返回字符串 "hello" 的大写形式和字符串 "WORLD" 的小写形式。

  2. SUBSTRING - 提取子字符串:

    RETURN SUBSTRING('Neo4j', 1, 3) AS substring_result

    这将返回从字符串 "Neo4j" 的位置 1 开始的长度为 3 的子字符串。

  3. LENGTH - 获取字符串长度:

    RETURN LENGTH('Graph Database') AS length_result

    这将返回字符串 "Graph Database" 的长度。

  4. TRIM - 去除字符串两端的空格:

    RETURN TRIM(' Hello ') AS trimmed_result

    这将返回去除了字符串两端空格的结果。

  5. CONCAT - 连接字符串:

    RETURN CONCAT('Hello', ' ', 'World') AS concatenated_result

    这将返回连接了三个字符串的结果。

3.2. AGGEGATION聚合

和SQL一样,Neo4j CQL提供了一些在RETURN子句中使用的聚合函数。 它类似于SQL中的GROUP BY子句。我们可以使用MATCH命令中的RETURN +聚合函数来处理一组节点并返回一些聚合值。以下是一些常见的聚合函数及其用法示例:

  1. COUNT - 计算匹配结果的数量:

    MATCH (n:Label) RETURN COUNT(n) AS node_count

    这将返回满足条件的节点数量。

  2. SUM - 计算数值属性的总和:

    MATCH (n:Label) RETURN SUM(n.property) AS total_property_sum

    这将返回满足条件的节点属性 "property" 的总和。

  3. AVG - 计算数值属性的平均值:

    MATCH (n:Label) RETURN AVG(n.value) AS average_value

    这将返回满足条件的节点属性 "value" 的平均值。

  4. MINMAX - 计算数值属性的最小值和最大值:

    MATCH (n:Label) RETURN MIN(n.age) AS min_age, MAX(n.age) AS max_age

    这将返回满足条件的节点属性 "age" 的最小和最大值。

  5. COLLECT - 将结果集中的值收集为列表:

    MATCH (n:Label) RETURN COLLECT(n.name) AS names

    这将返回满足条件的节点属性 "name" 的值作为列表。

3.3. 关系函数

CQL中提供了一组关系函数,以在获取开始节点,结束节点等细节时知道关系的细节。以下是一些常见的关系函数及其用法示例:

  1. TYPE - 获取关系的类型:

    MATCH (a)-[r]->(b) RETURN TYPE(r) AS relationship_type

    这将返回关系的类型,例如 "relationship_type" 可能是关系的标签。

  2. STARTNODEENDNODE - 获取关系的起始节点和结束节点:

    MATCH (a)-[r]->(b) RETURN STARTNODE(r) AS start_node, ENDNODE(r) AS end_node

    这将返回关系的起始节点和结束节点。

  3. NODES - 获取关系路径上的所有节点:

    MATCH path = (a)-[*]->(b) RETURN NODES(path) AS all_nodes

    这将返回关系路径上的所有节点的列表。

  4. LENGTH - 获取关系路径的长度(即节点之间的关系数量):

    MATCH path = (a)-[*]->(b) RETURN LENGTH(path) AS path_length

    这将返回关系路径的长度。

  5. RELATIONSHIPS - 获取关系路径上的所有关系:

    MATCH path = (a)-[*]->(b) RETURN RELATIONSHIPS(path) AS all_relationships

    这将返回关系路径上的所有关系的列表。

4.结语

        本文对Neo4j中的CQL语句和CQL函数进行了概念介绍和用例罗列,下一篇Neo4j系列文章将向大家展示我自己日常项目中积累的Neo4j中的工具类(结合Spring Boot),以及具体使用场景,喜欢这一系列内容的同学动动小手点点关注吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/522002.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++的内存管理与初阶模板

引言 我们在学习C的时候&#xff0c;会经常在堆上申请空间&#xff0c;所以这个时候就体现了内存管理遍历。 图下是我们常见的计算机的内存划分&#xff1a; 我也在图下对部分变量存在的位置&#xff0c;及时标注。(如果有任何问题可以联系博主修改&#xff0c;感谢大家。) 那…

VSCode搭建ARM开发环境

为了构建Cortex M系列单片机免费开源的开发环境&#xff0c;网络上了解来看VSCODEGCCJLINK是一套比较高效的组合方式&#xff0c;下面记录环境搭建的流程。 我这边的PC环境为 WIN7专业版64bit。 需要用到的工具 Visual Studio CodeSTM32CubemxARM GCC 交叉编译工具链&#x…

容器安全是什么?

容器安全定义 容器安全是指保护容器的完整性。这包括从其保管的应用到其所依赖的基础架构等全部内容。容器安全需要完整且持续。通常而言&#xff0c;企业拥有持续的容器安全涵盖两方面&#xff1a; 保护容器流水线和应用保护容器部署环境和基础架构 如何将安全内置于容器流…

C/C++游戏逆向

初级 %p、size_t、%zd、%llu、sizeof %p用于输出地址&#xff0c;HWND类型的也可以使用%p输出size_t&#xff1a;C语言源代码&#xff1a;typedef unsigned __int64 size_t;sizeof 返回值是 size_t类型&#xff0c;打印的时候不能使用%d&#xff0c;应该使用%zu 修改窗口标题…

API可视化编排,提高API可复用率

在数字化时代&#xff0c;API&#xff08;应用程序编程接口&#xff09;已成为不同软件应用之间沟通的桥梁。然而&#xff0c;如何高效管理、编排和复用这些API&#xff0c;成为了企业和开发者面临的重要挑战。随着技术的不断进步&#xff0c;RestCloud API可视化编排应运而生&…

【YOLO v5 v7 v8 v9小目标改进】AFPN 渐进式特征金字塔网络:解决多尺度特征融合中,信息在传递过程丢失

AFPN 渐进式特征金字塔网络&#xff1a;解决多尺度特征融合中&#xff0c;信息在传递过程丢失 提出背景AFPN 多尺度特征金字塔 非邻近层次的直接特征融合 自适应空间融合操作 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改YOLO v9 魔改 提出背景 论文&#xff1a;https:…

吴恩达deeplearning.ai:数据增强数据合成迁移学习

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 让我们看看为你的程序添加数据的技巧。在构建神经网络的时候&#xff0c;我们总是想要更多的数据&#xff0c;但是获取更多的数据往往是十分昂贵又缓慢的。相反地&#xff0c;添加数据的另一…

现在做抖店还能行吗?给2024年想入局抖店的新手,一些建议

我是王路飞。 说起来抖店好像也不算是个新项目了&#xff0c;毕竟抖音小店正式上线时间是在2019年&#xff0c;到现在也有5年多时间了。 我这边是从20年开始入局抖店的&#xff0c;比较庆幸的是赶上了当初的流量风口&#xff0c;且一直坚持到了现在。 由刚开始的单人单店&am…

手写分布式配置中心(六)整合springboot(自动刷新)

对于springboot配置自动刷新&#xff0c;原理也很简单&#xff0c;就是在启动过程中用一个BeanPostProcessor去收集需要自动刷新的字段&#xff0c;然后在springboot启动后开启轮询任务即可。 不过需要对之前的代码再次做修改&#xff0c;因为springboot的配置注入value("…

Unity 给刚体一个力或速度

创建平面和小球&#xff0c;给力或给速度让其弹起 给小球挂载刚体&#xff08;Rigibdody&#xff09;和脚本 &#xff08;力是累计或者衰减的&#xff0c;直接给速度就是赋值&#xff0c;但如果速度就和力类似了&#xff09; using System.Collections; using System.Collect…

数据库(mysql)-新手笔记(主外键,视图)

主外键 主键(唯一性,非空性) 主键是数据库表中的一个或多个字段&#xff0c;其值唯一标识表中的每一行/记录。 唯一性: 主键字段中的每个值都必须是唯一的&#xff0c;不能有两个或更多的记录具有相同的主键值 非空性&#xff1a;主键字段不能包含NULL值。 外键(引用完整 …

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Marquee)

跑马灯组件&#xff0c;用于滚动展示一段单行文本。仅当文本内容宽度超过跑马灯组件宽度时滚动&#xff0c;不超过时不滚动。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Ma…