Neo4j设计:财产与“节点与关系”

时间:2013-03-18 09:06:45

标签: graph nosql neo4j graph-databases

我有一个节点类型,其字符串属性通常具有相同的值。等等。数百万个节点只有该字符串值的5个选项。我将通过该属性进行搜索。

我的问题是在性能和​​内存方面更好: a)将其实现为节点属性并具有大量重复项(并使用WHERE进行搜索)。 b)将其实现为5个额外节点,其中所有原始节点引用其中一个节点(并使用额外的MATCH进行搜索)。

3 个答案:

答案 0 :(得分:6)

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

从性能角度来看,最好尽早限制搜索。如果您不必查看遍历的属性,那就更有益了。

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

答案 1 :(得分:4)

使用labels;这篇博文是这个新的Neo4j 2.0功能的一个很好的介绍:

答案 2 :(得分:1)

我也考虑过这个问题。就我而言,我必须代表州:

  • STARTED
  • IN_PROGRESS
  • 提交
  • 已完成

总体而言,Node + Relationship方法看起来更具吸引力,因为每次只需要维护一个关系引用而不是属性字符串,并且您不需要扫描必须在属性上维护的额外附加索引(记忆和表现将直观地支持这种方法)。

另一个优点是它可以轻松支持节点链接到多个“特殊节点”的能力。如果您预见到模型中可能存在这种情况,那么这比使用属性数组(以及使用“in”进行搜索)更好。

在实践中我发现问题变成了,每次如何访问这些特殊节点。您可以维护某种常量引用,其中您拥有这些特殊节点的节点ID,您可以在START语句(我们这样做)中直接跳转到它们中,或者您需要进行搜索每次都反对特殊节点的属性(也许是名称),然后遍历它的关系。这并不是最有趣的密码查询。