哈啰,各位小伙伴们,这里是每天进步一点点的花栗鼠小K
之前写了一个《Neo4j
的入门之路》的文章,简单的介绍了下图数据库和Neo4j的基础知识。但是,我觉得,一个合格的程序员,对于知识的认知, 不应该止步于此(好吧,其实是我最近进入瓶颈期了)。所以今天,咱们接着Neo4j聊下去。
今天,先介绍一下 Neo4j
的基础语法
01
—
何为Neo4j CQL
CQL
即 Cypher Query Language
。像Oracle数据库具有查询语言 SQL
,Neo4j
具有 CQL
作为查询语言。
Neo4j CQL
它是 Neo4j
图形数据库的查询语言它是一种声明性模式匹配语言 它遵循 SQL
语法它的语法是非常简单且人性化、可读的格式
02
—
Neo4j CQL命令
CQL 命令/条 | 用法 |
---|---|
CREATE | 创建节点,关系和属性 |
MATCH | 检索有关节点,关系和属性数据 |
RETURN | 返回查询结果 |
WHERE | 提供条件过滤检索数据 |
DELETE | 删除节点和关系 |
REMOVE | 删除节点和关系的属性 |
ORDER BY | 排序检索数据 |
SET | 添加或更新标签 |
CQL
的指令大小写不敏感,CREATE
和cREAtE
效果相同,但是执行时间会有差别。
03
—
Neo4j SQL函数
常用的 Neo4j CQL
函数:
定制列表功能 | 用法 |
---|---|
String | 它们用于使用String自变量。 |
Aggregation | 它们用于对CQL查询结果执行一些聚合操作。 |
Relationship | 他们用于获取关系的细节,如startnode,endnode等。 |
04
—
Neo4j CQL数据类型
Neo4j CQL
支持以下数据类型:
CQL数据类型 | 用法 |
---|---|
boolean | 用于表示布尔数值:true,false。 |
byte | 用于表示8位整数。 |
short | 用于表示16位整数。 |
int | 用于表示32位整数。 |
long | 用于表示64位整数。 |
float | 用于表示32位浮点数。 |
double | 用于表示64位浮点数。 |
char | 用于表示16位字符。 |
String | 用于表示字符串。 |
05
—
Neo4j CQL命令详解
CREATE命令
Neo4j
使用 CQL CREATE
命令可以
创建没有属性的节点 使用属性创建节点 在没有属性的节点之间创建关系 使用属性创建节点之间的关系 为节点或属性创建单个或多个标签
这里我们先创建一个没有属性的节点。CREATE
命令用于创建没有属性的节点。它只是创建一个没有任何数据的节点
CREATE
命令语法
CREATE (<node-name>:<label-name>)
复制
语法说明
语法元素 | 描述 |
---|---|
CREATE | 它是一个Neo4j CQL命令。 |
它是我们要创建的节点名称。 | |
它是一个节点标签名称 |
注意:
Neo4j
数据库服务器使用此将此节点详细信息存储在 neostore.nodestore.db
中作为Neo4j DBA
或Developer
,我们不能使用它来访问节点详细信息
Neo4j
数据库服务器创建一个作为内部节点名称的别名,作为 Neo4j DBA
或Developer
,我们应该使用此标签名称来访问节点详细信息
neostore.nodestore.db
:用来存储节点的记录
neostore.relationshipstore.db
:用来存储关系的记录
neostore.propertystore.db
:存放属性的物理记录
Neo4j CQL
创建具有属性的节点。CREATE
命令用于创建带有属性的节点。它创建一个具有一些属性(键值对)的节点来存储数据。
CREATE命令语法:
CREATE (
<node-name>:<label-name>
{
<Property1-name>:<Property1-Value>
........
<Propertyn-name>:<Propertyn-Value>
}
)复制
语法说明:
语法元素 | 描述 |
---|---|
属性是键值对。定义将分配给创建节点的属性的名称 | |
属性是键值对。定义将分配给创建节点的属性的值 |
MATCH命令
Neo4j CQL MATCH
命令用于
从数据库获取有关节点和属性的数据 从数据库获取有关节点,关系和属性的数据
CREATE命令语法:
MATCH
(
<node-name>:<label-name>
)复制
语法说明
语法元素 | 描述 |
---|---|
这是我们要创建一个节点名称。 | |
这是一个节点的标签名称 |
注意:我们不能单独使用MATCH
Command从数据库检索数据。如果我们单独使用它,那么我们将遇到InvalidSyntax
错误。
RETURN命令
Neo4j CQL RETURN
子句用于
检索节点的某些或所有属性 检索节点和关联关系的某些或所有属性
RETURN
命令语法:
RETURN
<node-name>.<property1-name>,
........
<node-name>.<propertyn-name>复制
语法说明:
语法元素 | 描述 |
---|---|
它是我们将要创建的节点名称。 | |
属性是键值对。 |
我们不能单独使用 RETURN
子句
MATCH 和 RETURN
Neo4j
使用 CQL MATCH + RETURN
命令
检索节点的某些或所有属性 检索节点和关联关系的某些或所有属性
MATCH RETURN
命令语法:
MATCH Command
RETURN Command复制
一般的
MATCH
(
<node-name>:<label-name>
)
RETURN
<node-name>.<property1-name>,
...
<node-name>.<propertyn-name>复制
用来返回指定属性的数据。返回指定节点的所有数据,使用如下命令
MATCH
(
<node-name>:<label-name>
)
RETURN
<node-name>复制
关系基础
根据属性图模型,关系应该是定向的。否则,Neo4j
将抛出一个错误消息。
基于方向性,Neo4j
关系被分为两种主要类型
单向关系 双向关系
在以下场景中,我们可以使用 Neo4j CQL CREATE
命令来创建两个节点之间的关系。这些情况适用于双向关系。
在两个现有节点之间创建无/有属性的关系 在两个新节点之间创建无/有属性的关系 在具有WHERE子句的两个退出节点之间创建不使用属性的关系
比如对于 minister 和 monarch 之间的关系

从上图中,minister节点是“From Node”,monarch Node是“To Node”这种关系。
对于节点,它们是两种关系
外向关系 传入关系
从上图中,关系是到臣子节点的“外向关系”,并且相同的关系是到君主节点的“到达关系”
我们在“minister”和“monarch”节点之间创建了两个关系:一个从“minister”到“monarch”。另一个从“monarch”到“minister”。这是双向关系

现有节点创建没有属性的关系
语法:
MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
CREATE
(<node1-label-name>)-[<relationship-label-name>:<relationship-name>]->(<node2-label-name>)
RETURN <relationship-label-name>复制语法说明:
语法元素 描述 它用于创建关系的“From Node”的名称。 它用于创建关系的“From Node”的标签名称。 它用于创建关系的“To Node”的名称。 它用于创建关系的“To Node”的标签名称。 这是一个关系的名称。 它是一个关系的标签名称。 注意:
在此语法中,
RETURN
子句是可选的。如果我们想立即看到结果,那么使用它。否则,我们可以省略这个子句。现有节点创建有属性的关系
语法:
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>复制新节点创建无属性关系
语法:
CREATE
(<node1-label-name>:<node1-name>)-
[<relationship-label-name>:<relationship-name>]->
(<node1-label-name>:<node1-name>)
RETURN <relationship-label-name>复制新节点创建有属性关系
语法:
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>})
RETURN <relationship-label-name>复制检查关系节点的详细信息
语法:
MATCH
(<node1-label-name>)-[<relationship-label-name>:<relationship-name>]->(<node2-label-name>)
RETURN <relationship-label-name>复制
CREATE创建标签
Neo4j CQL 创建节点标签
Label
是 Neo4j
数据库中的节点或关系的名称或标识符。
关系的此标签名称称为“关系类型”。我们可以使用CQL CREATE
命令为节点或关系创建单个标签,并为节点创建多个标签。这意味着 Neo4j
仅支持两个节点之间的单个关系类型。
使用Neo4j CQL CREATE
命令,可以
为节点创建单个标签 为节点创建多个标签 为关系创建单个标签
为节点创建单个标签前面已经提过,在此不再赘述。
为节点创建多个标签,语法:
CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)
复制
注意:多个标签名之间用":"分隔。
为关系创建单个标签,语法:
CREATE (<node1-name>:<label1-name>)-
[(<relationship-name>:<relationship-label-name>)]
->(<node2-name>:<label2-name>)复制
语法说明
语法元素 | 描述 |
---|---|
它是From节点的名称。 | |
它是To节点的名称。 | |
它是From节点的标签名称 | |
它是To节点的标签名称。 | |
它是一个关系的名称。 | |
它是一个关系的标签名称。 |
WHERE子句
像 SQL
一样,Neo4j CQL
在CQL MATCH
命令中提供了 WHERE
子句来过滤 MATCH
查询的结果。
简单的 WHERE 子句语法
WHERE <condition>
复制
复杂的 WHERE 子句语法
WHERE <condition> <boolean-operator> <condition>
复制
我们可以使用布尔运算符在同一命令上放置多个条件
语法:
<property-name> <comparison-operator> <value>
复制
语法说明:
语法元素 | 描述 |
---|---|
它是节点或关系的属性名称。 | |
它是Neo4j CQL比较运算符之一。请参考下一节查看Neo4j CQL中可用的比较运算符。 | |
它是一个字面值,如数字文字,字符串文字等。 |
Neo4j
支持以下布尔运算符在 Neo4j CQL WHERE
子句中使用以支持多个条件。
布尔运算符 | 描述 |
---|---|
AND | 它是一个支持AND操作的Neo4j CQL关键字。 |
OR | 它是一个Neo4j CQL关键字来支持OR操作。 |
NOT | 它是一个Neo4j CQL关键字支持NOT操作。 |
XOR | 它是一个支持XOR操作的Neo4j CQL关键字。 |
Neo4j
支持以下的比较运算符,在 Neo4j CQL WHERE
子句中使用来支持条件。
比较运算符 | 描述 |
---|---|
= | 它是Neo4j CQL“等于”运算符 |
<> | 它是一个Neo4j CQL“不等于”运算符 |
< | 它是一个Neo4j CQL“小于”运算符 |
> | 它是一个Neo4j CQL“大于”运算符 |
<= | 它是一个Neo4j CQL“小于或等于”运算符 |
>= | 它是一个Neo4j CQL“大于或等于”运算符 |
使用 WHERE 子句创建关系
在 Neo4J CQL
中,我们可以以不同的方式创建节点之间的关系。
创建两个现有节点之间的关系 一次创建两个新节点和它们之间的关系 使用WHERE子句创建两个现有节点之间的关系
语法:
MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
WHERE <condition>
CREATE (<node1-label-name>)-[<relationship-label-name>:<relationship-name>
{<relationship-properties>}]->(<node2-label-name>)复制
DELETE子句
Neo4j
使用 CQL DELETE
子句,可以
删除节点 删除节点及相关节点和关系
DELETE
节点子句语法
DELETE <node-name-list>
复制
DELETE
命令不能单独使用,要和MATCH一起
通过使用此命令,我们可以从数据库永久删除节点及其关联的属性
DELETE
节点和关系子句语法
DELETE <node1-name>,<node2-name>,<relationship-name>
复制
REMOVE删除
有时基于我们的客户端要求,我们需要向现有节点或关系添加或删除属性。
我们使用 Neo4j CQL SET
子句向现有节点或关系添加新属性。
我们使用 Neo4j CQL REMOVE
子句来删除节点或关系的现有属性。
Neo4j CQL REMOVE
命令用于
删除节点或关系的标签 删除节点或关系的属性
Neo4j CQL DELETE
和 REMOVE
命令之间的主要区别
DELETE操作用于删除节点和关联关系 REMOVE操作用于删除标签和属性
Neo4j CQL DELETE
和 REMOVE
命令之间的相似性
这两个命令不应单独使用 两个命令都应该与MATCH命令一起使用
删除节点/关系的属性
我们可以使用相同的语法从数据库中永久删除节点或关系的属性或属性列表。
REMOVE属性子句语法
REMOVE <property-name-list>
复制
<属性名称列表>语法
<node-name>.<property1-name>,
<node-name>.<property2-name>,
....
<node-name>.<propertyn-name>复制
删除节点/关系的标签
我们可以使用相同的语法从数据库中永久删除节点或关系的标签或标签列表
REMOVE一个Label子句语法:
REMOVE <label-name-list>
复制
<标签名称列表>语法
<node-name>:<label2-name>,
....
<node-name>:<labeln-name>复制
SET 子句
Neo4j CQL
提供 SET
子句来执行以下操作
向现有节点或关系添加新属性 添加或更新属性值
SET子句语法
SET <property-name-list>
复制
<属性名称列表>语法:
<node-label-name>.<property1-name>,
<node-label-name>.<property2-name>,
....
<node-label-name>.<propertyn-name>复制
SET命令也要和MATCH一起使用
SORTING排序
Neo4j CQL
在 MATCH
命令中提供了 ORDER BY
子句,对 MATCH
查询返回的结果进行排序。
我们可以按升序或降序对行进行排序。
默认情况下,它按升序对行进行排序。如果我们要按降序对它们进行排序,我们需要使用DESC子句
ORDER BY子句语法
ORDER BY <property-name-list> [DESC]
复制
<属性名称列表>语法:
<node-label-name>.<property1-name>,
<node-label-name>.<property2-name>,
....
<node-label-name>.<propertyn-name>复制
UNION 命令
与 SQL
一样, Neo4j CQL
有两个子句,将两个不同的结果合并成一组结果
UNION UNION ALL
UNION子句
它将两组结果中的公共行组合并返回到一组结果中。它不从两个节点返回重复的行。
限制
结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。
UNION子句语法
<MATCH Command1>
UNION
<MATCH Command2>复制
语法说明:
语法元素 | 描述 |
---|---|
它是CQL MATCH命令,由UNION子句使用。 | |
它是CQL MATCH命令两个由UNION子句使用。 |
注意:
如果这两个查询不返回相同的列名和数据类型,那么它抛出一个错误。同时使用UNION时,由于属性名的前缀一般不一致,要注意使用"AS"给其取别名。
UNION ALL子句
UNION ALL子句语法和UNION类似,但是使用后者会返回重复的行。
LIMIT 和 SKIP 子句
Neo4j CQL LIMIT 子句
Neo4j CQL
已提供 LIMIT
子句来过滤或限制查询返回的行数。它修剪 CQL
查询结果集底部的结果。
LIMIT
子句语法
LIMIT <number>
复制
limit
也要配合 match
使用
Neo4j CQL SKIP 子句
Neo4j CQL
已提供SKIP
子句来过滤或限制查询返回的行数。它修整了 CQL
查询结果集顶部的结果。
SKIP
子句语法:
SKIP <number>
复制
MERGE子句
Neo4j
使用 CQL MERGE
命令,可以
创建节点,关系和属性 为从数据库检索数据
MERGE
命令是 CREATE
命令和 MATCH
命令的组合。
MERGE = CREATE + MATCH
复制
Neo4j CQL MERGE
命令在图中搜索给定模式,如果存在,则返回结果
如果它不存在于图中,则它创建新的节点/关系并返回结果。
Neo4j CQL MERGE
语法
MERGE (<node-name>:<label-name>
{
<Property1-name>:<Pro<rty1-Value>
.....
<Propertyn-name>:<Propertyn-Value>
})复制
语法说明:
语法元素 | 描述 |
---|---|
MERGE | 它是一个Neo4j CQL关键字。 |
它是节点或关系的名称。 | |
它是节点或关系的标签名称。 | |
<property_name> | 它是节点或关系的属性名称。 |
<property_value> | 它是节点或关系的属性值。 |
CREATE
命令总是向数据库添加新的节点;MERGE命令将新的节点添加到数据库,只有当它不存在。
NULL 值
Neo4j CQL
将空值视为对节点或关系的属性的缺失值或未定义值。
当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有NULL属性值的新节点。
通过如下命令,可以选择NULL或者排除NULL
match(node-name:node-label-name)
where node-name.property_value is (not) null
return node-name复制
IN 操作符
IN
操作符语法
IN[<Collection-of-values>]
复制
语法说明:
语法元素 | 描述 |
---|---|
IN | 它是一个Neo4j CQL关键字。 |
[ | 它告诉Neo4j CQL,一个值的集合的开始。 |
] | 它告诉Neo4j CQL,值集合的结束。 |
它是由逗号运算符分隔的值的集合。 |
IN
操作类似于 SQL
语句中的操作,要和 where
语句一起使用
ID 属性
在 Neo4j
中,Id
是节点和关系的默认内部属性。这意味着,当我们创建一个新的节点或关系时,`Neo4j数据库服务器将为内部使用分配一个数字。它会自动递增。
注意:以相同的方式,Neo4j
数据库服务器为关系分配一个默认 Id
属性。
节点的Id属性的最大值约为35亿 Id的最大值关系的属性的大约35亿
方向关系
由于 Neo4j
遵循属性图数据模型,它应该只支持方向关系。如果我们尝试创建一个没有任何方向的关系,那么 Neo4j DB
服务器应该抛出一个错误。
我们使用以下语法来创建两个节点之间的关系。
CREATE (<node1-details>)-[<relationship-details>]->(<node2-details>)
复制
这里
是“From Node”节点详细信息 是“到节点”节点详细信息 relationship-details>是关系详细信息
如果我们观察上面的语法,它使用一个箭头标记:() - []→()
。它表示从左侧节点到右侧节点的方向。
如果我们尝试使用相同的语法,没有箭头标记:() - [] - ()
,这意味着没有方向的关系。然后Neo4j DB
服务器应该抛出一个错误消息
06
—
总结
本期主要讲述了 Neo4j
的基础语法,从创建语句CREATE
到 MERGE
子句,逐个关键字地介绍 Neo4j
中常用的命令,本篇文章可以作为一本语法字典,在有需要的时候,随性翻阅,希望对感兴趣的小伙伴有所帮助。
本期就到这了,这里是花栗鼠小K,下次有🌰,我再来,拜拜~~~
关注六只栗子,面试不迷路!
作者 花栗鼠小K
编辑 一口栗子