Loading

[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. 特点

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

4. 安装

  1. 上传 neo4j-community-3.5.17.tar 到 Liunx 下;
  2. 解压 tar -xzvf neo4j-community-3.5.17.tar
  3. 修改配置文件 vi conf/neo4j.conf,主要是修改“允许远程访问的地址”把对应的注释打开即可;
    dbms.connectors.default_listen_address=0.0.0.0
    
  4. 开放对应的访问端口,默认要开放 7474 和 7687;
    firewall-cmd --zone=public --add-port=7474/tcp --permanent
    firewall-cmd --zone=public --add-port=7687/tcp --permanent
    systemctl reload firewalld
    
  5. 启动 ./bin/neo4j start
  6. 使用浏览器访问 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 访问数据库。

posted @ 2022-07-09 16:32  tree6x7  阅读(195)  评论(0编辑  收藏  举报