0
点赞
收藏
分享

微信扫一扫

Neo4j图数据建模基础|创建中间节点

中间节点的概念

有时,我们会发现需要将更多数据连接到关系上,而这些数据无法通过属性来完全捕获。换句话说,我们一种需要连接两个以上节点的关系。数学理论上是允许这种情形存在的,使用的是“超边”(hyperedge)的概念。遗憾的是,这在Neo4j中是不可能的,但解决方案是创建一个中间节点。

我们可以想一下小型关系数据库Microsoft Access表间关系的例子。Access直接支持的表间关系仅有两种:

一对1、一对多,并不支持多对多。但是,现实中又普遍存在多对多的关系,怎么办呢?方法是创建一种中间表,通过把一个多对多关系,分解成两个一对多的关系,间接实现两个表间多对多的关系。在图数据库中,这里的“超边”正是起到类似的作用。

Neo4j中,我们可以在有如下需要时创建中间节点:

  • 在单个上下文中连接两个以上的节点。
  • 超边(n元关系)
  • 将某东西与一个关系联系起来。
  • 在实体之间共享图中的数据。

上述这三个用例用于使图关系更有意义,并可在节点之间共享。

示例:需要中间节点的情形

下面是一个实例模型示例:

Neo4j图数据建模基础|创建中间节点_连接点

在上述例子中,我们有一个WORKS_AT超边,它具有from和to属性,但实际业务中,我们需要将角色与一段的工作相关联。在Neo4j中,无法创建一个关系,用来把一个关系连接到第三个节点。Neo4j关系只能连接两个节点。

于是,我们可以向模型中添加中间节点:

Neo4j图数据建模基础|创建中间节点_多对多_02


解决方案是:用连接点节点替换超边。

由于节点是连接点,因此只需在超边的中间创建一个节点。

在本例中,我们将超边上的WORKS_AT替换为Employment 中间节点。这就提供了一个连接点,允许我们将任何数量的信息连接到Mary在Acme公司的雇佣期限。此外,人员节点可以具有共享的角色或公司,并允许我们非常轻松地跟踪单个人员职业生涯的全部细节,或不同个人之间的重叠。

示例:用于共享数据的中间节点

在许多情况下,关系可以共享数据,从而使图包含的重复数据更少。

下面是重构前的图:

Neo4j图数据建模基础|创建中间节点_连接点_03

中间节点还允许您消除重复信息。在以前讨论扇出知识时,我们提到了一个类似的原则:即在扇出中,将属性拆分到自己的节点上,可以通过关系而不是重复的属性来引用它。

Neo4j图数据建模基础|创建中间节点_连接点_04

在这种情况下,电子邮件中间节点使我们不必在每个关系上重复电子邮件内容。

电影图示例中的中间节点情况

下面是我们正在使用的电影图中的当前实例模型:

Neo4j图数据建模基础|创建中间节点_数据_05

在查看数据时,我们可以看到,如果我们能够进一步分析ACTED_IN在关系中的角色属性,我们将能够回答关于同一角色如何在多部电影中使用的问题。此外,我们可能想分析不同的角色是如何相互作用的,甚至是在不同的电影中。

举报

相关推荐

0 条评论