neo4j学习总结--第三课 Cypher(CQL)命令一

本文详细介绍Neo4j图形数据库的Cypher查询语言(CQL),涵盖CQL的基本概念、常用命令如CREATE、MATCH、RETURN及WHERE子句的使用方法,包括节点和关系的创建、查询、属性过滤等高级技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

一.CQL简介

二.Neo4j CQL命令/条款

三、命令

3.1 、CREATE命令

3.1.1 创建节点

3.1.2 创建关系

3.1.3、创建一个完整路径

3.1.4、创建索引

3.2 MATCH 命令

3.2.1、查询节点

3.2.2 、查找关系

3.2.3  查询路径

3.2.4、单条最短路径

3.2.5 通过id查询节点或关系

四、OPTIONAL MATCH

五、WHERE子句

Neo4j CQL中的布尔运算符

Neo4j CQL中的比较运算符

5.1 、基本使用

5.1.1 布尔运算

5.1.2 、字符串匹配

5.1.3、正则表达式 =~ 'regexp'

5.1.4 在WHERE中使用路径模式

5.1.5 列表

六、RETURN返回

6.1、返回节点

6.2、返回关系

6.3、返回属性

6.4、返回所有元素

6.5、变量中的特殊字符

6.6、列别名

6.7、其他表达式

6.8 唯一性结果


一.CQL简介

CQL代表Cypher查询语言。 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言。

Neo4j CQL -

  • 它是Neo4j图形数据库的查询语言。
  • 它是一种声明性模式匹配语言
  • 它遵循SQL语法。
  • 它的语法是非常简单且人性化、可读的格式。

如Oracle SQL -

  • Neo4j CQL 已命令来执行数据库操作。
  • Neo4j CQL 支持多个子句像在哪里,顺序等,以非常简单的方式编写非常复杂的查询。
  • NNeo4j CQL 支持一些功能,如字符串,Aggregation.In 加入他们,它还支持一些关系功能。

二.Neo4j CQL命令/条款

常用的Neo4j CQL命令/条款如下:

S.No.

CQL命令/条

用法

1。

CREATE 创建

创建节点,关系和属性

2。

MATCH 匹配

检索有关节点,关系和属性数据

3。

RETURN 返回

返回查询结果

4。

WHERE 哪里

提供条件过滤检索数据

5。

DELETE 删除

删除节点和关系

6。

REMOVE 移除

删除节点和关系的属性

7。

ORDER BY以…排序

排序检索数据

8。

SET 组

添加或更新标签

三、命令

3.1 、CREATE命令

Neo4j使用CQL“CREATE”命令

  • 创建节点

  • 使用关系

  • 创建一个完整路径

  • 创建索引

3.1.1 创建节点

Neo4j CQL创建一个没有属性的节点

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

语法说明

规范说法是节点标签名称,其实相当于Mysql数据库中的表名,而是节点名称,其实代指创建的此行数据。

示例

CREATE (emp:Employee) return emp 或者 CREATE (:Employee)

Neo4j CQL创建具有属性的节点

Neo4j CQL“CREATE”命令用于创建带有属性的节点。 它创建一个具有一些属性(键值对)的节点来存储数据。

CREATE (<node-name>:<label-name>  {<key>:<Value>,...<n-key>:<n-Value>})

示例

CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" })

创建带有多个标签的节点

CREATE (n:Person:Swedish)

返回创建的节点

CREATE (a { name: 'Andres' }) RETURN a

3.1.2 创建关系

  注意:关系必须有箭头指向

创建两个节点之间的关系。

//先创建2个节点

CREATE (n:Person {name: 'Node A'}),(m:Person {name: 'Node B'})

//查询节点并为其创建关系

MATCH (a:Person),(b:Person)

WHERE a.name = 'Node A' AND b.name = 'Node B'

CREATE (a)-[r:RELTYPE]->(b)

RETURN r

创建关系并为关系设置属性

Match (a:Person {name:'Node A'}),(b:Person {name:'Node B'})

CREATE (a)-[r:RELTYPE { name: 'abc' }]->(b)

RETURN r

3.1.3、创建一个完整路径

当使用CREATE和模式时,模式中所有还不存在的部分都会被创建。

create p = (m:Andres {name:'南京'})-[r:SHUYU]->(jiangsu:Andres {name:'江苏省'})<-[s:SHUYU]-(andres:Andres {name:'徐州'}) return p

3.1.4、创建索引

CREATE INDEX ON :Person(name)

3.2 MATCH 命令

 MATCH命令用于 -

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

3.2.1、查询节点

查询所有节点

通过指定一个不带标签的节点的模式,图中的所有节点将返回。

MATCH (n)

RETURN n

        

返回数据库中的所有节点。

查询带有某个标签的所有节点

通过指定带有一个标签的节点的模式,可以获取满足该标签的所有节点。

查询

MATCH (movie:Movie)

RETURN movie.title

返回数据库中的所有电影。

查询关联节点

符号——意为相关的,这个关系不带有类型和方向。

MATCH ({ name: 'Lilly Wachowski' })--(movie)

RETURN movie.title

返回’Lilly Wachowski’相关的所有电影。

匹配标签

可以为查询的节点增加标签约束。如下

MATCH (:Person { name: 'Lilly Wachowski' })--(movie:Movie)

RETURN movie.title

返回与Person 'Oliver'相连的带有Movie标签的所有节点。

3.2.2 、查找关系

外向关系

关系的方向通过-->或者<--来表示。如:

MATCH (:Person { name: 'Lilly Wachowski' })-->(movie)

RETURN movie.title

返回与Person 'Lilly Wachowski'外向连接的所有节点,也就是Person 'Lilly Wachowski 所有指向的关系。

有向关系和变量

当需要过滤关系中的属性,或者返回关系的时候,变量就很有必要了。

MATCH (:Person { name: 'Lilly Wachowski' })-[r]->(movie)

RETURN type(r)

返回'Oliver'的外向关系的类型。

匹配关系类型

当已知要匹配关系的类型时,可通过冒号后面紧跟关系类型。

MATCH (wallstreet:Movie { title: 'The Matrix' })<-[:ACTED_IN]-(actor)

RETURN actor.name

返回'The Matrix'中的所有演员。

匹配多种关系类型

当需要匹配多种关系中的一种时,可以通过竖线|将多个关系连接在一起。

MATCH (wallstreet { title: 'The Matrix' })<-[:ACTED_IN|:DIRECTED]-(person)

RETURN person.name

返回与'The Matrix'节点关系为ACTED_IN或者DIRECTED的所有节点。

匹配关系类型和使用关系变量

如果想通过变量来引用关系和指定关系类型,可以将它们放在一起。如:

MATCH (wallstreet { title: 'The Matrix' })<-[r:ACTED_IN]-(actor)

RETURN r.role

返回'The Matrix'中所有演员的角色。

多个关系

关系可以多语句以 ()--()的形式来表达,或者它们相互连接在一起。如:

MATCH (tom { name: 'Tom Hanks' })-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director)

RETURN tom,movie, director

返回' Tom Hanks '演的电影和该电影的导演。

  

可变长关系

可变长关系和节点的语法如下:

-[:TYPE*minHops..maxHops]->

minHops和maxHops都是可选的,默认值分别为1和无穷大。当没有边界值的时候,点也可以省略。当只设置了一个边界的时候,如果点省略了就意味着是一个固定长度的模式。

MATCH (martin { name: 'Tom Hanks' })-[:ACTED_IN*1..3]-(movie:Movie)

RETURN movie.title

返回与' Tom Hanks '关系为1跳(hop)到3跳的所有电影。

变长关系的关系变量

当连接两个节点之间的长度是变长的,那么关系变量返回的将可能是一个关系列表。

MATCH (actor { name: 'Tom Hanks' })-[r:ACTED_IN*2]-(co_actor)

RETURN r

返回一个关系列表。

3.2.3  查询路径

查询路径

如果想返回或者需要对路径进行过滤,可以将路径赋值给一个变量。

MATCH p =(tom { name: 'Tom Hanks' })-->()

RETURN p

查询Tom Hanks 所指向的路径

最短路径

3.2.4、单条最短路径

通过使用shortestPath函数很容易找到两个节点之间的最短路径。如下所示:

MATCH  p =shortestPath((tom { name: 'Tom Hanks' })-[*..15]-( Steve {name:'Steve Zahn'}))

RETURN p

上面查询的含义为:找到两个节点之间的最短路径,路径最大长度为15。在搜索最短路径的时候,还可以使用关系类型、最大跳数和方向等约束条件。如果用到了WHERE语句,相关的断言会被包含到shortestPath中去。如果路径的关系元素中用到了none()或者all()断言,那么这些将用于在检索时提高性能。

3.2.5 通过id查询节点或关系

通过id查询节点

可以在断言中使用id()函数来根据id查询节点。

查询

MATCH (n)

WHERE id(n)= 0

RETURN n

节点id为0的节点将返回。

通过id查询关系

通过id查询关系与节点类似。但这在实践中不推荐这么做。如下:

查询

MATCH ()-[r]->()

WHERE id(r)= 0

RETURN r

关系id为0的节点将返回。

通过id查询多个节点

通过id查询多个节点的时候,可以将id放到IN语句中。

查询

MATCH (n)

WHERE id(n) IN [0, 3, 5]

RETURN n

这个查询返回了IN语句中列出的所有节点。

四、OPTIONAL MATCH

OPTINAL MATCH语句用于搜索模式中描述的匹配项,对于找不到的项用null代替。

关系

如果某个关系是可选的,可使用OPTINAL MATCH。这很类似SQL中outer join的工作方式。如果关系存在就返回,否则在相应的地方返回null。

MATCH (a:Movie { title: 'The Matrix' })

OPTIONAL MATCH (a)-->(x)

RETURN x

返回了null,因为这个节点没有外向关系。

可选元素的属性

如果可选的元素为null,那么该元素的属性也返回null。

MATCH (a:Movie { title: 'The Matrix' })

OPTIONAL MATCH (a)-->(x)

RETURN x, x.name

返回了x元素(查询中为null),它的name属性也为null。

可选关系类型

可在查询中指定可选的关系类型。

MATCH (a:Movie { title: 'The Matrix' })

OPTIONAL MATCH (a)<-[r: ACTED_IN]-()

RETURN r

五、WHERE子句

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

WHERE <property-name> <comparison-operator> <value>

语法说明:

S.No.语法元素描述
1WHERE它是一个Neo4j CQL关键字。
2<property-name>
<属性名称>
它是节点或关系的属性名称。
3<comparison-operator>
<比较运算符>
它是Neo4j CQL比较运算符之一。请参考下一节查看Neo4j CQL中可用的比较运算符。
4<value>
<值>
它是一个字面值,如数字文字,字符串文字等。

Neo4j CQL中的布尔运算符

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

S.No.布尔运算符描述
1AND它是一个支持AND操作的Neo4j CQL关键字。
2OR它是一个Neo4j CQL关键字来支持OR操作。
3NOT它是一个Neo4j CQL关键字支持NOT操作。 
4XOR它是一个支持XOR操作的Neo4j CQL关键字。 

Neo4j CQL中的比较运算符

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

S.No.布尔运算符描述
1.=它是Neo4j CQL“等于”运算符。
2.<>它是一个Neo4j CQL“不等于”运算符。
3.<它是一个Neo4j CQL“小于”运算符。
4.>它是一个Neo4j CQL“大于”运算符。
5.<=它是一个Neo4j CQL“小于或等于”运算符。
6.>=它是一个Neo4j CQL“大于或等于”运算符。

5.1 、基本使用

5.1.1 布尔运算

可以在WHERE中使用布尔运算符,如AND和OR,以及布尔函数NOT。

查找1990年到2000年发行的电影的名称

MATCH (nineties:Movie)

WHERE nineties.released > 1990 AND nineties.released < 2000

RETURN nineties.title

关系属性的过滤

要对关系的属性进行过滤,可在WHERE中添加如下关键词:

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

WHERE m.released > 1990

RETURN n

返回了参演过1990年后发布的电影的演员。

属性存在性检查

使用exists()只能检查节点或者关系的某个属性是否存在

MATCH (n)

WHERE exists(n.title)

RETURN n

返回了电影节点,因为只有他有title属性。

5.1.2 、字符串匹配

匹配字符串的开始 

STARTS WITH用于以大小写敏感的方式匹配字符串的开始。

MATCH (n)

WHERE n.name STARTS WITH 'Tom'

RETURN n

匹配字符串的结尾

ENDS WITH用于以大小写敏感的方式匹配字符串的结尾。

MATCH (n)

WHERE n.name ENDS WITH 'Hanks'

RETURN n

返回了姓名以'Hanks'结尾的人。

字符串包含

CONTAINS用于检查字符串中是否包含某个字符串,它是大小写敏感的,且不关心匹配部分在字符串中的位置。

MATCH (n)

WHERE n.name CONTAINS 'bin'

RETURN n

字符串反向匹配

使用NOT关键词可以返回不满足给定字符串匹配要求的结果。如:

MATCH (n)

WHERE NOT n.name ENDS WITH 's'

RETURN n

返回了姓名不以"s"结尾的人

5.1.3、正则表达式 =~ 'regexp'

Cypher支持正则表达式过滤。正则表达式的语法继承来自Java正则表达式。

正则表达式

可以使用=~ 'regexp'来进行正则表达式的匹配。如下:

MATCH (n)

WHERE n.name =~ 'Tom.*'

RETURN n

5.1.4 在WHERE中使用路径模式

模式过滤

MATCH (n { name:'Kevin Bacon'}),(m)

WHERE (n)-[:ACTED_IN]-(m)

RETURN n,m

返回了Kevin Bacon参演过的电影。

模式中的NOT过滤

NOT功能可用于排除某个模式。

MATCH (n { name:'Kevin Bacon'}),(m:Movie)

WHERE NOT (n)-[:ACTED_IN]-(m)

RETURN m

返回了Kevin Bacon没有参演过的电影。

模式中的属性过滤

可以在模式中添加属性来过滤结果。

MATCH (n)

WHERE (n)-[: ACTED_IN]-({ title: 'Apollo 13' })

RETURN n

返回参演Apollo 13电影的所有演员

关系类型过滤

    可以在MATCH模式中添加关系类型,但有时候希望在类型过滤上具有丰富的功能。这时,可以将类型与其他进行比较。例如,下面的例子将关系类型与一个正在表达式进行比较。

MATCH (n)-[r]->(m)

WHERE type(r)=~ 'DIRE.*'

RETURN n , m

返回所有导演。

5.1.5 列表

IN运算符

检查列表中是否存在某个元素,可以使用IN运算符。

MATCH (a)

WHERE a.name IN ['Keanu Reeves', 'Lana Wachowski','Hugo Weaving']

RETURN a

返回三个人的节点。

六、RETURN返回

Neo4j CQL RETURN子句用于返回

  • 检索节点的某些属性
  • 检索节点的所有属性
  • 检索节点和关联关系的某些属性
  • 检索节点和关联关系的所有属性

6.1、返回节点

返回匹配到的节点,如下所示:

MATCH (n { name: 'Steve Zahn' })

RETURN n

本例中返回包含name属性值为'Steve Zahn'的节点。

6.2、返回关系

返回匹配的关系,如下所示:

MATCH (n { name: 'Steve Zahn' })-[r:KNOWS]->(c)

RETURN r

本例中返回了关系。

6.3、返回属性

返回属性可以用点来引用属性。如下所示:

MATCH (n { name: 'Steve Zahn' })

RETURN n.name

本例中返回了name属性的值。

6.4、返回所有元素

当希望返回查询中找到的所有节点,关系和路径时,可以使用星号*表示。如下所示:

MATCH p =(a { name: 'Steve Zahn' })-[r]->(b)

RETURN *

本例中返回了所有节点、关系。

6.5、变量中的特殊字符

如果想使用空格等特殊字符,可以用反引号`将其括起来。如下所示:

MATCH (`This isn't a common variable`)

WHERE `This isn't a common variable`.name = 'Steve Zahn'

RETURN `This isn't a common variable`.happy

返回name属性值为'Steve Zahn'的节点。

6.6、列别名

如果希望列名不同于表达式中使用的名字,可以使用AS<new name>对其重命名。

MATCH (a { name: 'Steve Zahn' })

RETURN a.born AS bornYear

6.7、其他表达式

任何表达式都可以作为返回项。如字面值,断言,属性,函数和任何其他表达式。

MATCH (a { name: 'Steve Zahn' })

RETURN a.born > 1960, "I'm a literal",(a)-->()

本例中返回了断言,字符串和带模式表达参数的函数调用。

6.8 唯一性结果

DISTINCT用于仅仅 获取结果集中所依赖列的唯一行。

MATCH (a)

RETURN DISTINCT a.name

返回结果去掉重名。

后面命令下面文档中介绍

文档出自:庞国明 老师课程教学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值