NoSQL DB 系列解读:一文看懂 Neo4j – Graph DB

2021-12-27 00:00:00 数据 节点 用于 关系 属性
【导读】本文介绍了Neo4j 的数据模型结构、数据操作类型、遍历算法、逻辑架构、集群架构、适用场景,能够帮助读者快速了解Neo4j

【作者】赵海


1. Neo4j 是什么?

按照官方的解释,Neo4j是一个用Java开发的图形数据库。属于NoSQL数据库成员。

那么首先我们需要明白什么是图?什么是图形数据库?

“ A graph is a pictorial representation of a set of objects where some pairs of objects are connected by links. It is composed of two elements - nodes (vertices) and relationships (edges). Graph database is a database used to model the data in the form of graph. In here, the nodes of a graph depict the entities while the relationships depict the association of these nodes. ”

以上是我们摘自相关文献的内容,从这个解释当中我们可以看到,所谓的图是指一组相互可以联系的对象的组合,这些对象的基本元素包含两个:节点和关系,节点就是对象本身,关系就是相互的联系。那么图形数据库就是来解决这类数据对象存和取的特殊数据库。

Neo4j是DB engine 上排名首位的图形数据库代表。

从2010 Neo4j1.0到目前的Neo4j4.2版本,官方已经发布了300多个版本。


2. Neo4j 的数据模型结构

图DB数据模型主要用来描述图形对象和对象之间的关系,如果对于现实世界当中的对象,我们用节点来表示,那么对象与对象之间的关系就用边来表示,如图2.1所示。

图2.1 数据建模图

直观看图2.1,其实我们通过这类模型表示出来的结构,大的目的就是想要弄清A、B、C、D四个节点之间的关系。为了完成这个目的,以上数据建模当中有三个必不可少的因素:

(1 ). 节点:节点在Neo4j当中是一个指向联系和属性的单向链表,这个链表是固定大小;包含是否被使用的标志位,关联到这个节点的个关系的ID,个属性ID,节点的标签及指针,保留位。

( 2). 属性:也是固定大小链表,每个属性记录包括4个属性块和指向属性链中下一个属性的ID。属性记录包括属性类型和指向属性索引文件的指针。同时属性记录中可以内联动态存储,在属性值存储占用小时,会直接存储在属性记录中,对于大属性值,可以分别存储在动态字符存储和动态数组存储中。

( 3). 关系:双向链表,这个链表也是固定大小;包含是否被使用的标志位,起始节点的ID,结束节点的ID,关系类型,起始节点的上下联系和结束节点的上下节点,以及一个指示当前记录是否位于联系链的前面。需要强调的一点是关系必须有方向,也就是说有起点、终点。

总结来看,在图数据库的数据结构当中,重要的节点和关系两个元素保存的基本是固定大小的元数据信息或者说指针信息,如果属性信息较大,那么真正的数据是在Dynamic Store数据结构当中。我们可以通过以下的例子来诠释在Neo4j当中如何去创建这些数据结构。

CREATE (sally:Person { name: 'Sally', age: 32 })

CREATE (john:Person { name: 'John', age: 27 })

CREATE (sally)-[:FRIEND_OF { since: 1357718400 }]->(john)

以上例子当中,我们创建了两个以人为对象的节点以及这两个节点自建的关系 FRIEND_OF 。当然在这里面其节点里面的属性非常简单,仅仅包含姓名、年龄的键值对。实际上它支持“ bool 、 byte 、 short 、 int 、 log 、 float 、 double 、 char 、 string ”等很多种数据类型。具体实践可以参考Neo4j的命令CQL指南。


3. Neo4j 的数据操作类型

CQL代表Cypher查询语言。像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言。在Neo4j数据库当中,我们可以实现的具体数据存取操作很简单,主要包括两类:

1). 创建、删除、修改数据对象,包括节点、属性和关系。

2). 查询数据,包括对节点、关系本身的检索,检索本身支持匹配以及条件匹配等。

表3.1表示的是CQL语言可以实现的具体操作类型以及可以实现的详细功能描述:

表3.1 Neo4j数据操作类型

CQL 命令命令具体实现功能
CREATE创建节点,关系和属性
MATCH检索有关节点,关系和属性数据
RETURN返回查询结果
WHERE提供条件过滤检索数据
DELETE删除节点和关系
REMOVE删除节点和关系的属性
ORDERBY排序检索数据
SET添加或更新标签

详细的语法我们就不在本文详述,大家可以查询CQL语言的指南手册。为了更好的理解CQL语言的具体操作功能,我们通过以下例子来展示一个具体场景。例子当中:有客户(cust)、信用卡(cc)两类节点,节点当中具有ID、Price、Shopdate等属性信息。我们查询节点信息,建立消费的关系。

MATCH (cust:Customer),(cc:CreditCard)

WHERE cust.id = "1001" AND cc.id= "5001"

CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/1 0 /20 20 ",price:5000}]->(cc)

RETURN r

例子当中,我们通过以“客户ID=1001&信用卡ID=5001”为条件,检索到相应客户及信用卡的节点信息,并且建立了从客户到其信用卡的消费记录关系。


4. Neo4j 的遍历算法

图形数据库对于关系问题的解决比较擅长多对多关系的处理。之所以它能够擅长于各种基于图的业务场景的检索处理,就在于其强大的遍历算法。常见遍历算法有15种,我们通过它的定义(What)和如何使用(How)两个方面来进行简单总结:

1.广度优先算法(BFS)

What:遍历树数据结构,探索近的邻居和他们的次级邻居。它用于定位连接,是许多其他图算法的前身。当树较不平衡或目标更接近起点时,BFS是。它也可用于查找节点之间的短路径或避免深度优先搜索的递归过程。

How:广度优先搜索可用于对等网络中的邻居节点,可定位附近的位置,社交网络服务可在特定距离内查找对象。

2.深度优先算法(DFS)

What:遍历树数据结构,通过在回溯之前尽可能探索每个分支。用于深层次的数据,是许多其他图算法的前身。当树较平衡或目标更接近端点时,深度优先搜索是。

How:深度优先算法通常用于游戏模拟,其中每个选择或动作引发另一个操作,从而扩展成可能性的树形图。它将遍历选择树,直到找到佳解决方案路径。

3.单源短路径

What:计算节点与所有其他节点之间的路径,以及其与所有其他节点的总和值(成本,距离,时间或容量等关系的权重)并得出总和小。

How:单源短路径通常用于自动获取物理位置之间的路线,例如通过Google地图获取驾车路线。在逻辑路由中也很重要,例如电话呼叫路由(低成本路由)。

4.全源短路径

What:计算包含图中节点之间所有短路径的短路径森林(组)。当短路径被阻塞或变得次优时,切换到新的短路径,通常用于备用路由。

How:用于评估备用路由,例如高速公路备份或网络容量。它也是为逻辑路由提供多路径的关键,比如呼叫路由选择。

5.小生成树(MWST)

What:计算与访问树中所有节点相关的小值的路径,用于逼近一些NP难题。

How:小生成树广泛用于网络设计:成本低的逻辑或物理路由,如铺设电缆,快的垃圾收集路线,供水系统容量,高效电路设计等等。它还可用于滚动优化的实时应用程序,如化学炼油厂的过程或行驶路线修正。

6.PageRank

What:估计当前节点对其相邻节点的重要性,然后再从其邻居那里获得节点的重要性。一个节点的排名来源于其传递链接的数量和质量。

How:PageRank用于评估重要性和影响力,用于机器学习,以确定有影响的提取特征。在生物学中,它被用来识别食物网中哪些物种的灭绝会导致物种死亡的大连锁反应。

7.Degree Centrality

What:测量节点(或整个图表)所具有的关系数量,被分为流入和流出两个方向,关系具有指向性。

How:Degree Centrality着眼于用途的直接连通性,例如评估患者接近病毒或听取信息的近期风险。在社会研究中,可以用来预估人气或者其它情感。

8.Closeness Centrality

What:衡量一个节点对其集群内所有邻居的集中程度。假定到所有其他节点的路径都是短的,那么该节点就能够以快的速度到达整个组。

How:Closeness Centrality适用于多种资源、交流和行为分析,尤其是当交互速度显着时。在新公共服务中,被用于确定大可访问性的位置。在社交网络分析中,用于找到具有理想社交网络位置的人,以便更快地传播信息。

9.Betweenness Centrality

What:测量通过节点的短路径的数量。它通常与控制资源和信息的流动有关。

How:Betweenness Centrality适用于网络科学中的各种问题,用于查明通信和交通网络中的瓶颈或可能的攻击目标。在基因组学中,被用于了解控制某些基因在蛋白质网络中的改进。也被用来评估多人在线游戏玩家和共享医师专业知识的信息流。

10.Label Propagation

What:基于邻域多数的标签作为推断集群的手段。这种极其快速的图形分割需要很少的先验信息。

How:Label Propagation具有不同的应用,例如了解社会团体中的共识形成、识别在生物网络的过程(功能模块)中所涉及的蛋白质集合等等。甚至还可以用于半监督和无监督的机器学习作为初始的预处理步骤。

11.Strongly Connected

What:定位节点组,其中每个节点可从同一组中的所有其他节点按照关系的方向到达。

How:Strongly Connected通常用于在识别的集群上独立运行其他算法。作为有向图的预处理步骤,它有助于快速识别不连通的集群。在零售推荐中,它有助于识别具有强亲和性的组,然后将向那些尚未购买商品的群体推荐商品。

12.Union-Find/Connected Components/Weakly Connected

What:查找节点组,其中每个节点可从同一组中的任何其他节点到达,而不考虑关系的方向。它提供几乎恒定的时间操作来添加新的组,合并现有的组,并确定两个节点是否在同一组中。

How:Union-find/connected 经常与其他算法结合使用,特别是对于高性能分组。作为无向图的预处理步骤,它有助于快速识别断开的组。

13.Louvain Modularity

What:通过比较它的关系密度与适当定义的随机网络来测量社团分组的质量(即假定的准确性)。

How:它通常用于评估复杂网络的组织和社区层次结构。这对于无监督机器学习中的初始数据预处理也是有用的。Louvain用于评估一个组织是只存在一些不良行为,还是背后一个连环欺诈。

14.Local Clustering Coefficient/Node Clustering Coefficient

What:对于一个特定的节点,量化了其到邻居节点的距离。

How:Local cluster coefficient通过理解群体相关性或碎片化的可能性,对估计弹性具有重要意义。用这种方法对欧洲电网的分析发现,与稀疏连接的节点相比,集群更能抵御普遍的故障。

15.Triangle-Count and Average Clustering Coefficient

What:测量有多少节点具有三角形以及节点倾向于聚集在一起的程度。平均聚类系数为1时表明有一个分组,0时没有连接。为使聚类系数有意义,它应该明显高于网络中所有关系随机的版本。

How:平均聚类系数通常用于估计网络是否可能展现基于紧密集群的“小世界”行为。这也是集群稳定性和弹性的一个因素。流行病学家使用平均聚类系数来帮助预测不同社区的各种感染率。


5. Neo4j 的逻辑架构

Neo4j数据库内部的逻辑架构相对比较简单,如图5.1所示:

图5.1 Neo4j存储引擎架构

从图5.1可以看出,从上到下,纵向分为三个大的层次,分别是接口层、数据管理层以及存储层。接口层有Traversal API、Core API、Cypher等接口。Tranversal API 主要是遍历算法的调用接口;Core API是Neo4j的内部核心Java组件接口,读数据的时候,可以通过它展示节点、关系、属性等原始图数据;写数据的时候,通过它来保证数据的原子性、隔离性、连续性等;Cypher是Neo4j数据库主要的查询语言接口CQL接口。中间数据管理层包括对数据的并发锁管理、事务管理、缓存管理以及存储管理等;下层就是真正的存储空间了。


6. Neo4j 的集群架构

通常讲Neo4j的集群架构是指 Causal cluster 。该集群架构由两个不同的角色Core Servers和Read Replicas组成,这两个角色是任何生产部署中的基础,但彼此之间的管理规模不同,并且在管理整个集群的容错性和可伸缩性方面承担着不同的角色。如图6.1所示:

图6.1 Neo4j Cluster架构

1). 核心服务器(Core Servers):核心服务器通过使用Raft协议复制所有事务来实现对数据保护的目的。在确认向终用户应用程序提交事务之前,Raft确保数据安全持久,集群(N / 2 + 1)中的大多数核心服务器都需要确认了事务。随着群集中核心服务器数量的增加,确认一次写入所需的Core Servers的数量也会增加。实际上,这意味着典型的Core Server集群中需要一定数量的服务器,足以为特定部署提供足够的容错能力。这是使用公式M = 2F +1计算的,M是容忍F故障所需的核心服务器数量。

2). 副本服务器(Read Replicas):副本服务器的主要职责是扩展图数据负载能力。作用类似于Core Server保护的数据的缓存,但它们不是简单的键值缓存,同时它是功能齐全的Neo4j数据库,能够完成任意(只读)图数据查询和过程。只读副本是通过事务日志传送从Core Servers异步复制的。它定期轮询核心服务器以查找自上次轮询以来已处理的任何新事务,并且核心服务器会将这些事务发送到只读副本。可以从相对较少的Core Server中馈送许多只读副本数据,从而使查询工作量大为增加,从而扩大规模。但是,与核心服务器不同,只读副本不参与有关群集拓扑的决策。


7. Neo4j 适用场景

目前,业内已经有了相对比较成熟的基于图数据库的解决方案.我们可以将图领域划分成两部分:1. 用于联机事务图的持久化技术(通常直接实时地从应用程序中访问)。这类技术被称为图数据库,它们和“通常的”关系型数据库世界中的联机事务处理(OLTP)数据库是一样的。2. 用于离线图分析的技术, 这类技术被称为图计算引擎。它们可以和其他大数据分析技术看做一类,如数据挖掘和联机分析处理。

按照行业分类,目前Neo4j应用的业务场景分为以下几类:

1. 金融行业反欺诈多维关联分析场景

反欺诈已经是金融行业一个核心应用,通过图分析可以清楚地知道洗钱网络及相关嫌疑,例如对用户所使用的帐号、发生交易时的IP地址、MAC地址、手机IMEI号等进行关联分析。例如去过地方的IP地址、曾经使用过的MAC地址(包括手机端、PC端、WIFI等)、社交网络的关联度分析,同一时间点是否曾经在同一地理位置附近出现过,银行账号之间是否有历史交易信息等。

2. 社交网络分析

在社交网络中,公司、员工、技能的信息,这些都是节点,它们之间的关系和朋友之间的关系都是边,在这里面图数据库可以做一些非常复杂的公司之间关系的查询。比如说公司到员工、员工到其他公司,从中找类似的公司、相似的公司,都可以在这个系统内完成。

3. 企业关系图谱

图数据库可以对各种企业进行信息图谱的建立,包括基本的工商信息,包括何时注册、谁注册、注册资本、在何处办公、经营范围、高管架构。围绕企业的经营范围,继续细化去查询企业究竟有哪些产品或服务,例如通过企业名称查询到企业的自媒体,从而给予其更多关注和了解。另外也包括对企业的产品和服务的数据关联,查看该企业有没有令人信服的自主知识产权和相关资质来支撑业务的开展。、

4. 安全检测分析

通过记录软件或者网络行为的各种关系数据,例如其访问了哪些IP、访问了哪些系统资源,进而分析软件行为是否属于正常访问,是否具有恶意等。

5. 监控管理

现实当中会有很多环境包含一个个的实体,实体之间又是相互关联的,从而组成了一个复杂的网络关系图。例如数据中心包含各种设备、各种设备之间又通过有线无线网络连接,例如地铁网由车辆、站点、调度人员等各个实体组成,他们又有各种的联动关系。那么我们可以通过图数据库的信息采集和关系分析来实现联动的监控报警。

来源:

https://mp.weixin.qq.com/s?src=11×tamp=1640592644&ver=3521&signature=hedeOJfigpkRbuZ1nQt6L9fIiGg63GQlRa6fZcw4k0krzWqA3bykFbQd-Kzi1kD-nn7bXotaZ2i2HmMsEnE2wOX3684lzDuBGok414eS8-ReLs1Olt-rLD6Kl9AUJScq&new=1

相关文章