【问题标题】:Neo4j Design: When to use Properties for RelationshipsNeo4j 设计:何时使用关系属性
【发布时间】:2015-06-04 00:29:56
【问题描述】:

Neo4j 中使用RelationshipProperty 属性的正确情况是什么? (包括何时和何时不使用它们的示例)


示例

考虑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'}

【问题讨论】:

  • 您可以通过多种方式对此进行建模。但要回答您应该如何,您能告诉我们更多关于这个 ID 的含义吗?好的,所以一个团队使用特定的计算机。可能其他团队使用同一台计算机。 TeamA1-MBKi7 是什么意思?
  • TeamA1-MBKi7 将只是每个Team 中使用的唯一引用,以引用他们对特定Computer 的使用。该示例只是一个假设的示例,问题实际上是关于何时以及为什么可以在关系中使用属性字段。这个例子只是作为一个理论案例来引发讨论

标签: database-design neo4j


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 这个问题的真正目的是什么时候以及什么时候不使用关系中的属性。我试图确定您为什么不想使用关系中的属性来描述数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多