Neo4j设计:属性与"节点和关系"

9

我有一个节点类型,它有一个字符串属性,该属性的值非常经常相同。例如,数百万个节点中有仅5个选项的字符串值。我将通过该属性进行搜索。

我的问题是,从性能和内存方面来看,哪种方式更好: a)将其实现为节点属性并拥有大量重复项(并使用WHERE进行搜索)。 b)将其实现为5个附加节点,所有原始节点都引用其中之一(并使用附加MATCH进行搜索)。

3个回答

6

不了解更多细节,很难给出通用的答案。

从性能的角度来看,尽早限制搜索范围是更好的选择。如果您不必查看遍历属性,则更加有利。

鉴于此,我认为最好将查找属性移动到单独的节点中,并将该值用作关系类型。


我非常喜欢你使用值作为关系类型的想法。然后,我只需要一个没有数据的无用节点来指向这些新关系。另一个问题是:如果有100万个关系指向单个节点,会有任何性能问题吗?我不会从该节点进行任何搜索,只会对其进行搜索。此外,将根节点用于此是否有意义? - Martynas
2
只要你遍历到那个节点,就不会有性能损失。如果你往另一个方向走,当然就必须扫描一百万个关系。 - Stefan Armbruster
我不建议使用根节点。也许可以创建一个新节点,将其连接到根节点上。否则,您可能会在根节点中填充多个不同的概念,这是一种糟糕的建模策略。 - Stefan Armbruster

4

1
我也思考过这个问题。在我的情况下,我必须表示状态:
  • STARTED
  • IN_PROGRESS
  • SUBMITTED
  • COMPLETED
总体而言,节点+关系的方法更具吸引力,因为每次只需维护单个关系引用,而不是属性字符串,并且您不需要扫描额外的索引(内存和性能直观上支持这种方法)。
另一个优点是它轻松支持将节点链接到多个“特殊节点”的能力。如果您预见到模型中可能出现这种情况,那么这比使用属性数组(并使用“in”进行搜索)要好。
在实践中,我发现问题变成了如何每次访问这些特殊节点。要么您维护某种常量引用,其中包含这些特殊节点的节点ID,可以在START语句中直接跳转到它们(这就是我们所做的),要么您需要针对特殊节点的属性进行搜索(例如名称),然后遍历其关系。这不会产生最美观的Cypher查询。

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