Mon*_*key 5 neo4j graph-databases
我想代表数百万种属于一个或多个类别的产品.
我正在考虑几种方法:
索引类别节点 - 为每个类别创建节点,并在category_name上创建auto_index.然后在我的每个产品节点和它们各自的类别节点之间创建"isCategoryOf"关系.
个别类别关系类型 - 创建相应的"isCategoryGames","isCategoryFood","isCategoryLifestyle"等...产品与根节点之间的关系.
将类别存储为一种关系类型的属性 - 在产品节点和根节点之间创建"isCategory"关系,并将它们各自的类别类型存储在关系的属性中,例如关系"isCategory"{categoryName:"food"}
哪种方法最有效和/或可扩展.几乎数据库中的每个节点都连接到根节点是否存在限制或性能影响?
如果将数百万个节点附加到根节点,则根节点将成为超级节点。这可能会产生问题。
选项 1 的总体概念显示出希望。如果您正在对食物进行建模,则可能有具有“坚果”、“乳制品”、“甜点”、“农产品”等名称属性和“类别”类型属性的节点。然后,您将拥有具有名称属性(如“樱桃芝士蛋糕”)的其他节点,其传出“类别”边缘指向“乳制品”和“甜点”节点。
此结构是否具有足够的性能取决于您的查询。如果您有像“食物”这样的广泛类别,您最终可能会得到一个超级节点,并且您将通过连接的节点进行线性扫描以查找具有给定属性的节点。对数千个事物进行线性扫描可能足以满足您的目的,但对 100 万个事物进行扫描可能不够快。
为了找到答案,我建议创建一个快速原型,在其中生成一些随机产品和类别节点,然后将每个产品节点连接到随机数量的类别节点。按名称索引产品和类别节点将帮助您找到单个产品或类别,但如果您遇到超级节点,则遍历将导致性能问题。尝试一些您认为可能最有问题的 Gremlin 遍历或 Cypher 查询。尝试将节点数量从 1K、10K、100K 和 1M 扩大到相应数量的边。您的遍历/查询时间如何变化?