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

3
什么情况下应该使用属性属性和关系Neo4j中?(包括何时以及何时不使用它们的示例)

例子

考虑一个计算机,由 A团队 B团队 使用,每个团队都有自己的内部值 id 用于计算机:

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

如果Team B有相同的关系,但是id的值不同,将属性idComputer节点中移出并放入关系属性中是否正确?例如:
Node = Team : properties = {'name'='Team A'}
^
|
Relationship = "Used By..." : properties = {'id'='TeamA1-MBKi7'}
|
Node = Computer : properties = {'Type':'MacBook', 'CPU':'i7'}

有很多方法可以对此进行建模。但是为了回答如何建模,您能否告诉我们更多关于这个ID的含义?好的,一个团队使用特定的计算机。可能其他团队也使用同一台计算机。TeamA1-MBKi7代表什么意思? - FrobberOfBits
“TeamA1-MBKi7”只是一个唯一的参考,用于每个“团队”内部引用他们对特定“计算机”的使用。这个例子只是一个假设性的例子,问题实际上是关于何时以及为什么在关系中使用属性字段。这个例子只是作为一个理论案例来引发讨论。 - Alexander McFarlane
1个回答

4

针对您提出的问题,您可以添加一个新的Model节点标签来描述计算机的类型,例如:

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

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

针对您更一般的问题,以下是一些想法:

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

这个问题实际上是针对何时以及何时不使用关系中的属性。我试图确定为什么您不想在关系中使用属性来描述数据。 - Alexander McFarlane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接