2013-03-12 78 views
5

我想表示数百万个属于几十个类别中的一个或多个的产品。Neo4j中的类别设计,根节点关系vs与索引节点的关系

我考虑了几个方法:

  1. 索引目录节点 - 为每个类别的节点上,然后创建一个CATEGORY_NAME auto_index中。然后在我的每个产品节点和它们各自的类别节点之间创建“isCategoryOf”关系。

  2. 个人分类关系类型 - 分别创建“isCategoryGames”,“isCategoryFood”,“isCategoryLifestyle”等产品和根节点之间的关系。

  3. 将类别存储为一个关系类型的属性 - 在prduct节点和根节点之间创建“isCategory”关系并将它们各自的类别类型存储在关系的属性中。关系“isCategory”{categoryName:“food”}

哪种方法最有效率和/或可扩展性?数据库中几乎每个节点都连接到根节点会有限制或性能影响吗?

回答

4

如果您将数百万个节点连接到根节点,则会使根节点成为超节点。 This can be problematic

选项1的一般概念显示了承诺。如果您正在为食物建模,则可能会有名为“坚果”,“乳制品”,“甜品”,“农产品”和类别属性为“类别”的名称属性的节点。然后,您将拥有其他名为“Cherry Cheesecake”的名称属性的节点,并向“乳制品”和“甜品”节点传出“类别”边缘。

此结构是否足够高性能取决于您的查询。如果你有类似'食物'的广泛类别,你可能会得到一个超级节点,并且你将通过连接节点进行线性扫描来找到具有给定属性的节点。对成千上万的东西进行线性扫描可能足够满足您的需求,但是对超过1M个事物的扫描可能不会。

为了找到答案,我建议创建一个快速原型,在其中生成一些随机产品和类别节点,然后将每个产品节点连接到随机数量的类别节点。按名称对产品和类别节点进行索引可帮助您找到单个产品或类别,但如果您点击超节点,则会导致性能问题。尝试一些Gremlin遍历或Cypher查询,您认为这些问题可能是最有问题的。尝试按比例增加1K,10K,100K和1M的节点数量,并使用相应数量的边缘。你的遍历/查询时间如何改变?