CQL 语法操作(头歌)

文章目录

  • 第1关:语句语法规范
    • 任务描述
    • 相关知识
      • 节点语法
      • 关系语法
      • 模式语法
      • 修改配置文件默认读取路径
    • 编程要求
    • 测试说明
    • 答案代码
      • 评测前的准备
      • Cypher 代码内容
  • 第2关:常用命令 一(CREATE、MATCH、RETURN、WHERE)
    • 任务描述
    • 相关知识
      • CREATE 创建
        • 创建节点
        • 创建关系
        • 创建全路径
      • MATCH 查询
      • RETURN 返回
      • WHERE 子句
    • 编程要求
    • 测试说明
    • 答案代码
      • 评测前的准备
      • Cypher 代码内容
  • 第3关:常用命令 二(节点操作、查询子句、索引)
    • 任务描述
    • 相关知识
      • 节点操作
        • DELETE 删除
        • REMOVE 删除
        • SET 子句
        • NULL 值
      • 查询子句
        • ORDER BY 排序
        • UNION 子句
        • LIMIT 和 SKIP 子句
        • IN 操作符
        • DISTINCT
      • 索引
        • INDEX 索引
        • Neo4J索引操作
        • UNIQUE 约束
    • 编程要求
    • 测试说明
    • 答案代码
      • 评测前的准备
      • Cypher 代码内容

第1关:语句语法规范

任务描述

本关任务:完成一个简单的关系查询语句。

相关知识

为了完成本关任务,你需要掌握:

  1. 节点语法;
  2. 关系语法;
  3. 模式语法。

节点语法

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

CQL 语法操作(头歌)_第1张图片

查询结果

关系语法

Cypher 使用一对短横线(即“–”)表示:一个无方向关系。有方向的关系在其中一端加上一个箭头(即“<–”或“–>”)。方括号表达式 […] 可用于添加关系信息。里面可以包含变量、属性和或者类型信息。关系的常见表达方式如下:

// 无方向关系
--
// 有方向关系,指向一个节点
-->
// 有方向的关系,关系变量为 reole
-[role]->
// 有方向的关系,关系标签为 ACTED_IN
-[:ACTED_IN]->
// 有方向的关系,关系标签为 ACTED_IN,关系变量为 role
-[role:ACTED_IN]->
// 有方向的关系,关系标签为 ACTED_IN,关系变量为 role,属性 roles 的值为 Neo
-[role:ACTED_IN {roles: ["Neo"]}]->

CQL 语法操作(头歌)_第2张图片

查询结果

模式语法

// 电影 “The Matrix” 和 “Keanu Reeves” 的关系
match (keanu:Person {name: "Keanu Reeves"})-[role:ACTED_IN {roles: ["Neo"]}]->(matrix:Movie {title: "The Matrix"}) return keanu,matrix

CQL 语法操作(头歌)_第3张图片

查询结果

修改配置文件默认读取路径

Neo4j 默认是从安装目录下的 import 目录下读取数据。 如果想从其他数据读取数据,需要修改配置文件 /opt/neo4j-community-3.5.35/conf/neo4j.conf

将下面的语句改成这样,添加一个注释符号: #dbms.directories.import=import 保存并退出即可。

CQL 语法操作(头歌)_第4张图片

配置信息

编程要求

根据提示,在右侧编辑器补充代码,查询跟孙悟空有关系的人。 评测前的准备:

  • 更新配置文件: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

数据标签: 节点标签为:person,属性为:name; 关系标签为:rel

注意: 在代码文件中填入 Cypher 代码。 点击左上角代码文件切换:

CQL 语法操作(头歌)_第5张图片

切换窗口

测试说明

平台会对你编写的代码进行测试:

测试输入:

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

Cypher 代码内容

//**************Begin************************* 

// 查询跟孙悟空有关系的人
match (n:person{name:"孙悟空"})-[r:rel]->(m) return n,r,m


//**************End************************* 

第2关:常用命令 一(CREATE、MATCH、RETURN、WHERE)

任务描述

本关任务:创建一个简单的关系节点,编写查询节点脚本。

相关知识

为了完成本关任务,你需要掌握:

  1. CREATE 创建;
  2. MATCH 查询;
  3. RETURN 返回;
  4. WHERE 子句。

CREATE 创建

create 语句是创建模型语句用来创建数据模型。

创建节点
// 创建简单节点
create (n)
// 创建多个节点
create (n),(m)
// 创建带标签和属性的节点并返回节点
create (n:person {name:"如来"}) return n

CQL 语法操作(头歌)_第6张图片

创建节点

创建关系

Neo4j 图数据库遵循属性图模型来存储和管理其数据。 根据属性图模型,关系应该是定向的。 否则,Neo4j 将抛出一个错误消息。 基于方向性,Neo4j 关系被分为两种主要类型。

  • 单向关系
  • 双向关系

使用新节点创建关系

CREATE (n:person {name:'杨戬'})-[r:师傅]->(m:person {name:'玉鼎真人'}) return type(r)

CQL 语法操作(头歌)_第7张图片

创建关系

使用已知节点创建带属性的关系

match (n:person {name:'沙僧'}),(m:person{name:'唐僧'}) create (n)-[r:`师傅`{relation:'师傅'}]->(m) return r

CQL 语法操作(头歌)_第8张图片

创建带属性的关系

检索关系节点的详细信息

match (n:person)-[r]-(m:person) return n,m

CQL 语法操作(头歌)_第9张图片

详细信息

创建全路径
create p=(:person{name:'蛟魔王'})-[:义兄]->(:person{name:'牛魔王'})<-[:义兄]- (:person {name:'鹏魔王'}) return p

CQL 语法操作(头歌)_第10张图片

创建全路径

MATCH 查询

Neo4j CQL MATCH 命令用于

  • 从数据库获取有关节点和属性的数据;
  • 从数据库获取有关节点,关系和属性的数据。
MATCH (n:`person`) RETURN n LIMIT 25

CQL 语法操作(头歌)_第11张图片

查询 person

RETURN 返回

Neo4j CQL RETURN 子句用于

  • 检索节点的某些属性
  • 检索节点的所有属性
  • 检索节点和关联关系的某些属性
  • 检索节点和关联关系的所有属性

注意:RETURNMATCH 两个需要搭配使用。

WHERE 子句

像 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

编程要求

根据提示:

  1. 在右侧编辑器补充代码,查询贾宝玉奴仆的结构表(查询前 5 个);

注意: 数据会在评测时创建。 2. 在图形界面中使用 Neo4j 创建唐僧的关系链。

CQL 语法操作(头歌)_第12张图片

唐僧关系链

注意: 在创建唐僧关系链时,需要优先导入数据: 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 为:xiyouRelationpersonRelationship types 为:西游人物关系

红楼梦标签设置为: Node labels 为:honlouRelationpersonRelationship types 为:红楼梦关系

CQL 语法操作(头歌)_第13张图片

节点标签 关系类型

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

Cypher 代码内容

//**************Begin************************* 
// 查询贾宝玉奴仆的结构表(查询前 5 个)
MATCH (r:honlouRelation) where r.to = '贾宝玉' and r.relation = '奴仆' RETURN r.from as 仆人, r.relation as 关系, r.to as 主人 LIMIT 5;
//**************End************************* 

第3关:常用命令 二(节点操作、查询子句、索引)

任务描述

本关任务:通过本关卡的学习,完成后面的操作。

相关知识

为了完成本关任务,你需要掌握:

  1. 节点操作;
  2. 查询子句;
  3. 索引。

节点操作

DELETE 删除
  • 删除节点;

  • 删除节点及相关节点和关系。

    # 删除节点(前提:节点不存在关系)
    MATCH (n:person {name:"白龙马"}) delete n;
    # 删除关系
    MATCH (n:person {name:"沙僧"})<-[r]-(m) delete r return type(r);
    

CQL 语法操作(头歌)_第14张图片

删除失败

因为孙悟空已经被建立关系,所以删除不了这个节点,需要优先将关系删除。

REMOVE 删除

有时基于客户端要求,我们需要向现有节点或关系添加或删除属性。我们使用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
SET 子句

有时,根据我们的客户端要求,我们需要向现有节点或关系添加新属性。要做到这一点,Neo4j CQL 提供了一个SET子句。

  • 向现有节点或关系添加新属性;
  • 添加或更新属性值。 MATCH (n:role {name:"cat"}) set n.age=32 return n
NULL 值

Neo4j CQL将空值视为对节点或关系的属性的缺失值或未定义值。

当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有NULL属性值的新节点。

// 查询是否为空
match (n:`西游`) where n.label is null return id(n),n.name,n.tail,n.label

查询子句

ORDER BY 排序

Neo4j CQL 在 MATCH 命令中提供了 ORDER BY 子句,对 MATCH 查询返回的结果进行排序。 我们可以按升序或降序对行进行排序。默认情况下,它按升序对行进行排序。 如果我们要按降序对它们进行排序,我们需要使用 DESC 子句。

// 按 id 进行降序
MATCH (n:`西游`) RETURN id(n),n.name order by id(n) desc
UNION 子句

与 SQL 一样,Neo4j CQL 有两个子句,将两个不同的结果合并成一组结果。

  • UNION

它将两组结果中的公共行组合并返回到一组结果中。它不从两个节点返回重复的行。

**限制:**结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。

  • UNION ALL

它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。

限制: 结果列类型,并从两个结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的。

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
LIMIT 和 SKIP 子句

Neo4j CQL 已提供 LIMIT 子句和 SKIP 来过滤或限制查询返回的行数。 LIMIT 返回前几行,SKIP 忽略前几行。

// 前两行 
MATCH (n:`西游`) RETURN n LIMIT 2 
// 忽略前两行 
MATCH (n:person) RETURN n SKIP 2
IN 操作符

与 SQL 一样,Neo4j CQL 提供了一个 IN 运算符,以便为 CQL 命令提供值的集合。

// 查询 西游 标签中姓名为孙悟空和唐僧的节点
match (n:`西游`) where n.name in['孙悟空','唐僧'] return id(n),n.name,n.tail,n.label
DISTINCT

这个函数的用法就像 SQL 中的 distinct 关键字,返回的是所有不同值。

// 去除重复的节点数据
match (n:`西游`) return distinct(n.name)

索引

INDEX 索引

Neo4j SQL 支持节点或关系属性上的索引,以提高应用程序的性能。

我们可以为具有相同标签名称的所有节点的属性创建索引。

我们可以在 MATCH 或 WHERE 或 IN 运算符上使用这些索引列来改进 CQL Command 的执行。

Neo4J索引操作
  • Create Index 创建索引

  • Drop Index 丢弃索引

  // 创建索引 
  create index on :`西游` (name) 
  // 删除索引 
  drop index on :`西游` (name)
UNIQUE 约束

在 Neo4j 数据库中,CQL CREATE 命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。 根据我们对某些节点或关系的应用需求,我们必须避免这种重复。

像 SQL 一样,Neo4j 数据库也支持对 NODE 或 Relationship 的属性的 UNIQUE 约束。

创建重复节点:

CQL 语法操作(头歌)_第15张图片

创建失败

编程要求

根据提示,在右侧编辑器补充代码,使用 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

Cypher 代码内容

//**************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************************* 

你可能感兴趣的:(nosql,neo4j,大数据,nosql数据库)