Neo4J节点 vs 关系实体

4

我正在学习 Spring Data 的书中关于 NEO4J 的实例。

 Nodes         - Product, Person, Order

 Relationships - (Order) Items (Product), (person) Reviewed (product)

我正在设计我的第一个Neo4J数据库,遇到一种情况,即评论可能更适合作为节点而不是关系。
这意味着评论现在可以有一个COVERS关系。
 Review COVERED Order , Review COVERED Product 

这篇评论涉及到多种覆盖关系。
创建一个节点实体和节点关系之间有什么想法吗?Neo4J似乎非常灵活,如果我改变主意,似乎以后可以修改,是吗?
在多个节点中重复基本相同的评论文本,而不是在关系中重复,似乎很奇怪...为了节省计算空间,应该创建一个评论节点。
 Review Node Entity
   - String comments
   - int stars
1个回答

1
首先,在设计时需要在白板上写下一个粗略的模型,这将给人们提供他们想要实现的洞见。
在这种情况下,如果将“REVIEW”节点保持独立,实际上会创建比减少计算空间更多的额外节点和关系。
(PERSON)-[:GIVEN]->(REVIEW)-[:COVERED]->(PRODUCT)

因此,考虑提出一个问题(用例):获取产品A的评论?

首先,图形将需要检查所有与关系类型“COVERED”连接到“PRODUCT A”的“REVIEW”节点,然后再追溯到“PERSON”节点以获得谁发表了评论。

但是,如果您执行(PERSON) - [: REVIEWED] - >(PRODUCT)

您只需要查询一次所有关系类型为REVIEWED的入站关系,这些关系从PERSON节点进入PRODUCT A。您可以将commentsstars存储为关系属性。

因此,我认为通过具有REVIEWED上的属性直接连接它将是更整洁、更简单的设计。


那么您建议将审查数据加倍,分成两个关系吗? - Erik
Neo4j 2.0 允许在关系上存储属性。因此,您可以将评审数据保存为 REVIEWED 关系上的属性。 - Sumeet Sharma
我知道这个事实...但是如果评论涵盖了两个节点..我需要写两个关系..这似乎很低效,因为现在我要存储的数据量增加了一倍。 - Erik
我认为每个产品都应该有自己独立的评论,这样如果你想要追溯某个特定产品的评论,会更容易。无论如何,如果评论涵盖了两个节点...如果你按照我的回答中的匹配模式1创建一个单独的节点,那么就会有2个关系COVERED和1个REVIEW节点以及1个GIVEN关系。根据我的回答中的匹配模式2,只会有2个REVIEWED关系。 - Sumeet Sharma
每个产品只有一个评论的规则对我正在处理的数据不适用。我会尝试两个实例...一个是评论作为具有多个关系的节点,另一个是评论重复关系。 - Erik

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