5

我想代表属于几十个类别中的一个或多个类别的数百万种产品。

我正在考虑几种方法:

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

  2. 单独的类别关系类型——在产品和根节点之间创建各自的“isCategoryGames”、“isCategoryFood”、“isCategoryLifestyle”等关系。

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

这些方法中的哪一种是最有效和/或可扩展的。让数据库中的几乎每个节点都连接到根节点是否存在限制或性能影响?

4

1 回答 1

4

如果将数百万个节点附加到根节点,则使根节点成为超级节点。这可能是有问题的。

选项 1 的一般概念显示出前景。如果您正在对食物进行建模,您可能有具有名称属性的节点,例如“坚果”、“乳制品”、“甜点”、“农产品”,类型属性为“类别”。然后,您将拥有具有名称属性的其他节点,例如“Cherry Cheesecake”,其中“乳制品”和“甜点”节点具有传出的“类别”边缘。

这种结构是否足够高效取决于您的查询。如果您有像“食物”这样的广泛类别,您最终可能会得到一个超级节点,并且您将对连接的节点进行线性扫描以找到具有给定属性的节点。对数千个事物进行线性扫描可能足以满足您的目的,但对 1M 个事物的扫描可能不会。

为了找出答案,我建议创建一个快速原型,在其中生成一些随机产品和类别节点,然后将每个产品节点连接到随机数量的类别节点。按名称索引产品和类别节点将帮助您找到单个产品或类别,但如果您遇到超级节点,遍历会导致性能问题。尝试一些您认为可能最有问题的 Gremlin 遍历或 Cypher 查询。尝试使用成比例的边数将节点数量从 1K、10K、100K 和 1M 扩大。您的遍历/查询时间如何变化?

于 2013-03-13T17:36:27.403 回答