图数据库neo4j的基本使用

认识图数据库

什么是neo4j图数据库

随着技术的发展,我们对数据的需求已经不再局限于对数据本身的获取了,我们还需要获取数据与数据间的关系(也就是连接数据)。

简单地说,我们可以说图数据库主要用于存储更多的连接数据(因为图结构相比其他数据结构而言,能保存更多的数据间的关系)。

如果我们使用 RDBMS 数据库来存储更多连接的数据,那么它们不能提供用于遍历大量数据的适当性能。 在这些情况下,Graph Database 提高了应用程序性能。

如今,大多数社交网络应用程序(如Facebook,Google +,LinkedIn,Twitter,Yammer 等)和视频托管应用程序(如 Google YouTube,Flickr,Yahoo Video等)都在使用更多连接的数据。

Neo4j属性图数据模型

Neo4j图数据库遵循属性图模型来存储和管理其数据。

属性图模型规则

  • 表示节点,关系和属性中的数据
  • 节点和关系都包含属性
  • 关系连接节点
  • 属性是键值对
  • 节点用圆圈表示,关系用方向键表示。
  • 关系具有方向:单向和双向。
  • 每个关系包含“开始节点”或“从节点”和“到节点”或“结束节点”

在属性图数据模型中,关系应该是定向的。如果我们尝试创建没有方向的关系,那么它将抛出一个错误消息。

在Neo4j中,关系也应该是有方向性的。如果我们尝试创建没有方向的关系,那么Neo4j会抛出一个错误消息,“关系应该是方向性的”。

Neo4j图数据库将其所有数据存储在节点和关系中。我们不需要任何额外的RDBMS数据库或无SQL数据库来存储Neo4j数据库数据。

图形数据库数据模型的主要构建块是:

  • 节点
  • 关系
  • 属性

简单的属性图的例子

属性图的例子

这里我们使用圆圈表示节点。 使用箭头的关系。 关系是有方向性的。 我们可以用Properties(键值对)来表示Node的数据。 在这个例子中,我们在Node的Circle中表示了每个Node的Id属性。

Neo4j的特点

  • SQL就像简单的查询语言Neo4j CQL
  • 它遵循属性图数据模型
  • 它通过使用Apache Lucence支持索引
  • 它支持UNIQUE约束
  • 它包含一个用于执行CQL命令的UI:Neo4j数据浏览器
  • 它支持完整的ACID(原子性,一致性,隔离性和持久性)规则
  • 它采用原生图形库与本地GPE(图形处理引擎)
  • 它支持查询的数据导出到JSON和XLS格式
  • 它提供了REST API,可以被任何编程语言(如Java,Spring,Scala等)访问
  • 它提供了可以通过任何UI MVC框架(如Node JS)访问的Java脚本
  • 它支持两种Java API:Cypher API和Native Java API来开发Java应用程序

Neo4j的优点

  • 它很容易表示连接的数据
  • 检索/遍历/导航更多的连接数据是非常容易和快速的
  • 它非常容易地表示半结构化数据
  • Neo4j CQL查询语言命令是人性化的可读格式,非常容易学习
  • 使用简单而强大的数据模型
  • 它不需要复杂的连接来检索连接的/相关的数据,因为它很容易检索它的相邻节点或关系细节没有连接或索引

Neo4j的缺点或限制

  • AS的Neo4j 2.1.3最新版本,它具有支持节点数,关系和属性的限制。
  • 它不支持Sharding。

Neo4j的基本使用

说到Neo4j的基本使用的话,就离不开CQL(Cypher查询语言), 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言。

什么是CQL

  • 它是Neo4j图形数据库的查询语言。
  • 它是一种声明性模式匹配语言
  • 它遵循SQL语法。
  • 它的语法是非常简单且人性化、可读的格式。

常用的CQL命令

CQL命令用法
CREATE 创建创建节点,关系和属性
MATCH 匹配检索有关节点,关系和属性数据
RETURN 返回返回查询结果
WHERE 哪里提供条件过滤检索数据
DELETE 删除删除节点和关系
REMOVE 移除删除节点和关系的属性
ORDER BY以…排序排序检索数据
SET 组添加或更新标签

常用的CQL函数

定制列表功能用法
String 字符串它们用于使用String字面量。
Aggregation 聚合它们用于对CQL查询结果执行一些聚合操作。
Relationship 关系他们用于获取关系的细节,如startnode,endnode等。

Neo4j CQL数据类型

Neo4j CQL支持以下数据类型:

CQL数据类型用法
boolean用于表示布尔文字:true,false。
byte用于表示8位整数。
short用于表示16位整数。
int用于表示32位整数。
long用于表示64位整数。
floatI用于表示32位浮点数。
double用于表示64位浮点数。
char用于表示16位字符。
String用于表示字符串。

CQL的使用示例

CREATE命令(新增)

创建没有属性的节点

下面我们创建一个叫做teacher的Teacher标签类型的节点

Create (teacher:Teacher)

image-20230531225614567

下面我们创建一个多标签的节点create (man:Sing:Jump:BasketBall {name: "坤"}) return man

image-20230531232253712

创建具有属性的节点

下面我们创建一个带有属性的节点: create (teacher:Teacher {name: "张志红", somatotype: "strong"})

image-20230531230307877

创建具有关系的节点

下面我们创建一个带有关系的节点,可达鸭要去唐老师课堂上听课

create(student:Student {name: "可达鸭"})-[hc:HaveClass] -> (teacher:Teacher {name: "唐老鸭"}) return student

image-20230531233015784

MATCH命令(查询)

我们可以使用match命令查询刚刚新增的张志红老师match(teacher:Teacher) where teacher.name = "张志红" return teacher

**注:**match命令需要和return命令一起使用不然会提示错误

image-20230531230850060

我们也可以使用命令检索出他们的属性match(teacher:Teacher) where teacher.name = "张志红" return teacher.name, teacher.somatotype

image-20230531231541078

WHERE命令(条件)

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命令我们可以做很多操作

例如:过滤特定属性的节点数据,以及给已经新增的的节点添加关系

DELETE命令(删除)

删除节点。

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

现在我们就使用delete命令删除节点

  1. 我们可以先查询一下看看我们将要删除的数据 match(n:Teacher) return n

image-20230531234723653

  1. 现在我们使用命令删除这些节点(叮叮车的这些节点就是Teacher标签的数据)match(n:Teacher) delete n

image-20230531234912835

  1. 看图1我们知道有些节点拥有关系,控制台告诉我们不能删除,所以需要将关系先删除match(n:Teacher) - [r] -() delete r

image-20230531235505723

  1. 现在我们执行删除命令match(n:Teacher) delete n

image-20230531235607648

REMOVE命令(删除)

删除节点或关系的标签

删除节点或关系的属性

首先我们创建测试数据create(man:Sing:Jump:BasketBall {time: "两年半", hairstyle: "中分", job: "内娱"})

image-20230601000315660

我们查询出数据有很个标签match(n:Sing) where ID(n) = 4 return n

image-20230601001002722

删除节点或者关系的标签

现在删除打篮球的标签,因为发现“cai”打篮球并不是他的特长match(n:Sing) where ID(n) = 4 remove n:BasketBall

image-20230601001248628

删除节点或关系的属性

现在删除hairstyle属性,没有什么原因match(n:Sing) where ID(n) = 4 remove n.hairstyle

image-20230601001529464

SET命令(设置)

向现有节点或关系添加新属性

添加或更新属性值

  1. 我们创建一个节点 create(book:Book {name: "完美世界"}) return book

image-20230601002128816

  1. 现在我们给他加上一个作者的属性 match(book:Book) where book.name = "完美世界" set book.author = "辰东" return book

image-20230601002331589

ORDER BY(排序)
  1. 我们对数据进行升序查询 match(n:Book) return n.author, n.name order by n.name asc

image-20230601153343130

  1. 我们对数据进行降序查询 match(n:Book) return n.author, n.name order by n.name desc

image-20230601153405734

UNION和UNION ALL(合并)

union:将两个查询语句的数据合并,会去重复

union all:将两个查询语句的数据合并,但不会去重

  1. 使用union进行数据合并 match(b:Book) return b.author as person, b.name as name union match(m:Movie) return m.protagonist as person, m.name as name

image-20230601154230380

  1. 使用union all进行数据合并 match(b:Book) return b.author as person, b.name as name union all match(m:Movie) return m.protagonist as person, m.name as name

image-20230601154332379

LIMIT和SKIP子句(可以用来分页查询)

limit 就类似与我们MySQL的limit,就是返回数据

skip 就类似与我们MySQL的offset,就是偏移量

下面我们就查询第二条数据开始的两条数据 match(b:Book) return b.author as person skip 1 limit 2

image-20230601155246710

MERGE命令

只有在新增的数据不存在的时候,才能新增进去

  1. 我们先查询出所有数据 MATCH (n:Book) RETURN n LIMIT 25

image-20230601155744293

  1. 此时我们使用merge命令新增数据 merge(book:Book {author: "辰东", name: "完美世界"}) return book

image-20230601155839433

  1. 使用第一步的命令再次查询,发现数据并没有新增

image-20230601155907741

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐