【问题标题】:How to deal with large number of edges from few vertex in graph db如何处理图数据库中少数顶点的大量边
【发布时间】:2019-05-31 01:14:22
【问题描述】:
我正在尝试基于大型 RDBMS 数据对图形数据库进行建模。图数据库背后的原因是为了回答很多基于关系的问题,实现不同节点之间的遍历和性能。在对此进行建模时,我注意到很少有节点具有大量传出边。
例如,将“类别”视为一个顶点,将“产品”视为另一个顶点。还存在诸如“产品”之类的其他顶点。但是,很多边从“类别”到其他边。传出的边数只有几十万。
这是警报吗?
有没有更好的设计原则来主动以不同的方式进行设计?
【问题讨论】:
标签:
neo4j
graph-databases
gremlin
【解决方案1】:
假设您当前的数据模型如下所示:
(:Category {name: 'Toy'})<-[:IS_A]-(:Product {id: 123})
并且一些带有Categorylabel的节点有大量相关的Products。
要减少关系数量并稍微简化查询,您可以考虑消除 Category 节点,而是为每个 Product 节点添加一个额外的 label。例如:
(:Product:Toy {id: 123})
使用这种新的数据模型,您可以直接找到所有 Toy 产品,而无需遍历任何关系(例如,MATCH (t:Toy) RETURN t)。
【解决方案2】:
另一种方法是使用“类别”作为“产品”的属性,这样既可以解决超顶点问题,又可以节省资源。例如,如果您想查找特定类别下的所有产品,请为“类别”属性创建索引。
通常,在图建模中应避免使用超级顶点,因为它们对查询性能有重大影响。如果查询这些边,大多数图形数据库会切断或进行采样。如果这是不可避免的,请确保在遍历这些顶点的出边时至少设置限制。