中间节点的概念
有时,我们会发现需要将更多数据连接到关系上,而这些数据无法通过属性来完全捕获。换句话说,我们一种需要连接两个以上节点的关系。数学理论上是允许这种情形存在的,使用的是“超边”(hyperedge)的概念。遗憾的是,这在Neo4j中是不可能的,但解决方案是创建一个中间节点。
我们可以想一下小型关系数据库Microsoft Access表间关系的例子。Access直接支持的表间关系仅有两种:
一对1、一对多,并不支持多对多。但是,现实中又普遍存在多对多的关系,怎么办呢?方法是创建一种中间表,通过把一个多对多关系,分解成两个一对多的关系,间接实现两个表间多对多的关系。在图数据库中,这里的“超边”正是起到类似的作用。
Neo4j中,我们可以在有如下需要时创建中间节点:
- 在单个上下文中连接两个以上的节点。
- 超边(n元关系)
- 将某东西与一个关系联系起来。
- 在实体之间共享图中的数据。
上述这三个用例用于使图关系更有意义,并可在节点之间共享。
示例:需要中间节点的情形
下面是一个实例模型示例:
在上述例子中,我们有一个WORKS_AT超边,它具有from和to属性,但实际业务中,我们需要将角色与一段的工作相关联。在Neo4j中,无法创建一个关系,用来把一个关系连接到第三个节点。Neo4j关系只能连接两个节点。
于是,我们可以向模型中添加中间节点:
解决方案是:用连接点节点替换超边。
由于节点是连接点,因此只需在超边的中间创建一个节点。
在本例中,我们将超边上的WORKS_AT替换为Employment 中间节点。这就提供了一个连接点,允许我们将任何数量的信息连接到Mary在Acme公司的雇佣期限。此外,人员节点可以具有共享的角色或公司,并允许我们非常轻松地跟踪单个人员职业生涯的全部细节,或不同个人之间的重叠。
示例:用于共享数据的中间节点
在许多情况下,关系可以共享数据,从而使图包含的重复数据更少。
下面是重构前的图:
中间节点还允许您消除重复信息。在以前讨论扇出知识时,我们提到了一个类似的原则:即在扇出中,将属性拆分到自己的节点上,可以通过关系而不是重复的属性来引用它。
在这种情况下,电子邮件中间节点使我们不必在每个关系上重复电子邮件内容。
电影图示例中的中间节点情况
下面是我们正在使用的电影图中的当前实例模型:
在查看数据时,我们可以看到,如果我们能够进一步分析ACTED_IN在关系中的角色属性,我们将能够回答关于同一角色如何在多部电影中使用的问题。此外,我们可能想分析不同的角色是如何相互作用的,甚至是在不同的电影中。