目录
一.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. | 语法元素 | 描述 |
---|---|---|
1 | WHERE | 它是一个Neo4j CQL关键字。 |
2 | <property-name> <属性名称> | 它是节点或关系的属性名称。 |
3 | <comparison-operator> <比较运算符> | 它是Neo4j CQL比较运算符之一。请参考下一节查看Neo4j CQL中可用的比较运算符。 |
4 | <value> <值> | 它是一个字面值,如数字文字,字符串文字等。 |
Neo4j CQL中的布尔运算符
Neo4j支持以下布尔运算符在Neo4j CQL WHERE子句中使用以支持多个条件。
S.No. | 布尔运算符 | 描述 |
---|---|---|
1 | AND | 它是一个支持AND操作的Neo4j CQL关键字。 |
2 | OR | 它是一个Neo4j CQL关键字来支持OR操作。 |
3 | NOT | 它是一个Neo4j CQL关键字支持NOT操作。 |
4 | XOR | 它是一个支持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 |
返回结果去掉重名。
后面命令下面文档中介绍
文档出自:庞国明 老师课程教学