文章目录
- CQL 简介
- 命令/条款
- 函数
- 数据类型
- 结构类型
- 复合结构
- 其他
- 变量命名
- 命名空间与作用域
- 操作符
- 转义字符
- 保留关键字
- 注释
- 分支判断CASE
- 语法规范
- 命令
- 函数
CQL 简介
CQL 代表 Cypher 查询语言。 像 Oracle 数据库具有查询语言 SQL,Neo4j 具有 CQL 作为查询语言。
Neo4j CQL
- 它是 Neo4j 图形数据库的查询语言。
- 它是一种声明性模式匹配语言
- 它遵循 SQL 语法。
- 它的语法是非常简单且人性化、可读的格式。
如 Oracle SQL - Neo4j CQL 已命令来执行数据库操作。
- Neo4j CQL 支持多个子句像在哪里,顺序等,以非常简单的方式编写非常复杂的查询。
- NNeo4j CQL 支持一些功能,如字符串,Aggregation.In 加入他们,它还支持一些关系功能。
命令/条款
常用的 Neo4j CQL 命令/条款如下:
| S.No. | CQL命令/条 | 用法 |
|---|---|---|
| 1。 | CREATE 创建 | 创建节点,关系和属性 |
| 2。 | MATCH 匹配 | 检索有关节点,关系和属性数据 |
| 3。 | RETURN 返回 | 返回查询结果 |
| 4。 | WHERE 哪里 | 提供条件过滤检索数据 |
| 5。 | DELETE 删除 | 删除节点和关系 |
| 6。 | REMOVE 移除 | 删除节点和关系的属性 |
| 7。 | ORDER BY 以…排序 | 排序检索数据 |
| 8。 | SET 组 | 添加或更新标签 |
- 命令使用对大小写不敏感;
- 命令原称为 Clauses,直译为子句/从句/条款,介于 Clauses 下会有其子一级语句,若称 Clauses 为子句,则子一级语句会被称为子子句,故将 Clauses 译为命令,其子一级语句称子句;
函数
以下是常用的 Neo4j CQL 函数:
| S.No. | 定制列表功能 | 用法 |
|---|---|---|
| 1。 | String 字符串 | 它们用于使用 String 字面量。 |
| 2。 | Aggregation 聚合 | 它们用于对 CQL 查询结果执行一些聚合操作。 |
| 3。 | Relationship 关系 | 他们用于获取关系的细节,如startnode,endnode等。 |
数据类型
这些数据类型与 Java 语言类似。 它们用于定义节点或关系的属性
Neo4j CQL支持以下数据类型:
| S.No. | CQL数据类型 | 用法 |
|---|---|---|
| 1. | boolean | 用于表示布尔文字:true,false。 |
| 2. | byte | 用于表示 8 位整数。 |
| 3. | short | 用于表示 16 位整数。 |
| 4. | int | 用于表示 32 位整数。 |
| 5. | long | 用于表示 64 位整数。 |
| 6. | float | 用于表示 32 位浮点数。 |
| 7. | double | 用于表示 64 位浮点数。 |
| 8. | char | 用于表示 16 位字符。 |
| 9. | String | 用于表示字符串。 |
- neo4j 中String 支持 Unicode 第零平面中的字符;
- neo4j 中String 类型对不在第零平面的 Unicode 字符不完全能支持,存在不确定的问题,如 emoji 等;
- neo4j 不自带内置的数据类型判断函数,需要使用 APOC 拓展包
结构类型
| 类型 | 含义 |
|---|---|
| Node | 节点 |
| Relationship | 关系 |
| Path | 链路 区别于文件保存的路径,此处称链路 指的是节点与连接节点的关系所共同组成的概念) |
复合结构
| 类 | 含义 |
|---|---|
| List | 列表,序列,数组 |
| Map | 键值对 |
其他
之外,neo4j 支持时间点、时间段和坐标数据类型并提供它们的运算和函数
变量命名
- 命名应以字母开头,包括非英语字母;
- 命名不能以数字开头;
- 命名不能以符号开头;
- 命名长度最高支持 65535(2^16 - 1)或 65534,取决于 neo4j 的版本;
- 命名对大小写敏感;
- 命名中的空格会被自动忽略;
命名空间与作用域
- 同一查询语句中,节点标签、关系类型、属性名可以重复使用同一名称,如:
CREATE (a:a {a:'a'})-[r:a]->(b:a {a: 'a'})
- 统一查询语句中,节点名、关系名不能使用同一名称,如:
CREATE (a)-[a]->(b)
- 同一作用域内,同一名称在同一命名空间内,可重复使用,如:
MATCH(s1:student)
MATCH(s2:student) WHERE s2.name<>s1.name
CREATE(s1)-[:classmates]->(s2)
操作符
| 操作符类型 | 操作符 |
|---|---|
| 聚集操作 | DISTINCT |
| 成员变量操作 | . :用于访问静态成员变量 [] :用于访问动态成员变量 = :用于整体成员变量修改,未指定的成员变量会被清空为 null += :用于改变指定的成员变量 |
| 数学运算符 | +,-,*,/,%,^ |
| 比较运算符 | =,<>,<,>,<=,>=,IS NULL,NOT,NULL |
| 字符串匹配符 | STARTS WITH,ENDS WITH,CONTAINS |
| 布尔运算 | AND,OR,XOR,NOT |
| 字符串运算 | + :关联字符串 =~ :正则匹配 |
| 时间运算 | +和- :用于时间之间加减 *和/ :用于时间和数量之间 |
| 键值对操作 | . :用于访问值 [] :用于访问动态值 |
| 列表操作 | + :关联 IN :查找列表中是否存在该元素 [] :动态地访问元素 |
- 动态访问
CREATE
(a:Restaurant {name: 'Hungry Jo', rating_hygiene: 10, rating_food: 7}),
(b:Restaurant {name: 'Buttercup Tea Rooms', rating_hygiene: 5, rating_food: 6}),
(c1:Category {name: 'hygiene'}),
(c2:Category {name: 'food'})
WITH a, b, c1, c2
MATCH (restaurant:Restaurant), (category:Category)
WHERE restaurant["rating_" + category.name] > 6
RETURN DISTINCT restaurant.name
- 聚合
CREATE
(a:Person {name: 'Anne', eyeColor: 'blue'}),
(b:Person {name: 'Bill', eyeColor: 'brown'}),
(c:Person {name: 'Carol', eyeColor: 'blue'})
WITH [a, b, c] AS ps
UNWIND ps AS p
RETURN DISTINCT p.eyeColor
仅返回 blue 和 brown
- 整体成员变量修改
CREATE (a:Person {name: 'Jane', age: 20})
WITH a
MATCH (p:Person {name: 'Jane'})
SET p = {name: 'Ellen', livesIn: 'London'}
RETURN p.name, p.age, p.livesIn
age会变为null
- 修改指定的成员变量
CREATE (a:Person {name: 'Jane', age: 20})
WITH a
MATCH (p:Person {name: 'Jane'})
SET p += {name: 'Ellen', livesIn: 'London'}
RETURN p.name, p.age, p.livesIn
- 比较运算
- 和 null 进行比较,结果只会是 null;
- 不同类型数据比较会得到 false;
- 比较两侧中可以是带计算的表达式;
- 时间点比较需要考虑时区;
- 时间段无法比较,比较结果只会是 null;
- 可以在一行中连续比较,完全正确则返回 true
RETURN 1 = 1 - 0 < 2 < 3
result is true
- 布尔比较
| a | b | a AND b | a OR b | a XOR b | NOT a |
|---|---|---|---|---|---|
| false | false | false | false | false | true |
| false | null | false | null | null | true |
| false | true | false | true | true | true |
| true | false | false | true | true | false |
| true | null | null | true | null | false |
| true | true | true | true | false | false |
| null | false | false | null | null | null |
| null | null | null | null | null | null |
| null | true | null | true | null | null |
转义字符
| 转义字符 | 对应字符 |
|---|---|
| \t | Tab制表符 |
| \b | Backspace退格 |
| \n | Newline换行 |
| \r | Carriage return回车 |
| \f | Form feed换页 |
| ’ | ‘ |
| " | " |
| |\ Backslash反斜线 | |
| \uxxxx | UTF-16 |
| \Uxxxxxxxx | UTF-32 |
保留关键字
- Clauses 命令
- CALL
- CREATE
- DELETE
- DETACH
- EXISTS
- FOREACH
- LOAD
- MATCH
- MERGE
- OPTIONAL
- REMOVE
- RETURN
- SET
- START
- UNION
- UNWIND
- WITH
- Subclauses 子句
- LIMIT
- ORDER
- SKIP
- WHERE
- YIELD
- Modifiers 修饰符
- ASC
- ASCENDING
- ASSERT
- BY
- CSV
- DESC
- DESCENDING
- ON
- Expressions 表达式
- ALL
- CASE
- ELSE
- END
- THEN
- WHEN
- Operators 操作符
- AND
- AS
- CONTAINS
- DISTINCT
- ENDS
- IN
- IS
- NOT
- OR
- STARTS
- XOR
- Schema
- CONSTRAINT
- CREATE
- DROP
- EXISTS
- INDEX
- NODE
- KEY
- UNIQUE
- Hints
- INDEX
- JOIN
- PERIODIC
- COMMIT
- SCAN
- USING
- Literals文字值
- false
- null
- true
- Reserved for future use 保留
- ADD
- DO
- FOR
- MANDATORY
- OF
- REQUIRE
- SCALAR
注释
cypher使用 “”//" 作为注释开头
MATCH (n) RETURN n //这是行末注释
MATCH (n)
//这是一行注释
RETURN n
分支判断CASE
CASE 本身应属于子句的一种,但提供了流程控制的功能,故记在语法一节中
语法
CASE test
WHEN value THEN result
[WHEN ...]
[ELSE default]
END
例
- 单个判断
MATCH (n)
RETURN
CASE n.eyes
WHEN 'blue' THEN 1
WHEN 'brown' THEN 2
ELSE 3
END AS result
- 与其他查询结果共同组成一个结果行
MATCH (n)
RETURN n.name,
CASE
WHEN n.age IS NULL THEN -1
ELSE n.age - 10
END AS age_10_years_ago
语法规范
变量命名
- 节点标签使用大驼峰:VehicleOwner;
- 关系类型使用大写+下划线:OWNS_VEHICLE;
cypher查询语句文件
使用拓展名 .cypher
指代
- 指代节点标签或关系类型时,应带上":",如: :Label, :REL_TYPE;
- 指代函数时,函数名使用小驼峰;
缩进与换行
- 每个子句新起一行;
- ON GREATE 与 ON MATCH 应缩进两格;
- ON GREAT 应写在 ON MATCH 之前;
MERGE (n)
ON CREATE SET n.prop = 0
MERGE (a:A)-[:T]-(b:B)
ON CREATE SET a.name = 'me'
ON MATCH SET b.name = 'you'
RETURN a.prop
- 子查询段由{}括起,子查询内容空缩进两格,"}"应单独一行;
MATCH (a:A)
WHERE EXISTS {
MATCH (a)-->(b:B)
WHERE b.prop = $param
}
RETURN a.foo
- 简单的子查询段不应换行;
MATCH (a:A)
WHERE EXISTS { (a)-->(b:B) }
RETURN a.prop
大小写
- 关键字应大写;
- null 值应小写;
- Boolean 类型的值"true"、"false"应小写;
- 对于函数名、属性名、变量名、参数名应使用小驼峰;
空格
WITH {key1: 'value', key2: 42} AS map
RETURN map
- 对于 Map
- "{"与第一个键之间不应有空格;
- 键与":"之间不应有空格;
- ":"与值之间应有一个空格;
- 值与","间不应有空格;
- ","与下一个键之间应有一个空格;
- 最后一个值与"}"间不应有空格;
MATCH (p:Person {property: -1})-[:KNOWS {since: 2016}]->()
RETURN p.name
- 节点标签与关系类型与属性间应有一个空格
MATCH (:Person)-->(:Vehicle)
RETURN count(*)
- 一个模式内不应有空格
- 操作符两侧应有空格;
MATCH (person:Person:Owner)
RETURN person.name
- 标签指定间不应有空格;
- List中的元素与前一个","间应有一个空格;
- 函数参数与"(“,”)"间不应有空格;
- 简单子查询段与"{“,”}"间应有一个空格;
模式
patterns
- 模式需要换行时,应在箭头后换行;
MATCH (:Person)-->(vehicle:Car)-->(:Company)<--
(:Country)
RETURN count(vehicle)
- 模式中指代的节点或标签接下来不会被使用时应匿名指代;
CREATE (a:End {prop: 42}),
(:End {prop: 3}),
(:Begin {prop: id(a)})
- 尽可能将模式复合,避免出现重复结果;
- 有代称指代的节点应在匿名指代的节点前;
MATCH (manufacturer:Company)<--(vehicle:Car)<--(:Person)
WHERE manufacturer.foundedYear < 2000
RETURN vehicle.mileage
- 将接下来要是用的重要节点放在最前;
MATCH (:Person)-->(vehicle:Car)-->(:Company)<--(:Country)
RETURN vehicle.mileage
- 尽量将右向模式写在前;
单个符号使用
- 用单引号引起单个单词,用双引号引起句子;
- 当句子本身出现引号时,使用出现少的那个引起句子,出现次数相同时,使用单引号;
- 避免使用反引号"`"引起字符、单词或关键字;
- 句末不适用分号";";
命令
删除节点
只删除节点
MATCH (n:Test{name: 'test1'}) DELETE (n)
运行上述语句会报错:Cannot delete node<10000>, because it still has relationships. To delete this node, you must first delete its relationships.,该语句只删除 name 为 test1 的节点,但该节点因为有关系与之相连,故删除节点报错。
删除节点及其子图
MATCH (n:Test{name: 'test1'}) DETACH DELETE (n)
运行上述语句,执行成功,会删除 name 为 test1 的节点及其子图,也就是该节点与其他节点相连的边也会删除
删除全部节点
MATCH (n) DETACH DELETE (n)
该语句会删除整个图谱,即所有的节点和关系,应当慎用,另外,当图谱规模很大时,运行该语句容易报错(OOM,Out Of Memeory)。
ID 属性
在 Neo4j 中,“Id” 是节点和关系的默认内部属性。 这意味着,当我们创建一个新的节点或关系时,Neo4j 数据库服务器将为内部使用分配一个数字。 它会自动递增。
例:
新增一个节点
CREATE (tweet:Tweet{ message:"Hello"})
查看该节点
MATCH (n:Tweet) RETURN n
![[1]](https://i-blog.csdnimg.cn/img_convert/77eaaece07b926440dadf4acf9814a4e.png)
Caption 标题
所谓的 Caption 标题,就是更改 Neo4j 浏览器的节点显示的文字(圆圈内部)。比如
![[2]](https://i-blog.csdnimg.cn/img_convert/1c918bcbb4cd51ed0f57e1a7fb375cf9.png)
CREATE 创建
Neo4j CQL 创建一个没有属性的节点
CREATE (<node-name>:<label-name>)
语法说明
规范说法是节点
CQL查询语言详解

最低0.47元/天 解锁文章
411

被折叠的 条评论
为什么被折叠?



