CQL(Cypher查询语言)

CQL查询语言详解

文章目录

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]

Caption 标题

所谓的 Caption 标题,就是更改 Neo4j 浏览器的节点显示的文字(圆圈内部)。比如
[2]

CREATE 创建

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

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

语法说明
规范说法是节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值