1. CQL简介
CQL
代表 Cypher
查询语言。 像关系型数据库具有查询语言 SQL
,Neo4j
使用 CQL
作为查询语言。
Neo4j CQL
- 它是
Neo4j
图形数据库的查询语言。 - 它是一种声明性模式匹配语言。
- 它遵循
SQL
语法。 - 它的语法是非常简单且人性化、可读的格式。
常用的 Neo4j CQL
命令/条款如下:
序号 | CQL命令/条 | 作用 |
---|---|---|
1 | CREATE 创建 | 创建节点,关系和属性 |
2 | MATCH 匹配 | 检索有关节点,关系和属性数据 |
3 | RETURN 返回 | 返回查询结果 |
4 | WHERE 条件 | 提供条件过滤检索MATCH数据 |
5 | DELETE 删除 | 删除节点和关系 |
6 | REMOVE 移除 | 删除节点和关系的属性 |
7 | SET 设置 | 添加或更新标签 |
8 | ORDER BY 排序 | 对结果排序 |
9 | SKIP LIMIT 分页 | 分页 |
10 | DISTINCT 排重 | 排重 |
基于庆余年电视剧人物关系图片,完成上面的语法:
2. CREATE
CREATE (
<node-name>:<label-name>
[{
<property1-name>:<property1-Value>
........
<propertyn-name>:<propertyn-Value>
}]
)
注: [ ]
中的内容为可选
语法说明:
语法元素 | 描述 |
---|---|
< node-name> | 它是我们将要创建的节点名称。 |
< label-name> | 它是一个节点标签名称。 |
< property1-name>…< propertynname> | 属性是键值对。 定义将分配给创建节点的属性的名称 |
< property1-value>…< propertynvalue> | 属性是键值对。 定义将分配给创建节点的属性的值 |
举例:
CREATE (person:Person)
CREATE (person:Person {cid:1,name:"范 闲",age:24,gender:0,character:"A",money:1000});
CREATE (person:Person {cid:2,name:"林婉 儿",age:20,gender:1,character:"B",money:800});
CREATE (person:Person {cid:3,name:"庆 帝",age:49,gender:0,character:"A",money:8900});
3. MATCH RETURN 命令语法
MATCH
(
<node-name>:<label-name>
)
RETURN
<node-name>.<property1-name>,
...
<node-name>.<propertyn-name>
语法元素 | 描述 |
---|---|
< node-name> | 它是我们将要创建的节点名称。 |
< label-name> | 它是一个节点标签名称。 |
< property1-name>…< propertynname> | 属性是键值对。 定义将分配给创建节点的属性的名称 |
举例:
MATCH (person:Person) return person
MATCH (person:Person) return ID(person),person.name,person.age
4. 关系创建
4.1 使用现有节点创建没有属性的关系
MATCH
(<node1-name>:<node1-label-name>),
(<node2-name>:<node2-label-name>)
CREATE
(
<node1-name>)-[<relationship-name>:<relationship-label-name>]->(<node2- name>
)
RETURN 相应的内容
语法说明:
序号 | 语法元素 | 描述 |
---|---|---|
1 | MATCH,CREATE,RETURN | 他们是Neo4J CQL关键字。 |
2 | < noode1-name> | 它用于创建关系的“From Node”的名称。 |
3 | < node1-label-name> | 它用于创建关系的“From Node”的标签名称。 |
4 | < node2-name> | 它用于创建关系的“To Node”的名称。 |
5 | < node2-label-name> | 它用于创建关系的“To Node”的标签名称。 |
6 | < relationship-name> | 这是一个关系的名称。 |
7 | < relationship-label-name> | 它是一个关系的标签名称。 |
创建关系
match(person1:person{name:"范闲"}),(person2:person{name:"林婉儿"}) create (person1) - [r:Couple] -> (person2)
查询关系
match p=(person1:person{name:"范闲"}) - [r:Couple] -> (person2:person) return p
match(p1:person{name:"范闲"}) - [r:Couple] -> (p2:person) return p1,p2
match(p1:person{name:"范闲"}) - [r:Couple] -> (p2:person) return r
4.2 使用现有节点创建有属性的关系
MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
CREATE
(<node1-label-name>)-[<relationship-label-name>:<relationship-name>
{<define-properties-list>}]->(<node2-label-name>)
RETURN <relationship-label-name>
其中 <define-properties-list> 是分配给新创建关系的属性(名称 - 值对)的列表。
{
<property1-name>:<property1-value>,
<property2-name>:<property2-value>,
...
<propertyn-name>:<propertyn-value>
}
match(person1:person{name:"范闲"}),(person2:person{name:"林婉儿"})
create (person1) - [r:Couple{mary_date:"12/12/2020",money:55000}] -> (person2)
return r
4.3 使用新节点创建没有属性的关系
CREATE
(<node1-label-name>:<node1-name>)
-[<relationship-label-name>:<relationship-name>]
-> (<node1-label-name>:<node1-name>)
create
(person1:person{cid:4,name:"长公主",age:49,gender:1,character:"A",money:5000})
- [r:Friend]
-> (person2:person{cid:5,name:"九品射手燕小乙",age:48,gender:0,character:"B",money:1000})
4.4 使用新节点创建有属性的关系
CREATE
(<node1-label-name>:<node1-name>{<define-properties-list>})
-[<relationship-label-name>:<relationship-name>{<define-properties-list>}]
->(<node1-label-name>:<node1-name>{<define-properties-list>})
create
(p1:person{cid:6,name:"靖王世子",age:23,gender:0,character:"A",money:3000})
- [r:Friend{date:"2021-07-09"}]
-> (p2:person{cid:7,name:"二皇子",age:24,gender:0,character:"B",money:6000})
4.5 关系和节点的属性可以使用的类型
序号 | CQL数据类型 | 作用 |
---|---|---|
1 | boolean | 它用于表示布尔文字:true, false。 |
2 | byte | 它用来表示8位整数。 |
3 | short | 它用于表示16位整数。 |
4 | int | 它用于表示32位整数。 |
5 | long | 它用于表示64位整数。 |
6 | float | 浮点数用于表示32位浮点数。 |
7 | double | Double用于表示64位浮点数。 |
8 | char | Char用于表示16位字符。 |
9 | String | 字符串用于表示字符串。 |
5. CREATE 创建多个标签
CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)
如:
create(person:person:beauty:picture{cid:8,name:"小美女"})
6. WHERE 子句
简单的 WHERE 子句
WHERE <condition>
复杂的 WHERE 子句
WHERE <condition> <boolean-operator> <condition>
where
中的比较运算符和 mysql
的相同,如 =
!=
<>
>
<
等
序号 | 布尔运算符 | 描述 |
---|---|---|
1 | AND | 与 |
2 | OR | 或 |
3 | NOT | 非 |
match(person:person) where person.name = "范闲" OR person.money > 1000 return person
7. DELETE 子句和 REMOVE 子句
7.1 DELETE 子句
- 删除节点
- 删除节点及相关节点和关系
删除所有节点和关系
match(n) optional match(n) - [r] - () delete n,r
删除指定关系
match p=(:person{name:"范闲"}) - [r:Couple] -> (:person) delete r
7.2 REMOVE 子句
- 删除节点或关系的标签
- 删除节点或关系的属性
match(p:person{name:"小美女"}) remove p:beauty
match(p:person{name:"小美女"}) remove p.cid
8. SET 子句
- 向现有节点或关系添加新属性
- 更新属性值
match(p:person{name:"小美女"}) set p.cid=10
9. ORDER BY 子句
“ORDER BY”
子句,对 MATCH
查询返回的结果进行排序。
我们可以按升序或降序对行进行排序。
默认情况下,它按升序对行进行排序。 如果我们要按降序对它们进行排序,我们需要使用 DESC
子句。
match(p:person) return p.cid,p.name,p.money order by p.cid desc
10. SKIP 和 LIMIT
Neo4j CQL
已提供 “SKIP”
子句来过滤或限制查询返回的行数。 它修整了CQL
查询结果集顶部的结果。
Neo4j CQL
已提供 “LIMIT”
子句来过滤或限制查询返回的行数。 它修剪 CQL
查询结果集底部的结果。
match(p:person) return ID(p),p.name,p.money order by p.money desc skip 4 limit 2
11. DISTINCT 排重
这个函数的用法就像 SQL
中的 distinct
关键字,返回的是所有不同值。
match (p:person) return distinct(p.gender)
多字段去重
match (p:person) return distinct(p.gender),p.character