Neo4j 设计:何时使用关系属性

Neo4j Design: When to use Properties for Relationships

使用 Property attribute of a Relationship in Neo4j 的正确情况是什么? (包括何时和何时不使用它们的示例)


例子

考虑 Team ATeam B 使用的计算机,其中每个团队都有自己的计算机内部值 id

Node = Team : properties = {'name'='Team A'}
^
|
Relationship = "Used By..."
|
Node = Computer : properties = {'Type':'MacBook', 'CPU':'i7', 'id'='TeamA1-MBKi7'}

如果 Team B 具有相同的关系,但 id 具有不同的值:

将 属性 id 移出 Computer 节点并建立关系 属性 是否正确?

例如

Node = Team : properties = {'name'='Team A'}
^
|
Relationship = "Used By..." : properties = {'id'='TeamA1-MBKi7'}
|
Node = Computer : properties = {'Type':'MacBook', 'CPU':'i7'}

为了解决您的具体示例,您可以添加一个新的 Model 节点标签来描述一种计算机,如:

(:Team {name: 'Team A'})<-[:USED_BY]-(:Computer {id: 'TeamA1-MBKi7'})-[:IS_A]->(:Model {type:'MacBook', cpu:'i7'})

这将允许多个 Computer 节点共享相同的模型信息。

为了解决您更笼统的问题,这里有一些想法:

  1. Neo4j 目前不允许您在关系上创建索引或唯一性约束。 (请记住,对于节点:索引或唯一性约束始终与节点标签和节点 属性 相关联。)因此,如果您想要(或可能想要)创建涉及 属性,你应该把它放在一个节点中。
  2. 一个关系只能使用一次,在两个节点之间建立一个连接。如果你想(或可能曾经想)在多个连接中包含相同的 属性 值,你应该考虑将它放在一个节点中。
  3. 如果 属性 总是与特定的一对节点相关(而不是只与其中一个节点相关),那么它应该是一种关系 属性.