Neo4j中的类别设计,根节点关系与索引节点的关系

时间:2013-03-12 12:48:17

标签: neo4j graph-databases

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

我正在考虑一些方法:

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

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

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

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

1 个答案:

答案 0 :(得分:4)

如果将数百万个节点附加到根节点,则会使根节点成为超级节点。 This can be problematic

选项1的一般概念显示了承诺。如果您正在为食物建模,您可能拥有名称属性的节点,如“Nuts”,“Dairy Products”,“Desserts”,“Produce”和类型属性“Category”。然后,您将拥有其他节点,其名称属性如“Cherry Cheesecake”,“Dairy Products”和“Desserts”节点具有传出的“category”边缘。

此结构的性能是否足够取决于您的查询。如果您有像'food'这样的大类,那么最终可能会得到一个超级节点,并且您将通过连接的节点进行线性扫描,以找到具有给定属性的节点。对数以千计的事物进行线性扫描可能足够快,但扫描超过1M的事情可能不会。

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