CDC

Place to Be & Show Yourself

Neo4j介绍

1. 介绍

1.1 图数据库

图模型

目前使用的图模型有3种,分别是属性图(Property Graph)、资源描述框架(RDF)三元组和超图(HyperGraph)。现在较为知名的图数据库主要是基于属性图,更确切得说是带标签的属性图(Labeled-Property Graph),当然标签不是必须的。

是带标签的属性图有如下特征:
* 包含节点和联系
* 节点上有属性(键值对)
* 节点可以有一个或多个标签
* 联系(边)有名字和方向,并总是有一个开始节点和结束节点
* 联系(边)也可以有属性

图领域

可以分为:
* 主要用于联机事物图的持久化技术,通常直接实时被应用程序访问 — 这类技术被称为图数据库
* 主要用于离线图分析的技术,通常按一系列步骤执行 — 这类技术被称为计算引擎,常用于数据挖掘和联机分析处理

图数据库

是一个使用图结构进行语义查询的数据库,支持对图数据模型的增删改查(CRUD), 在设计时通常考虑了事务完整性和操作可用性。
图数据库将将节点和联系对简单抽象组装为相互关联的结构,使我们能够建造任意复杂的模型。

图数据库有两个技术特性:
* 图存储引擎:一些图数据库使用原生图存储,另外一些则把图数据库信息保存到关系型数据库中(例如MySQL)或其他数据库中
* 处理引擎:主要指的是通过各种图算法解决大规模分布式图计算问题。大部分的分布式图计算引擎都是基于Google发布的Pregel白皮书
图本质上是一种递归的数据结构,其顶点的属性值依赖于其邻接顶点,而其邻接顶点属性又依赖于其邻接顶点,许多重要的图算法通过迭代计算每个顶点的属性直到到达定点条件,这些迭代的图算法被抽象成一系列图并行操作。
大部分图数据库使用 免索引邻接: 每个节点包括它所有边Edge的指针列表,因此避免了查找。

对比

与其他类型数据库对比:
* 关系型数据库不擅长处理数据之间的关系(存储关系方法与图数据库不一样,参见上面的免索引邻接说明)。
联系仅出现在关系数据库的建模阶段,用于连接表关系;
传统数据库处理join 查询的性能会随着数据集的扩大而降低; 数据增加后会造成大量表连接、稀疏行和非空检查逻辑,阻碍性能;
难以响应变化的业务需求。

  • 与NoSQL数据库对比
    存储的都是无关联的文档/值/列,很难用于关联数据和图;
    一种添加联系的策略是在某个聚合数据中嵌入另外一个聚合数据标识符,即添加外键,但这需要在应用层连接聚合数据,代价增加;
    聚合没有反向指针,丧失了其他有趣查询能力,例如反向查询关系。

  • 在图数据库中,关联数据被存储为关联数据。增加新的节点或联系不影响已有的网络,也不用进行数据迁移 – 原始数据和其意图都保持不变。

  • 附各种NoSQL特性对比:

分类 数据模型 优势 劣势 举例
键值数据库 哈希表 查找速度快 数据无结构化,通常只被当作字符串或者二进制数据 Redis
列存储数据库 列式数据存储 查找速度快;支持分布横向扩展;数据压缩率高 功能相对受限 HBase
文档型数据库 键值对扩展 数据结构要求不严格;表结构可变;不需要预先定义表结构 查询性能不高,缺乏统一的查询语法 MongoDB
图数据库 节点和关系组成的图 利用图结构相关算法(最短路径、节点度关系查找等) 可能需要对整个图做计算,不利于图数据分布存储 Neo4j、JanusGraph

优势

  • 灵活性: 图的扩展只要增加新的联系、新的节点、新的属性、新的标签、新的子图而不会破坏已有的查询和应用程序功能。
    可以减少数据迁移,从而降低维护的开销和风险。

  • 敏捷性: 由于图数据库天生不需要模式,所以可以用更可见、可操作的管理方式。

1.2 建模

和基于关系的建模方式对比

建模过程类似:
* 先建立实体-联系(ER)图
* 然后把角色变成标签,特性变成属性
* 与邻近实体的关系转换为联系
* 为支持快速查找节点,允许用标签和属性组合创建索引,索引是唯一的
* 标签是属性图中的一等公民。

怎么时候使用节点,怎么时候使用联系

  • 用节点表示事务,用联系表示结构
  • 使用节点表示实体,即我们感兴趣的事物,它们可以被标签和分组。
  • 使用联系表示节点间的关联,并为每个实体建立语义上下文,从而建立领域
  • 使用有向联系进一步阐明语义联系。属性图中常存在有向联系,原因是联系的不对称性。如果是对称联系应使用一个联系,查询时忽略方向。
  • 使用节点属性以及其他任何必要的实体元数据,例如版本号、时间戳等等,来表示实体的属性。
  • 使用联系属性以及任何必要的关系元数据,如时间戳、版本号等等,来表达联系的强度、权重、质量。

建模陷阱

  1. 电子邮件例子
    邮件中收件人、cc、bcc是联系吗?邮件正文存哪里?
    解决方法除了联系人节点外,另外建立一个email节点。

  2. 当有回复或转发时
    回复邮件也是新邮件节点,它与原来的邮件节点有replay联系

  3. 避免反模式
    实体不能建模为联系
    应该使用联系表示实体是如何相连的,及这些联系的性质

2. 安装

这里使用 docker 方式运行:

docker方式运行时相关目录:
* /conf
* /data
* /import
* /logs
* /metrics
* /plugins
* /ssl

运行,并且允许ipv4 https访问(必须设置NEO4J_dbms_connectors_default__listen__address 要不默认是ipv6):

通过cyper shell执行命令:(auth info: neo4j/neofj)

通过web访问(169.254.0.1 is neo4j’s host IPv4 address):

web 是它的控制界面,在web上面可以执行 cyper shell 指令,可以查看 neo4j 状态
最上面是cyper shell 命令行, 中间是数据库状态,下面是一些常用命令链接:
* “Start Learning”: neo4j简单介绍
* “Write Code”: 几个图数据库例子代码, 双击代码, 会自动复制代码到上面的 cyper shell, 然后点 cyper shell 右边的运行(三角形按钮),就可以执行
中间就会显示结果
* “Monitor”: 系统状态

3. 使用

桌面版的 neo4j只支持一个数据库。 如果想清除当前数据库,在 web 左边有 “Clear local data”, 或是执行:

CyperSQL语法:

清除数据库

查询数据库(RETURN)

MATCH 表示查询条件
RETURN 表示返回的内容
还可以像 SQL 那样加 WHERE

CREATE

create用于创建节点或是联系,创建时指定名字:标签{属性} 标签可以有多个,之间使用:隔开,每个标签也可以也多个属性,都放在{} 内 联系的名字可以省略,联系的两个节点间有方向

建立节点:

建立节点和边:

DELETE

用于删除节点或联系

删除联系:

删除没有联系的节点:

删除节点和它所有相关的联系:

REMOVE

删除节点或联系的属性或标签

SET

向现有节点或联系添加新属性, 或修改属性值

点赞

发表评论

电子邮件地址不会被公开。