一 neo4j入门简介
CQL代表Cypher查询语言。 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言。
1.1 Neo4j CQL命令
CQL命令/条 | 用法 |
---|---|
CREATE 创建 | 创建节点,关系和属性 |
MATCH 匹配 | 检索有关节点,关系和属性数据 |
RETURN 返回 | 返回查询结果 |
WHERE 哪里 | 提供条件过滤检索数据 |
DELETE 删除 | 删除节点和关系 |
REMOVE 移除 | 删除节点和关系的属性 |
ORDER BY以…排序 | 排序检索数据 |
SET 组 | 添加或更新标签 |
1.2 Neo4j CQL 函数
定制列表功能 | 用法 |
---|---|
String 字符串 | 它们用于使用String字面量。 |
Aggregation 聚合 | 它们用于对CQL查询结果执行一些聚合操作。 |
Relationship 关系 | 他们用于获取关系的细节,如startnode,endnode等。 |
1.3 Neo4j CQL数据类型
CQL数据类型 | 用法 |
---|---|
boolean | 用于表示布尔文字:true,false。 |
byte | 用于表示8位整数。 |
short | 用于表示16位整数。 |
int | 用于表示32位整数。 |
long | 用于表示64位整数。 |
float | I用于表示32位浮点数。 |
double | 用于表示64位浮点数。 |
char | 用于表示16位字符。 |
String | 用于表示字符串。 |
二 neo4j基础命令
2.1 CREATE命令
CREATE命令的主要作用如下:
- 创建没有属性的节点
- 使用属性创建节点
- 在没有属性的节点之间创建关系
- 使用属性创建节点之间的关系
- 为节点或关系创建单个或多个标签
2.1.1 创建没有属性的节点
创建一个没有任何数据的节点
CREATE命令语法
1 | CREATE (<node-name>:<label-name>) |
语法说明
语法元素 | 描述 |
---|---|
CREATE | 它是一个Neo4j CQL命令。 |
<node-name> |
它是要创建的节点名称。 |
<label-name> |
它是一个节点标签名称 |
注意事项 :
1、Neo4j数据库服务器使用此
2、Neo4j数据库服务器创建一个
使用示例
命令如下:
1 | CREATE (emp:Employee) |
这里 emp 是一个节点名,Employee 是 emp 节点的标签名称
1 | { |
2.1.2 创建具有属性的节点
创建一个具有一些属性(键值对)的节点来存储数据
CREATE命令语法
1 | CREATE ( |
语法说明
语法元素 | 描述 |
---|---|
<node-name> |
它是将要创建的节点名称。 |
<label-name> |
它是一个节点标签名称 |
<Property1-name>...<Propertyn-name> |
属性是键值对。 定义将分配给创建节点的属性的名称 |
<Property1-value>...<Propertyn-value> |
属性是键值对。 定义将分配给创建节点的属性的值 |
使用示例1
创建具有一些属性(deptno,dname,位置)的Dept节点
命令如下
1 | CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" }) |
这里dept是一个节点名,Dept是dept节点的标签名称。这里的属性名称是deptno,dname,location属性值为10,”Accounting”,”Hyderabad” ,Property = deptno:10
因为deptno是一个整数属性,所以没有使用单引号或双引号定义其值10。
由于dname和location是String类型属性,因此使用单引号或双引号定义其值。
注意 - 要定义字符串类型属性值,需要使用单引号或双引号。
结果如下:
1 | { |
使用示例2
创建具有一些属性(id,name,sal,deptno)的Employee节点
命令如下
1 | CREATE (emp:Employee{id:123,name:"Lokesh",sal:35000,deptno:10}) |
这里emp是一个节点名。Employee是emp节点的标签名称
结果如下(包含2.1.1中创建的节点)
1 | { |
2.2 MATCH命令
MATCH 命令用于
- 从数据库获取有关节点和属性的数据
- 从数据库获取有关节点,关系和属性的数据
MATCH 命令语法:
1 | MATCH |
语法说明
语法元素 | 描述 |
---|---|
<node-name> |
这是要创建一个节点名称。 |
<label-name> |
这是一个节点的标签名称 |
注意事项
- Neo4j 数据库服务器使用此
将此节点详细信息存储在 Database.As 中作为 Neo4j DBA 或 Developer,不能使用它来访问节点详细信息。 - Neo4j 数据库服务器创建一个
作为内部节点名称的别名。作为 Neo4j DBA 或 Developer,应该使用此标签名称来访问节点详细信息。
注意-不能单独使用 MATCH Command 从数据库检索数据。 如果单独使用它,那么将 InvalidSyntax 错误。
例如执行:
1 | MATCH (dept:Dept) |
MATCH 经常需要与其他的语句配合才可以使用.
如:match (n) return n
1 | # 查询Dept下的内容 |
2.3 RETURN子句
RETURN子句用于
- 检索节点的某些属性
- 检索节点的所有属性
- 检索节点和关联关系的某些属性
- 检索节点和关联关系的所有属性
RETURN命令语法:
1 | RETURN |
语法说明:
语法元素 | 描述 |
---|---|
<node-name> |
它是将要创建的节点名称。 |
<Property1-name>...<Propertyn-name> |
属性是键值对。 |
*注意-不能单独使用 RETURN Command 从数据库检索数据。 如果单独使用它,那么将 SyntaxError 错误。*
例如执行
1 | RETURN dept.deptno |
2.4 MATCH & RETURN匹配和返回
在Neo4j CQL中,不能单独使用MATCH或RETURN命令,因此应该合并这两个命令以从数据库检索数据。
Neo4j使用CQL MATCH + RETURN命令 -
- 检索节点的某些属性
- 检索节点的所有属性
- 检索节点和关联关系的某些属性
- 检索节点和关联关系的所有属性
2.4.1 命令语法
MATCH RETURN命令语法
1 | MATCH Command |
语法说明:
语法元素 | 描述 |
---|---|
MATCH命令 | 这是Neo4j CQL MATCH命令。 |
RETURN命令 | 这是Neo4j CQL RETURN命令。 |
MATCH命令语法:
1 | MATCH |
语法说明:
语法元素 | 描述 |
---|---|
<node-name> |
它是将要创建的节点名称。 |
<label-name> |
它是一个节点标签名称 |
RETURN命令语法:
1 | RETURN |
语法说明:
语法元素 | 描述 |
---|---|
<node-name> |
它是将要创建的节点名称。 |
<Property1-name>...<Propertyn-name> |
属性是键值对。 定义将分配给创建节点的属性的名称 |
2.4.2 使用示例1
本示例演示如何从数据库检索Dept节点的一些属性(deptno,dname)数据。
注-结点包含3个属性:deptno,dname,location。 然而在这个例子中,感兴趣的是只查看两个属性数据。
命令如下:
1 | MATCH (dept: Dept) |
这里 -
- dept是节点名称
- 这里Dept是一个节点标签名
- deptno是dept节点的属性名称
- dname是dept节点的属性名
运行结果如下:
2.4.3 使用示例2
此示例演示如何从数据库检索Dept节点的数据,而无需指定其属性。
注-结点包含3个属性:deptno,dname,location。
命令如下:
1 | MATCH (e:Employee) |
这里e是一个节点名,Employee是一个节点标签名
运行结果如下:
2.5 关系类型
在Neo4j CQL中,不能单独使用MATCH或RETURN命令,因此应该结合这两个命令从数据库检索数据。
本示例演示如何使用属性和这两个节点之间的关系创建两个节点。
注-将创建两个节点:客户节点 (Customer) 和信用卡节点 (CreditCard)。
- 客户节点包含:ID,姓名,出生日期属性
- CreditCard节点包含:id,number,cvv,expiredate属性
- 客户与信用卡关系:DO_SHOPPING_WITH
- CreditCard到客户关系:ASSOCIATED_WITH
将在以下步骤中处理此示例: -
- 创建客户节点
- 创建CreditCard节点
- 观察先前创建的两个节点:Customer和CreditCard
- 创建客户和CreditCard节点之间的关系
- 查看新创建的关系详细信息
- 详细查看每个节点和关系属性
创建客户节点
命令如下:
1 | CREATE (e:Customer{id:"1001",name:"Abc",dob:"01/10/1982"}) |
参数解释如下:
- e是节点名称
- 在这里Customer是节点标签名称
- id,name和dob是Customer节点的属性名称
创建CreditCard节点
命令如下:
1 | CREATE (cc:CreditCard{id:"5001",number:"1234567890",cvv:"888",expiredate:"20/17"}) |
这里cc是一个节点名,CreditCard是节点标签名称; id,number,cvv和expiredate是CreditCard节点的属性名称
Neo4j图数据库遵循属性图模型来存储和管理其数据。
根据属性图模型,关系应该是定向的。 否则,Neo4j将抛出一个错误消息。
基于方向性,Neo4j关系被分为两种主要类型。
- 单向关系
- 双向关系
在以下场景中,可以使用Neo4j CQL CREATE命令来创建两个节点之间的关系。 这些情况适用于Uni和双向关系。
- 在两个现有节点之间创建无属性的关系
- 在两个现有节点之间创建有属性的关系
- 在两个新节点之间创建无属性的关系
- 在两个新节点之间创建有属性的关系
- 在具有WHERE子句的两个退出节点之间创建/不使用属性的关系
注意 -
将创建客户和CreditCard之间的关系,如下所示:
此图描述了客户与CreditCard之间的关系
客户→信用卡 ,这里的关系是箭头标记(→)。由于Neo4j CQL语法是以人类可读的格式。 Neo4j CQL也使用类似的箭头标记来创建两个节点之间的关系。
每个关系(→)包含两个节点
- 从节点
- 到节点
从上图中,Customer节点是“From Node”,CreditCard Node是“To Node”这种关系。
对于节点,它们是两种关系
- 外向关系
- 传入关系
从上图中,关系是到客户节点的“外向关系”,并且相同的关系是到信用卡节点的“到达关系”。
考虑下面的图。 这里创建了从“CreditCard”节点到“客户”节点的关系。
从上面的图中,关系是“出局关系”到“信用卡”节点,并且相同的关系是“到达关系”到“客户”节点。
考虑下面的图。 在“CreditCard”和“Customer”节点之间创建了两个关系:一个从“CreditCard”到“Customer”。 另一个从“客户”到“信用卡”。 这意味着它是双向关系。
2.5.1 使用现有节点创建没有属性的关系
在这种情况下,将使用两个现有节点:CreditCard和Customer创建没有属性的关系。 这意味着,的Neo4J数据库应该有这两个节点。
使用CQL MATCH命令检索现有的两个节点和CQL CREATE命令,以创建它们之间的新关系。
语法:
1 | MATCH (<node1-label-name>:<nodel-name>),(<node2-label-name>:<node2-name>) |
语法说明:
语法元素 | 描述 |
---|---|
MATCH,CREATE,RETURN | 他们是Neo4J CQL关键字。 |
<node1-name> |
它用于创建关系的“From Node”的名称。 |
<node1-label-name> |
它用于创建关系的“From Node”的标签名称。 |
<node2-name> |
它用于创建关系的“To Node”的名称。 |
<node2-label-name> |
它用于创建关系的“To Node”的标签名称。 |
<relationship-name> |
这是一个关系的名称。 |
<relationship-label-name> |
它是一个关系的标签名称。 |
注意:
在此语法中,RETURN子句是可选的。 如果想立即看到结果,那么使用它。 否则,可以省略这个子句。
使用示例
1 | MATCH (e:Customer),(cc:CreditCard) |
这里关系名称为“DO_SHOPPING_WITH” , 关系标签为“r”。e和Customer分别是客户节点的节点名称和节点标签名称。cc和CreditCard分别是CreditCard节点的节点名和节点标签名。
执行成功后,再执行以下命令
1 | MATCH (e)-[r:DO_SHOPPING_WITH ]->(cc) |
结果如下:
1 | { |
查看数据,可以看到:
2.5.2 使用现有节点创建有属性的关系
在这种情况下,将使用两个现有节点:CreditCard和Customer创建与属性的关系。 这意味着,的Neo4J数据库应该有这两个节点。
使用CQL MATCH命令检索现有的两个节点和CQL CREATE命令,以创建它们之间的新关系。
语法:
1 | MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>) |
语法说明:
语法元素 | 描述 |
---|---|
MATCH,CREATE,RETURN | 他们是Neo4J CQL关键词。 |
<node1-name> |
它是用于创建关系的“From Node”的名称。 |
<node1-label-name> |
它是用于创建关系的“From Node”的标签名称。 |
<node2-name> |
它是用于创建关系的“To Node”的名称。 |
<node2-label-name> |
它是用于创建关系的“To Node”的标签名称。 |
<relationship-name> |
这是一个关系的名称。 |
<relationship-label-name> |
它是一个关系的标签名称。 |
<define-properties-list> |
它是分配给新创建关系的属性(名称 - 值对)的列表。 |
注意 -
在此语法中,RETURN子句是可选的。 如果想立即看到结果,那么使用它。 否则,可以省略这个子句。
可以表示这{}如下。
语法 -
1 | { |
语法说明:
语法元素 | 描述 |
---|---|
<propertyx-name> |
它是分配给新创建关系的属性的名称。 其中x是1,2,… n个值 |
<propertyx-value> |
这是一个分配给新创建关系的Property的值。 其中x是1,2,… n个值 |
应该使用Colon(:)运算符来分隔属性名称和值。应该使用Comma(,)运算符将一对Property(名称值)与另一对Property分离。
使用示例
验证客户和CreditCard节点可用
1 | MATCH (e:Customer) |
1 | MATCH (cc:CreditCard) |
输入以下命令
1 | MATCH (cust:Customer),(cc:CreditCard) |
参数解释如下:
- 关系名称为“DO_SHOPPING_WITH”
- 关系标签为“r”。
- shopdate和price是关系“r”的属性。
- cust和Customer分别是客户节点的节点名称和节点标签名称。
- cc和CreditCard分别是CreditCard节点的节点名和节点标签名。
由于使用RETURN子句,不需要单独的MATCH + RETRUN命令来查看详细信息。 它在UI模式下显示它们之间的节点和关系
2.5.3 使用新节点创建没有属性的关系
在这种情况下,将一次创建两个没有属性的节点和关系。 这意味着,的Neo4J数据库没有这两个节点。
使用CQL CREATE命令一次创建两个结束节点和它们之间的新关系。
语法:
1 | CREATE |
语法说明:
语法元素 | 描述 |
---|---|
CREATE,RETURN | 他们是Neo4J CQL关键字。 |
<node1-name> |
它用于创建关系的“From Node”的名称。 |
<node1-label-name> |
它用于创建关系的“From Node”的标签名称。 |
<node2-name> |
它用于创建关系的“To Node”的名称。 |
<node2-label-name> |
它用于创建关系的“To Node”的标签名称。 |
<relationship-name> |
这是一个关系的名称。 |
<relationship-label-name> |
它是一个关系的标签名称。 |
注意 -
在此语法中,RETURN子句是可选的。 如果想立即看到结果,那么使用它。 否则,可以省略这个子句。
使用示例
命令如下
1 | CREATE (fb1:FaceBookProfile1)-[like:LIKES]->(fb2:FaceBookProfile2) |
参数解释如下:
- 这里关系名称是“LIKES”
- 关系标签是“like”。
- fb1和FaceBookProfile1分别是“From Node”的节点名和节点标签名。
- fb2和FaceBookProfile2分别是“To Node”的节点名和节点标签名。
执行结果如下:
查看创建的数据
1 | MATCH (fb1:FaceBookProfile1)-[like:LIKES]->(fb2:FaceBookProfile2) |
结果如下:
1 | { |
2.5.4 使用新节点创建有属性的关系
在这种情况下,将一次创建两个节点和关系属性。 这意味着,的Neo4J数据库没有这两个节点。
使用CQL CREATE命令一次创建两个结束节点和它们之间的新关系。
语法:
1 | CREATE |
语法说明:
语法元素 | 描述 |
---|---|
CREATE,RETURN | 他们是Neo4J CQL关键字。 |
<node1-name> |
它用于创建关系的“From Node”的名称。 |
<node1-label-name> |
它用于创建关系的“From Node”的标签名称。 |
<node2-name> |
它用于创建关系的“To Node”的名称。 |
<node2-label-name> |
它用于创建关系的“To Node”的标签名称。 |
<relationship-name> |
这是一个关系的名称。 |
<relationship-label-name> |
它是一个关系的标签名称。 |
注意 -
在此语法中,RETURN子句是可选的。 如果想立即看到结果,那么使用它。 否则,可以省略这个子句。
可以表示这个{
1 | { |
示例
命令如下
1 | CREATE (video1:YoutubeVideo1{title:"Action Movie1",updated_by:"Abc",uploaded_date:"10/10/2010"}) |
参数解释如下:
- 这里的关系名称是“ACTION_MOVIES”
- 关系标签是“电影”。
- video1和YoutubeVideo1分别是“From Node”的节点名和节点标签名。
- video2和YoutubeVideo2分别是“To Node”的节点名和节点标签名。
待上述命令执行成功,可通过一下命令查看结果
1 | MATCH (video1:YoutubeVideo1)-[movie:ACTION_MOVIES]->(video2:YoutubeVideo2) |
2.5.5 检索关系节点的详细信息
可以使用MATCH + RETURN命令来查看单独创建或作为关系的一部分创建的节点的详细信息。
在本章中,将讨论如何检索参与关系的Node的详细信息。
语法:
1 | MATCH |
语法说明:
语法元素 | 描述 |
---|---|
MATCH,RETURN | 他们是Neo4j CQL关键字。 |
<node1-label-name> |
它是用于创建关系的“From Node”的标签名称。 |
<node2-label-name> |
它是用于创建关系的“To Node”的标签名称。 |
<relationship-name> |
它是一个关系的名称。 |
<relationship-label-name> |
它是关系的标签名称。 |
示例
此示例演示如何检索用于创建关系的“表单节点”和“到节点”节点的详细信息。
1 | MATCH (cust)-[r:DO_SHOPPING_WITH]->(cc) |
2.6 CREATE创建标签
Label是Neo4j数据库中的节点或关系的名称或标识符。可以将此标签名称称为关系为“关系类型”。
可以使用CQL CREATE命令为节点或关系创建单个标签,并为节点创建多个标签。 这意味着Neo4j仅支持两个节点之间的单个关系类型。可以在UI模式和网格模式下在CQL数据浏览器中观察此节点或关系的标签名称。 并且引用它执行CQL命令。到目前为止,只创建了一个节点或关系的标签,但没有讨论它的语法。
使用Neo4j CQL CREATE命令
- 为节点创建单个标签
- 为节点创建多个标签
- 为关系创建单个标签
2.6.1 单个标签到节点
语法:
1 | CREATE (<node-name>:<label-name>) |
语法元素 | 描述 |
---|---|
CREATE 创建 | 它是一个Neo4j CQL关键字。 |
<node-name> <节点名称> |
它是一个节点的名称。 |
<label-name><标签名称> |
这是一个节点的标签名称。 |
注意 -
- 应该使用colon(:)运算符来分隔节点名和标签名。
- Neo4j数据库服务器使用此名称将此节点详细信息存储在Database.As Neo4j DBA或Developer中,不能使用它来访问节点详细信息
- Neo4j数据库服务器创建一个标签名称作为内部节点名称的别名。作为Neo4j DBA或开发人员,应该使用此标签名称来访问节点详细信息。
使用示例
本示例演示如何为“GooglePlusProfile”节点创建单个标签。
1 | CREATE (google1:GooglePlusProfile) |
这里的google1是一个节点名,GooglePlusProfile是google1node的标签名称
可以观察到在Neo4j数据库中创建了一个标签和一个节点。
2.6.2 多个标签到节点
语法:
1 | CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>) |
语法元素 | 描述 |
---|---|
CREATE 创建 | 这是一个Neo4j CQL关键字。 |
<node-name> <节点名称> |
它是一个节点的名称。 |
<label-name1>,<label-name2> <标签名1>,<标签名2> |
它是一个节点的标签名称的列表。 |
注意 -
- 应该使用colon(:)运算符来分隔节点名和标签名。
- 应该使用colon(:)运算符将一个标签名称分隔到另一个标签名称。
使用示例
本示例演示如何为“Cinema”节点创建多个标签名称。的客户提供的多个标签名称:Cinema,Film,Movie,Picture。
1 | CREATE (m:Movie:Cinema:Film:Picture) |
这里m是一个节点名,Movie, Cinema, Film, Picture是m节点的多个标签名称
2.6.3 单个标签到关系
语法:
1 | CREATE (<node1-name>:<label1-name>)- |
语法说明
语法元素 | 描述 |
---|---|
CREATE 创建 | 它是一个Neo4J CQL关键字。 |
<node1-name> <节点1名> |
它是From节点的名称。 |
<node2-name> <节点2名> |
它是To节点的名称。 |
<label1-name> <LABEL1名称> |
它是From节点的标签名称 |
<label2-name> <LABEL2名称> |
它是To节点的标签名称。 |
<relationship-name> <关系名称> |
它是一个关系的名称。 |
<relationship-label-name> <相关标签名称> |
它是一个关系的标签名称。 |
注意 -
- 应该使用colon(:)运算符来分隔节点名和标签名。
- 应该使用colon(:)运算符来分隔关系名称和关系标签名称。
- 应该使用colon(:)运算符将一个标签名称分隔到另一个标签名称。
- Neo4J数据库服务器使用此名称将此节点详细信息存储在Database.As中作为Neo4J DBA或开发人员,不能使用它来访问节点详细信息。
- Neo4J Database Server创建一个标签名称作为内部节点名称的别名。作为Neo4J DBA或Developer,应该使用此标签名称来访问节点详细信息。
使用示例
本示例演示如何为关系创建标签
1 | CREATE (p1:Profile1)-[r1:LIKES]->(p2:Profile2) |
参数解释如下:
- 这里p1和profile1是节点名称和节点标签名称“From Node”
- p2和Profile2是“To Node”的节点名称和节点标签名称
- r1是关系名称
- LIKES是一个关系标签名称
2.7 WHERE子句
2.7.1 语法说明
像SQL一样,Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询的结果。
简单WHERE子句语法
1 | WHERE <condition> |
复杂WHERE子句语法
1 | WHERE <condition> <boolean-operator> <condition> |
可以使用布尔运算符在同一命令上放置多个条件。
1 | <property-name> <comparison-operator> <value> |
语法说明:
语法元素 | 描述 |
---|---|
WHERE | 它是一个Neo4j CQL关键字。 |
<property-name> <属性名称> |
它是节点或关系的属性名称。 |
<comparison-operator> <比较运算符> |
它是Neo4j CQL比较运算符之一。请参考下一节查看Neo4j CQL中可用的比较运算符。 |
<value> <值> |
它是一个字面值,如数字文字,字符串文字等。 |
Neo4j CQL中的布尔运算符
Neo4j支持以下布尔运算符在Neo4j CQL WHERE子句中使用以支持多个条件。
布尔运算符 | 描述 |
---|---|
AND | 它是一个支持AND操作的Neo4j CQL关键字。 |
OR | 它是一个Neo4j CQL关键字来支持OR操作。 |
NOT | 它是一个Neo4j CQL关键字支持NOT操作。 |
XOR | 它是一个支持XOR操作的Neo4j CQL关键字。 |
Neo4j CQL中的比较运算符
Neo4j 支持以下的比较运算符,在 Neo4j CQL WHERE 子句中使用来支持条件。
布尔运算符 | 描述 |
---|---|
= | 它是Neo4j CQL“等于”运算符。 |
<> | 它是一个Neo4j CQL“不等于”运算符。 |
< | 它是一个Neo4j CQL“小于”运算符。 |
> | 它是一个Neo4j CQL“大于”运算符。 |
<= | 它是一个Neo4j CQL“小于或等于”运算符。 |
>= | 它是一个Neo4j CQL“大于或等于”运算符。 |
2.7.2 使用示例
此示例演示如何在MATCH Command中的CQL WHERE子句中使用多个条件与布尔运算符,以根据员工名称检索员工详细信息。
1 | MATCH (emp:Employee) |
观察结果,它返回4个员工节点详细信息.
1 | MATCH (emp:Employee) |
观察到结果,它只返回两个名为“Abc”或“Xyz”的员工详细信息。
2.7.3 用WHERE子句创建关系
在Neo4J CQL中,可以以不同的方式创建拖曳节点之间的关系。
- 创建两个现有节点之间的关系
- 一次创建两个节点和它们之间的关系
- 使用WHERE子句创建两个现有节点之间的关系
语法
1 | MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>) |
语法说明:
语法元素 | 描述 |
---|---|
MATCH,WHERE,CREATE | 他们是Neo4J CQL关键字。 |
<node1-label-name> |
它是一个用于创建关系的节点一标签名称。 |
<node1-name> |
它是一个用于创建关系的节点名称。 |
<node2-label-name> |
它是一个用于创建关系的节点一标签名称。 |
<node2-name> |
它是一个用于创建关系的节点名称。 |
<condition> |
它是一个Neo4J CQL WHERE子句条件。 它可以是简单的或复杂的。 |
<relationship-label-name> |
这是新创建的节点一和节点二之间的关系的标签名称。 |
<relationship-name> |
这是新创建的节点1和节点2之间的关系的名称。 |
<relationship-properties> |
这是一个新创建节点一和节点二之间关系的属性列表(键 - 值对)。 |
使用示例
1 | MATCH (cust:Customer),(cc:CreditCard) |
2.8 DELETE删除
Neo4j使用CQL DELETE子句
- 删除节点。
- 删除节点及相关节点和关系。
2.8.1 删除节点
通过使用此命令,可以从数据库永久删除节点及其关联的属性。
DELETE节点子句语法
1 | DELETE <node-name-list> |
语法元素 | 描述 |
---|---|
DELETE | 它是一个Neo4j CQL关键字。 |
<node-name-list> |
它是一个要从数据库中删除的节点名称列表。 |
注意 -
应该使用逗号(,)运算符来分隔节点名。
使用示例
此示例演示如何从数据库中永久删除节点。
首先查询数据
1 | MATCH (e: Employee) RETURN e |
注意 -
1 | MATCH (e: 'Employee') RETURN e |
所有三个命令都相同,可以选择这些命令中的任何一个。
接下来执行
1 | MATCH (e: Employee) DELETE e |
现在,而不是“返回e”,使用“DELETE e”命令删除Employee节点
再执行查询语句
1 | MATCH (e: Employee) RETURN e |
可以发现,数据已被删除。
2.8.2 DELETE节点和关系子句
语法
1 | DELETE <node1-name>,<node2-name>,<relationship-name> |
语法元素 | 描述 |
---|---|
DELETE | 它是一个Neo4j CQL关键字。 |
<node1-name> |
它是用于创建关系 |
<node2-name> |
它是用于创建关系 |
<relationship-name> |
它是一个关系名称,它在 |
注意 -
应该使用逗号(,)运算符来分隔节点名称和关系名称。
使用示例
此示例演示如何从数据库永久删除节点及其关联节点和关系。
首先查询关系
1 | MATCH (cc:CreditCard)-[r]-(c:Customer)RETURN r |
在这里观察到一个节点为客户,一个节点为信用卡和它们之间的关系是可用的。
接下来执行删除语句
1 | MATCH (cc: CreditCard)-[rel]-(c:Customer) |
这里可以观察到两个节点及其关联的10个关系被成功删除。
2.8.3 清空所有数据
两种方法:
一、用下列 Cypher 语句:
1 | match (n) detach delete n |
二、
1、停掉服务;
2、删除 graph.db 目录;
3、重启服务。
2.9 REMOVE删除
有时需要向现有节点或关系添加或删除属性 , 使用Neo4j CQL SET子句向现有节点或关系添加新属性,使用Neo4j CQL REMOVE子句来删除节点或关系的现有属性。
REMOVE命令用于
- 删除节点或关系的标签
删除节点或关系的属性
DELETE和 REMOVE 命令之间的主要区别 -
DELETE操作用于删除节点和关联关系。
REMOVE操作用于删除标签和属性。
DELETE和REMOVE命令之间的相似性 -
这两个命令不应单独使用。
- 两个命令都应该与MATCH命令一起使用。
2.9.1 删除节点/关系的属性
可以使用相同的语法从数据库中永久删除节点或关系的属性或属性列表。
REMOVE属性子句语法
1 | REMOVE <property-name-list> |
语法元素 | 描述 |
---|---|
REMOVE | 它是一个Neo4j CQL关键字。 |
<property-name-list> |
它是一个属性列表,用于永久性地从节点或关系中删除它。 |
1 | <node-name>.<property1-name>, |
语法说明:
语法元素 | 描述 |
---|---|
它是节点的名称。 | |
它是节点的属性名称。 |
注意 -
- 应该使用逗号(,)运算符来分隔标签名称列表。
- 应该使用dot(。)运算符来分隔节点名称和标签名称。
使用示例
先创建数据
1 | CREATE (book:Book {id:122,title:"Neo4j Tutorial",pages:340,price:250}) |
然后查询数据
1 | MATCH (book : Book) |
解下来执行删除语句(从书节点中删除“price”属性)
1 | MATCH (book { id:122 }) |
再次查询数据,可以看到此属性已被删除
2.9.2 删除节点/关系的标签
可以使用相同的语法从数据库中永久删除节点或关系的标签或标签列表。
REMOVE一个Label子句语法:
1 | REMOVE <label-name-list> |
语法元素 | 描述 |
---|---|
REMOVE | 它是一个Neo4j CQL关键字。 |
<label-name-list> |
它是一个标签列表,用于永久性地从节点或关系中删除它 |
1 | <node-name>:<label2-name>, |
语法说明:
语法元素 | 描述 |
---|---|
<node-name> <节点名称> |
它是一个节点的名称。 |
<label-name> <标签名称> |
这是一个节点的标签名称。 |
注意 -
- 应该使用逗号(,)运算符来分隔标签名称列表。
- 应该使用colon(:)运算符来分隔节点名和标签名。
使用示例
此示例演示如何从数据库永久删除不需要的标签到节点。
1 | MATCH (m:Movie) |
2.10 SET子句
有时需要向现有节点或关系添加新属性,要做到这一点,Neo4j CQL 提供了一个SET子句。
Neo4j CQL 已提供 SET 子句来执行以下操作。
- 向现有节点或关系添加新属性
- 添加或更新属性值
SET子句语法
1 | SET <property-name-list> |
语法元素 | 描述 |
---|---|
SET | 它是一个 Neo4j 的 CQL 关键字。 |
<property-name-list> |
它是一个属性列表,用于执行添加或更新操作以满足的要求。 |
<属性名称列表>语法:
1 | <node-label-name>.<property1-name>, |
语法说明:
语法元素 | 描述 |
---|---|
<node-label-name> <节点标签名称> |
这是一个节点的标签名称。 |
<property-name> <属性名称> |
它是一个节点的属性名。 |
注意 -
应该使用逗号(,)运算符来分隔属性名列表。
使用示例
先查询数据
1 | MATCH (book:Book) |
得到如下结果:
再执行set语句
1 | MATCH (book:Book) |
2.11 ORDER BY排序
Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,对MATCH查询返回的结果进行排序。
可以按升序或降序对行进行排序。默认情况下,它按升序对行进行排序。 如果要按降序对它们进行排序,需要使用DESC子句。
ORDER BY子句语法
1 | ORDER BY <property-name-list> [DESC] |
<property-name-list>
语法:
1 | <node-label-name>.<property1-name>, |
语法说明:
语法元素 | 描述 |
---|---|
<node-label-name> |
它是节点的标签名称。 |
<property-name> |
它是节点的属性名称。 |
注意 -
应该使用逗号(,)运算符来分隔属性名列表。
使用示例
此示例演示如何按照升序排序“员工名称”结果。
1 | MATCH (emp:Employee) |
此示例演示如何按照员工名称按降序使用排序结果
1 | MATCH (emp:Employee) |
2.12 UNION合并
与SQL一样,Neo4j CQL有两个子句,将两个不同的结果合并成一组结果
- UNION
- UNION ALL
2.12.1 UNION子句
它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。
限制:
结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。
UNION子句语法
1 | <MATCH Command1> |
语法说明:
语法元素 | 描述 |
---|---|
<MATCH COMMAND1> |
它是CQL MATCH命令,由UNION子句使用。 |
<MATCH Command2> |
它是CQL MATCH命令两个由UNION子句使用。 |
UNION | 它是UNION子句的Neo4j CQL关键字。 |
注意 -
如果这两个查询不返回相同的列名和数据类型,那么它抛出一个错误。
2.12.2 UNION ALL子句
它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。
限制
结果列类型,并从两个结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的。
UNION ALL子句语法
1 | <MATCH Command1> |
语法说明
语法元素 | 描述 |
---|---|
<MATCH COMMAND1> |
这是CQL match命令由UNION子句中使用的一个。 |
<MATCH命令2> |
这是CQL match命令两到由UNION子句中使用。 |
UNION ALL | 这是UNION ALL子句的Neo4j的CQL关键字。 |
注意 -
如果这两个查询不返回相同的列名和数据类型,那么它抛出一个错误。
2.13 LIMIT和SKIP子句
2.13.1 LIMIT子句
Neo4j CQL已提供“LIMIT”子句来过滤或限制查询返回的行数。 它修剪CQL查询结果集底部的结果。如果要修整CQL查询结果集顶部的结果,那么应该使用CQL SKIP子句。 请参考本章的下一节CQL SKIP子句。
LIMIT子句语法
1 | LIMIT <number> |
语法说明:
语法元素 | 描述 |
---|---|
LIMIT | 它是一个Neo4j CQL关键字。 |
<number> |
它是一个跨值。 |
使用示例
1 | MATCH (n:Book) RETURN n LIMIT 25 |
得到的结果如下:
2.13.2 SKIP子句
Neo4j CQL已提供“SKIP”子句来过滤或限制查询返回的行数。 它修整了CQL查询结果集顶部的结果。如果要从CQL查询结果集底部修整结果,那么应该使用CQL LIMIT子句。
SKIP子句语法:
1 | SKIP <number> |
语法说明:
语法元素 | 描述 |
---|---|
SKIP | 它是一个Neo4j CQL关键字。 |
<number> |
它是一个间隔值。 |
使用示例
1 | MATCH (emp:Employee) |
2.14 IN操作符
与SQL一样,Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合。
IN操作符语法
1 | IN[<Collection-of-values>] |
语法说明:
语法元素 | 描述 |
---|---|
IN | 它是一个Neo4j CQL关键字。 |
[ | 它告诉Neo4j CQL,一个值的集合的开始。 |
] | 它告诉Neo4j CQL,值集合的结束。 |
<Collection-of-values> |
它是由逗号运算符分隔的值的集合。 |
使用示例
1 | MATCH (e:Employee) |
2.15 ID属性
在Neo4j中,“Id”是节点和关系的默认内部属性。 这意味着,当创建一个新的节点或关系时,Neo4j数据库服务器将为内部使用分配一个数字。 它会自动递增。
以相同的方式,Neo4j数据库服务器为关系分配一个默认Id属性。
- 节点的Id属性的最大值约为35亿。
- Id的最大值关系的属性的大约35亿。
二 CQL函数
2.1 AGGREGATION聚合
和SQL一样,Neo4j CQL提供了一些在RETURN子句中使用的聚合函数。 它类似于SQL中的GROUP BY子句。
可以使用MATCH命令中的RETURN +聚合函数来处理一组节点并返回一些聚合值。
聚合函数列表
聚集功能 | 描述 |
---|---|
COUNT | 它返回由MATCH命令返回的行数。 |
MAX | 它从MATCH命令返回的一组行返回最大值。 |
MIN | 它返回由MATCH命令返回的一组行的最小值。 |
SUM | 它返回由MATCH命令返回的所有行的求和值。 |
AVG | 它返回由MATCH命令返回的所有行的平均值。 |
2.1.1 计数
它从MATCH子句获取结果,并计算结果中出现的行数,并返回该计数值。 所有CQL函数应使用“()”括号。
函数语法
1 | COUNT(<value>) |
注意 -
<value>
可以是*,节点或关系标签名称或属性名称。
示例
先输入查询语句
1 | MATCH (n:Book) RETURN n LIMIT 25 |
得到的结果如下:
然后执行计数语句
1 | MATCH (n:Book) RETURN count(*) |
得到的结果如下:
2.1.2 max和min函数
MAX
它采用一组行和节点或关系的<property-name>
作为输入,并从给定行的 <property-name>
列中查找最大值。
函数语法
1 | MAX(<property-name> ) |
MIN
它采用一组行和节点或关系的<property-name>
作为输入,并从给定行的<property-name>
列中查找最小值。
函数语法
1 | MIN(<property-name> ) |
注意 -
<property-name>
应该是节点或关系的名称。
使用示例
1 | MATCH (n:Book) RETURN max(n.born),min(n.born) |
2.1.3 AVG和SUM函数
AVG
它采用一组行和节点或关系的<property-name>
作为输入,并从给定行的give <property-name>
列中查找平均值。
函数的语法
1 | AVG(<property-name> ) |
SUM
它采用一组行和节点或关系的<property-name>
作为输入,并从给定行的give <property-name>
列中查找求和值。
函数的语法
1 | SUM(<property-name> ) |
使用示例
1 | MATCH (n:Book) RETURN avg(n.born),sum(n.born) |
2.2 关系函数
Neo4j CQL提供了一组关系函数,以在获取开始节点,结束节点等细节时知道关系的细节。
关系函数列表
功能 | 描述 |
---|---|
STARTNODE | 它用于知道关系的开始节点。 |
ENDNODE | 它用于知道关系的结束节点。 |
ID | 它用于知道关系的ID。 |
TYPE | 它用于知道字符串表示中的一个关系的TYPE。 |
2.2.1 STARTNODE和ENDNODE
它需要一个字符串作为输入并为大写格式, 所有CQL函数应使用“()”括号。
函数语法
1 | STARTNODE (<relationship-label-name>) |
注意:-
<relationship-label-name>
可以是来自Neo4j数据库的节点或关系的属性名称。
使用示例
1 | MATCH (a)-[movie:ACTION_MOVIES]->(b) |
1 | MATCH (a)-[movie:ACTION_MOVIES]->(b) |
2.2.2 ID和TYPE
ID和TYPE关系函数来检索关系的Id和类型详细信息。
1 | MATCH (a)-[movie:ACTION_MOVIES]->(b) |
三 索引
Neo4j SQL支持节点或关系属性上的索引,以提高应用程序的性能。可以为具有相同标签名称的所有节点的属性创建索引,也可以在MATCH或WHERE或IN运算符上使用这些索引列来改进CQL Command的执行。
- Create Index 创建索引
- Drop Index 丢弃索引
3.1 创建索引
创建索引语法:
Neo4j的CQL提供“CREATE INDEX”命令创建的节点或关系的属性索引。
创建索引的语法:
1 | CREATE INDEX ON :<label_name> (<property_name>) |
注意:-
冒号(:)运算符用于引用节点或关系标签名称。
上述语法描述它在节点或关系的
示例
1 | CREATE INDEX ON :Customer (name) |
3.2 丢弃索引
Neo4j CQL已提供“DROP INDEX”命令删除NODE或Relationship的属性的现有索引。
Drop Index语法:
1 | DROP INDEX ON :<label_name> (<property_name>) |
注意:-
冒号(:)运算符用于引用节点或关系标签名称。
上述语法描述它删除在节点或关系的
示例
1 | DROP INDEX ON :Customer (name) |
四 约束
在Neo4j数据库中,CQL CREATE命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。 根据对某些节点或关系的应用需求,必须避免这种重复。 然后不能直接得到这个。 应该使用一些数据库约束来创建节点或关系的一个或多个属性的规则。
像SQL一样,Neo4j数据库也支持对NODE或Relationship的属性的UNIQUE约束
UNIQUE约束的优点
- 避免重复记录。
- 强制执行数据完整性规则。
Neo4j CQL已提供“CREATE CONSTRAINT”命令,以在NODE或关系的属性上创建唯一约束。
4.1 创建约束
创建唯一约束语法
1 | CREATE CONSTRAINT ON (<label_name>) |
语法说明:
语法元素 | 描述 |
---|---|
CREATE CONSTRAINT ON | 它是一个Neo4j CQL关键字。 |
<label_name> |
它是节点或关系的标签名称。 |
ASSERT | 它是一个Neo4j CQL关键字。 |
<property_name> |
它是节点或关系的属性名称。 |
IS UNIQUE | 它是一个Neo4j CQL关键字,通知Neo4j数据库服务器创建一个唯一约束。 |
注意:-
上述语法描述了它的
4.2 删除约束
Neo4j CQL提供了“DROP CONSTRAINT”命令,以从NODE或Relationship的属性中删除现有的Unique约束。
删除UNIQUE约束语法:
1 | DROP CONSTRAINT ON (<label_name>) |
语法说明
语法元素 | 描述 |
---|---|
DROP CONSTRAINT ON | 它是一个Neo4j CQL关键字。 |
<label_name> |
它是节点或关系的标签名称。 |
ASSERT | 它是一个Neo4j CQL关键字。 |
<property_name> |
它是节点或关系的属性名称。 |
IS UNIQUE | 它是一个Neo4j CQL关键字,通知Neo4j数据库服务器创建一个唯一约束。 |
注意 -
上述语法描述它从节点或关系的
五 官方示例
5.1 初始化脚本
1 | CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'}) |
执行成功后,可以看到数据如下图所示
5.2 查询示例
5.2.1 找到名为“Tom Hanks”的演员。
1 | MATCH (tom {name: "Tom Hanks"}) RETURN tom |
结果如下:
查询标题为“Cloud Atlas”的电影
5.2.2 查询10个用户
1 | MATCH (people:Person) RETURN people.name LIMIT 10 |
5.2.3 查找20世纪90年代发行的电影
1 | MATCH (nineties:Movie) WHERE nineties.released >= 1990 AND nineties.released < 2000 RETURN nineties.title |
5.2.4 列出所有 Tom Hanks 的电影
1 | MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies |
5.2.5 查询出谁导演了Cloud Atlas
1 | MATCH (cloudAtlas {title: "Cloud Atlas"})<-[:DIRECTED]-(directors) RETURN directors.name |
5.2.6 查询出 Tom Hanks 的搭档
1 | MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) RETURN coActors.name |
5.2.7 查询出哪些人与Cloud Atlas有关系
1 | MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"}) RETURN people.name, Type(relatedTo), relatedTo |
5.2.8 电影和演员距离Kevin Bacon最多4个“跳跃”
1 | MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..4]-(hollywood) |
5.2.9 培根路径,与Meg Ryan的任何关系中最短的路径
1 | MATCH p=shortestPath( |
5.2.10 扩展Tom Hanks的合作演员,以找到没有与Tom Hanks合作过的合作演员
1 | MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors), |
5.2.11 找个人把Tom Hanks介绍给Tom Cruise
1 | MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors), |
5.2.13 查询管理属性为Andrew Marin的记录
查询命令如下
1 | MATCH (n1)-[r{roles:['Andrew Marin']}]->(n2) RETURN r, n1, n2 LIMIT 25 |
结果如下
5.2.14 查询有一个关系角色为Conductor的记录
命令如下
1 | MATCH (n1)-[r]->(n2) where "Conductor" in r.roles RETURN r, n1, n2 |
查询结果如下
5.3 删除数据
删除所有电影和人物节点及其关系
1 | MATCH (n) DETACH DELETE n |
六 数据概况
6.1 统计全部节点数量
1 | // Count all nodes |
6.2 统计全部关系的数量
1 | // Count all relationships |
6.3 查询全部的约束和索引
1 | // Display constraints and indexes |
6.4 列出节点标签
1 | // List node labels |
6.5 列出关系类型
1 | // List relationship types |
6.6 什么是相关的,如何关联
1 | // What is related, and how |
6.7 存在什么样的节点
1 | // What kind of nodes exist |
七 docker方式安装neo4j
7.1 快速安装
安装命令如下
1 | docker run -d --name container_name \ //-d表示容器后台运行 --name指定容器名字 |
解释如下
- data——数据存放的文件夹
- logs——运行的日志文件夹
- conf——数据库配置文件夹(在配置文件neo4j.conf中配置包括开放远程连接、设置默认激活的数据库)
- import——为了大批量导入csv来构建数据库,需要导入的节点文件nodes.csv和关系文件rel.csv需要放到这个文件夹下)
执行完上述命令后就在后台把neo4j容器启动起来了,这个时候你就能在宿主机的浏览器中输入 localhost:7474 输入用户名和密码就能登录到数据库了。
7.2 基础配置
上述方式启动的neo4j是按照默认的配置进行启动的,而默认的数据库配置是不允许远程登陆的,这样对于在服务器上使用docker搭载neo4j的同学来说,就很不方便了。所以我们对默认配置进行一些改变,改变如下:
1 | // 进入容器配置目录挂载在宿主机的对应目录,我这里是/home/neo4j/conf |
保存后退出,重启neo4j容器,可以使用容器的省略id或者生成容器时指定的容器名进行重启。
防火墙设置
1 | // 查看当前防火墙状态,若为“inactive”,则防火墙已关闭,不必进行接续操作。 |
7.3 数据导入
为了加快速度,使用官方的Neo4j-import进行导入
1 | // 数据准备 |
重启后使用另一台主机向服务器发送http请求进行远程登陆,在浏览器中输入服务器ip:7474
切换连接模式为 bolt:/ ,输入用户名和密码进行登陆,登陆成功发现在数据库一栏没找到新导入的数据库graph.db
这是因为配置不够全,继续进到容器挂载到宿主机的/home/neo4j/conf中对neo4j.conf进行配置
1 | //在文件末尾添加默认的数据库 |
重新进行远程连接,此时数据库的默认选择应该就切换到了新导入的graph.db。