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

Neo4j中的类别设计,根节点关系与索引节点关系,neo4j,graph-databases,Neo4j,Graph Databases,我想代表数以百万计的产品,它们属于几十个类别中的一个或多个类别 我正在考虑几种方法: 索引类别节点-为每个类别创建节点,并在类别名称上创建自动索引。然后在我的每个产品节点及其各自的类别节点之间创建“isCategoryOf”关系 个别类别关系类型-创建各自的“isCategoryGames”、“isCategoryFood”、“isCategoryLifestyle”等。。。产品与根节点之间的关系 将类别存储为一种关系类型的属性-在prduct节点和根节点之间创建“isCategory”Rela

我想代表数以百万计的产品,它们属于几十个类别中的一个或多个类别

我正在考虑几种方法:

  • 索引类别节点-为每个类别创建节点,并在类别名称上创建自动索引。然后在我的每个产品节点及其各自的类别节点之间创建“isCategoryOf”关系

  • 个别类别关系类型-创建各自的“isCategoryGames”、“isCategoryFood”、“isCategoryLifestyle”等。。。产品与根节点之间的关系

  • 将类别存储为一种关系类型的属性-在prduct节点和根节点之间创建“isCategory”RelationsPP,并将其各自的类别类型存储在关系的属性中,例如关系“isCategory”{categoryName:“food”}


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

    如果将数百万个节点连接到根节点,则会使根节点成为超级节点

    选项1的一般概念显示了希望。如果要对食物建模,可能会有节点具有名称属性,如“Nuts”、“Dairy Products”、“deserts”、“product”和类型属性“Category”。然后,您将有其他具有名称属性的节点,如“Cherry Cheesecake”,并在“Dairy Products”和“甜点”节点上具有传出的“category”边

    这个结构是否足够有效取决于您的查询。如果你有像“食物”这样的大类别,你可能会得到一个超级节点,你会对连接的节点进行线性扫描,找到一个具有给定属性的节点。对于您的目的而言,对数千件物品进行线性扫描可能足够快,但对一百万件物品进行扫描可能不够快

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