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

时间:2015-06-04 00:29:56

标签: database-design neo4j

Property中使用RelationshipNeo4j属性的正确理由是什么? (包括何时何时不在的示例使用它们)

实施例

考虑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节点并进入关系属性是否正确?

e.g。

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

1 个答案:

答案 0 :(得分:3)

要解决您的具体示例,您可以添加新的Model节点标签来描述计算机类型,如:

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

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

为了解决您更普遍的问题,以下是一些想法:

  1. Neo4j目前不允许您在关系上创建索引或唯一性约束。 (请记住,对于节点:索引或唯一性约束始终与节点标签和节点属性相关联。)因此,如果您希望(或可能想要)创建涉及属性的索引或唯一性约束,则应放置它在节点中。
  2. 关系只能使用一次,以便在2个节点之间建立单个连接。如果您希望(或可能希望)在多个连接中涉及相同的属性值,则应考虑将其放在节点中。
  3. 如果某个属性始终与一对特定节点相关(并且与这些节点中的一个节点无关),那么它应该是一个关系属性。