[12] Neo4j
1. 简述
- 【图】图是最普遍的自然结构,是由顶点(Vertex)、边(Edge)和属性(Property)组成的,顶点也称作节点,边也称作关系,顶点和边可以设置属性,每个节点和关系都可以由一个或多个属性。
- 【图形数据库】也称为图形数据库管理系统(GDBMS),区别于关系型数据库(Oracle、MySQL),用于存储丰富的关系数据。图形数据库将结构化数据存储在图上而不是表中,是一个嵌入式的、基于磁盘的、具备完全事务特性的 Java 持久化引擎。
Neo4j 是一个开源的无 Shcema 的 基于 Java 开发的图形数据库,它将结构化数据存储在图中而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的 Java 持久化引擎。程序数据是在一个面向对象的、灵活的网络结构下,而不是严格、静态的表中,但可以享受到具备完全的事务特性、企业级的数据库的所有好处。
2. 模型
Neo4j 的主要构建块是:节点、关系、属性
Neo4j 将数据作为节点和关系存储,节点和关系都可以包含属性,属性是键值对的形式;关系连接节点,具有方向性:单向和双向。每个关系包含开始节点和结束节点。
每一个节点可以有一个或者多个文字描述,称为节点标签,具有同样标签的节点用一种专用的方式存储;
在 Neo4j 中,关系是有方向性的。如果我们尝试创建没有方向的关系,那么 Neo4j 会抛出一个错误消息:“关系应该是方向性的”。
Neo4j 是一个无架构数据库,在开始添加数据时,无需定义表和关系,也不需要任何额外的 RRBMS 数据库来存储 Neo4j 数据。使用查询语言 Neo4j CQL 就能够很好的操作数据。
- 【标签】在 Neo4j 中,一个节点可以有一个以上的标签(Label),从现实世界的角度去看,一个标签可以认为节点的某个类别,比如 Book、Movie 等等。标签是 Neo4j 图数据库的分类,搜索就是根据这个进行。
- 【节点】节点(Node) 是指一个实实在在的对象,这个对象可以有好多的标签(Label)表示对象的种类,也可以有好多的属性以描述其特征,节点与节点之间还可以形成多个有方向(或者没有方向)的关系。
- 【关系】用来描述节点与节点之间的关系(Relationship),这也是图数据与与普通数据库最大的区别,正是因为有这些关系的存在,才可以描述那些我们普通行列数据库所很难表示的网状关系,比如我们复杂的人际关系网,所谓的六度理论,就可以很方便的用图数据库进行模拟,比如我们大脑神经元之间的连接方式,都是一张复杂的网。
- 【属性(Property)】描述节点的特性,采用的是
Key-Value
结构,可以随意设定来描述节点的特征。
3. 特点
- 支持简单的查询语言 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 应用程序
4. 安装
- 上传 neo4j-community-3.5.17.tar 到 Liunx 下;
- 解压
tar -xzvf neo4j-community-3.5.17.tar
; - 修改配置文件 vi conf/neo4j.conf,主要是修改“允许远程访问的地址”把对应的注释打开即可;
dbms.connectors.default_listen_address=0.0.0.0
- 开放对应的访问端口,默认要开放 7474 和 7687;
firewall-cmd --zone=public --add-port=7474/tcp --permanent firewall-cmd --zone=public --add-port=7687/tcp --permanent systemctl reload firewalld
- 启动
./bin/neo4j start
; - 使用浏览器访问 http://192.168.211.133:7474,默认的账号密码是 neo4j/neo4j,第一次登录的话会要求修改密码。
5. 场景
(1)社交媒体和社交网络
当使用图形数据库为社交网络应用程序提供动力时,可以轻松利用社交关系或根据活动推断关系。
查询社区聚类分析,朋友的朋友推荐,影响者分析,共享和协作关系分析等
(2)推荐引擎和产品推荐系统
图形驱动的推荐引擎通过实时利用多种连接,帮助公司个性化产品,内容和服务。
内容和媒体推荐,图形辅助搜索引擎,产品推荐,专业网络,社会推荐。
(3)身份和访问管理
使用图形数据库进行身份和访问管理时,可以快速有效地跟踪用户,资产,关系和授权。
查询访问管理,资产来源,数据所有权,身份管理,互连组织,主数据,资源授权
(4)金融反欺诈多维关联分析场景
通过图分析可以清楚地知道洗钱网络及相关嫌疑,例如对用户所使用的帐号、发生交易时的 IP 地址、MAC 地址、手机 IMEI 号等进行关联分析。
6. 备份
(1)在对 Neo4j 数据进行备份、还原、迁移的操作时,首先要关闭 Neo4j:
./bin/neo4j stop
(2)数据备份到文件:
./bin/neo4j-admin dump --database=graph.db --to=/root/neo4j.dump
(3)还原、迁移之前关闭 neo4j 服务,操作同上:
./bin/neo4j-admin load --from=/root/neo4j.dump --database=graph.db --force
(4)重启服务
./bin/neo4j start
注意,运行数据备份可能会警告:WARNING: Max 1024 open fifiles allowed, minimum of 40000 recommended. See the Neo4j manual.
解决办法:编辑 /etc/security/limits.conf
,在文件最后加入下面这段 —— 修改最大打开文件限制
* soft nofile 65535
* hard nofile 65535
再次执行上面的步骤,警告就没有了。
7. 调优
(1)增加服务器内存和调整 Neo4j 配置文件
# java heap 初始值
dbms.memory.heap.initial_size=1g
# java heap 最大值,一般不要超过可用物理内存的80%
dbms.memory.heap.max_size=16g
# pagecache 大小,官方建议设为:(总内存-dbms.memory.heap.max_size)/2
dbms.memory.pagecache.size=2g
(2)Neo4j 刚启动数据是冷的需要预热
MATCH (n) OPTIONAL MATCH (n)-[r]->() RETURN count(n.name) + count(r);
(3)查看执行计划进行索引优化
Cypher查询计划程序将每个查询转换为执行计划。 执行计划告诉 Neo4j 在执行查询时要执行哪些操作。
对执行计划的生成,Neo4j使用的都是基于成本的优化器(Cost Based Optimizer,CBO),用于制订精确的执行过程。可以采用如下两种不同的方式了解其内部的工作机制:
- EXPLAIN:是解释机制,加入该关键字的Cypher语句可以预览执行的过程但并不实际执行,所以也不会产生任何结果。
- PROFILE:则是画像机制,查询中使用该关键字,不仅能够看到执行计划的详细内容,也可以看到查询的执行结果。
关注指标(两个值都是越小越好):
- estimated rows: 需要被扫描行数的预估值
- dbhits: 实际运行结果的命中绩效
8. 访问
Neo4j 访问的两种方式:嵌入式数据库、服务器模式(通过 REST 的访问)。
它是由应用程序的性质(Neo4j 是独立服务器还是和程序在一起)、性能、监控和数据安全性来决定架构选择。
An embedded database(嵌入式数据库)
嵌入式 Neo4j 数据库是性能的最佳选择。 通过指定数据存储的路径以编程方式访问嵌入式数据库。
我们选择嵌入式数据库出于以下原因:
- 使用Java作为我们项目的编程语言
- 应用程序是独立的
- 程序追求很高的性能
Neo4j Server(服务器模式)
Neo4j Server 是相互操作性,安全性和监控的最佳选择。 实际上,REST 接口允许所有现代平台和编程语言与它进行互操作。 此外,作为独立应用程序,它比嵌入式配置更安全(客户端中的潜在故障不会影响服务器),并且更易于监控。 如果我们选择使用这种模式,我们的应用程序将充当 Neo4j 服务器的客户端。要连接到 Neo4j 服务器,可以使用任何编程语言的 REST 访问数据库。