本关任务:完成一个简单的关系查询语句。
为了完成本关任务,你需要掌握:
Cypher 采用一对圆括号来表示节点。如:(), (foo)。下面是一些常见的节点表示法:
// 表示一个节点,但是没有属性
()
// 节点变量为 matrix
(matrix)
// 节点标签为 Movie 的节点
(:Movie)
// 节点变量为 matrix,节点标签为 Movie 的节点
(matrix:Movie)
// 节点变量为 matrix,节点标签为 Movie,节点属性 title 为 ET·Go 的节点
(matrix:Movie {title: "ET·Go"})
// 节点变量为 matrix,节点标签为 Movie,节点属性 title 为 Spider Man ,released 为 1997 的节点
(matrix:Movie {title: "Spider Man", released: 1997})
查询语句:
// 查询电影名为 “The Matrix”的电影节点
match (matrix:Movie {title: "The Matrix"}) return matrix
查询结果
Cypher 使用一对短横线(即“–”)表示:一个无方向关系。有方向的关系在其中一端加上一个箭头(即“<–”或“–>”)。方括号表达式 […]
可用于添加关系信息。里面可以包含变量、属性和或者类型信息。关系的常见表达方式如下:
// 无方向关系
--
// 有方向关系,指向一个节点
-->
// 有方向的关系,关系变量为 reole
-[role]->
// 有方向的关系,关系标签为 ACTED_IN
-[:ACTED_IN]->
// 有方向的关系,关系标签为 ACTED_IN,关系变量为 role
-[role:ACTED_IN]->
// 有方向的关系,关系标签为 ACTED_IN,关系变量为 role,属性 roles 的值为 Neo
-[role:ACTED_IN {roles: ["Neo"]}]->
查询结果
// 电影 “The Matrix” 和 “Keanu Reeves” 的关系
match (keanu:Person {name: "Keanu Reeves"})-[role:ACTED_IN {roles: ["Neo"]}]->(matrix:Movie {title: "The Matrix"}) return keanu,matrix
查询结果
Neo4j 默认是从安装目录下的 import
目录下读取数据。 如果想从其他数据读取数据,需要修改配置文件 /opt/neo4j-community-3.5.35/conf/neo4j.conf
。
将下面的语句改成这样,添加一个注释符号: #dbms.directories.import=import
保存并退出即可。
配置信息
根据提示,在右侧编辑器补充代码,查询跟孙悟空有关系的人。 评测前的准备:
source /etc/profile
;/opt/neo4j-community-3.5.35/bin/neo4j start
;cat /data/workspace/myshixun/step1/pro_data.cypher | /opt/neo4j-community-3.5.35/bin/cypher-shell -u neo4j -p 123456 --format plain
。数据标签: 节点标签为:person
,属性为:name
; 关系标签为:rel
。
注意: 在代码文件中填入 Cypher 代码。 点击左上角代码文件切换:
切换窗口
平台会对你编写的代码进行测试:
测试输入:无
;
n, r, m
(:person {name: "孙悟空"}), [:rel {label: "义兄", relation: "elder_sworn_brother"}], (:person {name: "禺狨王"})
(:person {name: "孙悟空"}), [:rel {label: "义兄", relation: "elder_sworn_brother"}], (:person {name: "猕猴王"})
(:person {name: "孙悟空"}), [:rel {label: "义兄", relation: "elder_sworn_brother"}], (:person {name: "狮驼王"})
(:person {name: "孙悟空"}), [:rel {label: "义兄", relation: "elder_sworn_brother"}], (:person {name: "鹏魔王"})
(:person {name: "孙悟空"}), [:rel {label: "义兄", relation: "elder_sworn_brother"}], (:person {name: "蛟魔王"})
....
# 更新配置文件
source /etc/profile
# 启动 Neo4j
/opt/neo4j-community-3.5.35/bin/neo4j start
# 启动脚本导入数据
cat /data/workspace/myshixun/step1/pro_data.cypher | /opt/neo4j-community-3.5.35/bin/cypher-shell -u neo4j -p 123456 --format plain
# 清空测试文件
true > /data/workspace/myshixun/step1/work.txt
# 填入 Cypher 代码内容
vim /data/workspace/myshixun/step1/work.txt
//**************Begin*************************
// 查询跟孙悟空有关系的人
match (n:person{name:"孙悟空"})-[r:rel]->(m) return n,r,m
//**************End*************************
本关任务:创建一个简单的关系节点,编写查询节点脚本。
为了完成本关任务,你需要掌握:
create
语句是创建模型语句用来创建数据模型。
// 创建简单节点
create (n)
// 创建多个节点
create (n),(m)
// 创建带标签和属性的节点并返回节点
create (n:person {name:"如来"}) return n
创建节点
Neo4j 图数据库遵循属性图模型来存储和管理其数据。 根据属性图模型,关系应该是定向的。 否则,Neo4j 将抛出一个错误消息。 基于方向性,Neo4j 关系被分为两种主要类型。
使用新节点创建关系
CREATE (n:person {name:'杨戬'})-[r:师傅]->(m:person {name:'玉鼎真人'}) return type(r)
创建关系
使用已知节点创建带属性的关系
match (n:person {name:'沙僧'}),(m:person{name:'唐僧'}) create (n)-[r:`师傅`{relation:'师傅'}]->(m) return r
创建带属性的关系
检索关系节点的详细信息
match (n:person)-[r]-(m:person) return n,m
详细信息
create p=(:person{name:'蛟魔王'})-[:义兄]->(:person{name:'牛魔王'})<-[:义兄]- (:person {name:'鹏魔王'}) return p
创建全路径
Neo4j CQL MATCH 命令用于
MATCH (n:`person`) RETURN n LIMIT 25
查询 person
Neo4j CQL RETURN 子句用于
注意:RETURN
、MATCH
两个需要搭配使用。
像 SQL 一样,Neo4j CQL 在 CQL MATCH 命令中提供了 WHERE 子句来过滤 MATCH 查询的结果。
MATCH (n:person) where n.name='孙悟空' or n.name='猪八戒' RETURN n #创建关系 match (n:person),(m:person) where n.name='孙悟空' and m.name='猪八戒' create (n)-[r:师弟]->(m) return n.name,type(r),m.name
根据提示:
注意: 数据会在评测时创建。 2. 在图形界面中使用 Neo4j 创建唐僧的关系链。
唐僧关系链
注意: 在创建唐僧关系链时,需要优先导入数据: cat /data/workspace/myshixun/step2/pro_xiyou.cypher | /opt/neo4j-community-3.5.35/bin/cypher-shell -u neo4j -p 123456 --format plain
西游标签设置为: Node labels
为:xiyouRelation
和 person
; Relationship types
为:西游人物关系
。
红楼梦标签设置为: Node labels
为:honlouRelation
和 person
; Relationship types
为:红楼梦关系
。
节点标签 关系类型
person
数据节点属性为:
name
孙悟空
贾宝玉
honlouRelation
数据节点属性为:
本节点属性,from 对于 to 的关系,to 目标关系节点
from,relation,to
贾代善,子,贾源
// 贾代善是贾源的儿子
xiyouRelation
数据节点属性为:
form,relation,to
弥勒佛,仆人,黄眉道童
// 弥勒佛的仆人是黄眉道童
平台会对你编写的代码进行测试:
测试输入:无
; 预期输出:
结构为:
仆人, 关系, 主人
"宋嬷嬷", "奴仆", "贾宝玉"
"叶茗烟", "奴仆", "贾宝玉"
"锄药", "奴仆", "贾宝玉"
"扫红", "奴仆", "贾宝玉"
"墨雨", "奴仆", "贾宝玉"
.......
# 更新配置文件
source /etc/profile
# 启动 Neo4j
/opt/neo4j-community-3.5.35/bin/neo4j start
# 导入数据
cat /data/workspace/myshixun/step2/pro_xiyou.cypher | /opt/neo4j-community-3.5.35/bin/cypher-shell -u neo4j -p 123456 --format plain
# 修改文件,创建唐僧关系链代码
vim /data/workspace/myshixun/step2/pro_xiyou.cypher
# 添加至文件末尾
match (n:person),(m:xiyouRelation),(s:person) where n.name = m.from and m.to = s.name
create (m)-[:西游人物关系 {relation:m.relation}] -> (s);
# 导入数据和唐僧关系链
cat /data/workspace/myshixun/step2/pro_xiyou.cypher | /opt/neo4j-community-3.5.35/bin/cypher-shell -u neo4j -p 123456 --format plain
# 清空测试文件
true > /data/workspace/myshixun/step2/work.txt
# 填入 Cypher 代码内容
vim /data/workspace/myshixun/step2/work.txt
//**************Begin*************************
// 查询贾宝玉奴仆的结构表(查询前 5 个)
MATCH (r:honlouRelation) where r.to = '贾宝玉' and r.relation = '奴仆' RETURN r.from as 仆人, r.relation as 关系, r.to as 主人 LIMIT 5;
//**************End*************************
本关任务:通过本关卡的学习,完成后面的操作。
为了完成本关任务,你需要掌握:
删除节点;
删除节点及相关节点和关系。
# 删除节点(前提:节点不存在关系)
MATCH (n:person {name:"白龙马"}) delete n;
# 删除关系
MATCH (n:person {name:"沙僧"})<-[r]-(m) delete r return type(r);
删除失败
因为孙悟空已经被建立关系,所以删除不了这个节点,需要优先将关系删除。
有时基于客户端要求,我们需要向现有节点或关系添加或删除属性。我们使用Neo4j CQL REMOVE 子句来删除节点或关系的现有属性。
删除节点或关系的标签;
删除节点或关系的属性。
// 删除属性
MATCH (n:role {name:"fox"}) remove n.age return n;
// 创建节点(两个标签)
CREATE (m:role:person {name:"cat233"})
// 删除标签
MATCH (m:role:person {name:"cat233"}) remove m:person return m
有时,根据我们的客户端要求,我们需要向现有节点或关系添加新属性。要做到这一点,Neo4j CQL 提供了一个SET子句。
MATCH (n:role {name:"cat"}) set n.age=32 return n
Neo4j CQL将空值视为对节点或关系的属性的缺失值或未定义值。
当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有NULL属性值的新节点。
// 查询是否为空
match (n:`西游`) where n.label is null return id(n),n.name,n.tail,n.label
Neo4j CQL 在 MATCH 命令中提供了 ORDER BY
子句,对 MATCH 查询返回的结果进行排序。 我们可以按升序或降序对行进行排序。默认情况下,它按升序对行进行排序。 如果我们要按降序对它们进行排序,我们需要使用 DESC
子句。
// 按 id 进行降序
MATCH (n:`西游`) RETURN id(n),n.name order by id(n) desc
与 SQL 一样,Neo4j CQL 有两个子句,将两个不同的结果合并成一组结果。
它将两组结果中的公共行组合并返回到一组结果中。它不从两个节点返回重复的行。
**限制:**结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。
它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。
限制: 结果列类型,并从两个结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的。
match (n:person) return n.name as name
union
match (m:xiyouRelation) return m.from as name
match (n:person) return n.name as name
union all
match (m:xiyouRelation) return m.from as name
Neo4j CQL 已提供 LIMIT
子句和 SKIP
来过滤或限制查询返回的行数。 LIMIT
返回前几行,SKIP
忽略前几行。
// 前两行
MATCH (n:`西游`) RETURN n LIMIT 2
// 忽略前两行
MATCH (n:person) RETURN n SKIP 2
与 SQL 一样,Neo4j CQL 提供了一个 IN 运算符,以便为 CQL 命令提供值的集合。
// 查询 西游 标签中姓名为孙悟空和唐僧的节点
match (n:`西游`) where n.name in['孙悟空','唐僧'] return id(n),n.name,n.tail,n.label
这个函数的用法就像 SQL 中的 distinct 关键字,返回的是所有不同值。
// 去除重复的节点数据
match (n:`西游`) return distinct(n.name)
Neo4j SQL 支持节点或关系属性上的索引,以提高应用程序的性能。
我们可以为具有相同标签名称的所有节点的属性创建索引。
我们可以在 MATCH 或 WHERE 或 IN 运算符上使用这些索引列来改进 CQL Command 的执行。
Create Index 创建索引
Drop Index 丢弃索引
// 创建索引
create index on :`西游` (name)
// 删除索引
drop index on :`西游` (name)
在 Neo4j 数据库中,CQL CREATE 命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。 根据我们对某些节点或关系的应用需求,我们必须避免这种重复。
像 SQL 一样,Neo4j 数据库也支持对 NODE 或 Relationship 的属性的 UNIQUE 约束。
创建重复节点:
创建失败
根据提示,在右侧编辑器补充代码,使用 UNION
查询西游
节点中的 孙悟空
和 唐僧
两个节点有关的信息,并且按 name
属性进行升序,查询每个节点的前 5 条数据。
平台会对你编写的代码进行测试:
测试输入:无
; 预期输出:
name, relation, to_name
"孙悟空", "师傅", "唐僧"
"孙悟空", "师弟", "沙僧"
"孙悟空", "义兄", "牛魔王"
"孙悟空", "义兄", "狮驼王"
"孙悟空", "义兄", "猕猴王"
"唐僧", "徒弟", "孙悟空"
"唐僧", "义兄", "李世民"
"唐僧", "母亲", "殷温娇"
"唐僧", "徒弟", "沙僧"
"唐僧", "师父", "法明和尚"
# 更新配置文件
source /etc/profile
# 启动 Neo4j
/opt/neo4j-community-3.5.35/bin/neo4j start
# 在创建唐僧关系链时,需要优先导入数据
cat /data/workspace/myshixun/step2/pro_xiyou.cypher | /opt/neo4j-community-3.5.35/bin/cypher-shell -u neo4j -p 123456 --format plain
# 清空测试文件
true > /data/workspace/myshixun/step3/work.txt
# 填入 Cypher 代码内容
vim /data/workspace/myshixun/step3/work.txt
//**************Begin*************************
// 使用 `UNION` 查询 `xiyouRelation` 节点中的 `孙悟空` 和 `唐僧` 两个节点有关的信息;
// 按 to 进行升序,查询每个节点的前 5 条数据。
match (n:xiyouRelation) where n.from = '孙悟空' return n.from as name, n.relation as relation, n.to as to_name order by n.to limit 5
union
match (n:xiyouRelation) where n.from = '唐僧' return n.from as name, n.relation as relation, n.to as to_name order by n.to limit 5
//**************End*************************