Neo4j:性能问题

时间:2018-08-16 07:11:59

标签: neo4j

我们正在使用Neo4j 3.4企业版作为应用程序的数据存储。它运行在具有8核CPU和16GB RAM的EC2实例上。

我们已经上传了这些数据集:

  1. 销售:包括美元,折扣,数量和每单位价格等事实,并根据品牌,周和业务单位等可视化。
  2. 天气:包括温度,降水和降雪在内的事实,可根据日,月和气象站的维度进行可视化
  3. 媒体:由事实支出,TRP和印象组成,并根据“周”,“业务部门”,“品牌”,“渠道”,“受众群体”和“活动”可视化

这是我们设计的通用模型,可以容纳不同类型的数据集。

该模型基于以下箭头图-

Domain Diagram

Arrow Diagram

我们正在其上运行的查询的类型不依赖于数据集所属的应用程序的类型。这是一个通用用例,其中我们试图获取与在同一“时间”或“位置”发生的事件相关的所有详细信息。

设计理念:

  1. 每个节点代表事实表中的一行数据。这些事实的值被捕获为属性。如果数据集在事实表中有200万行,则按照上述模式,它将有200万个对应节点。检查PosSales节点。
  2. 我们在什么基础上创建关系-来自一个数据集的所有度量都与属性位于同一节点上,而维与节点相连。每个维度都是一个单独的节点。
  3. 时间和位置的一致维度用于在不同数据集(例如销售,天气和媒体交付)之间建立路径/关系-时间,位置或数据集特定维度

我们希望在上述这些数据集之间执行JOIN。结果集应该在这三个提到的数据集之间返回一个INNER JOIN,以便说出三个数据集(如美元销售额,每日天气和印象)中的每个事实。这些将按来自所有三个数据集的维度组合分组显示。 该数据库具有1M个节点和2M个关系。

Neo4j配置为最多使用总系统内存16 GB的80%。 明显的问题–

我们的查询正在组合爆炸,如下图所示。我们研究了查询执行计划,该计划在几个阶段中反映了命中率超过1亿的数据库的数量。

enter image description here Arrow Diagram

每个标签的统计信息很少

  1. PosSales – 17.8万个节点
  2. SKU_IRI – 237个节点
  3. SKU_Dist – 90个节点
  4. DistributorShipments – 680k节点

我们想从两个数据集(即销售和发货)中获取事实。当我们通过SKU_IRI和SKU_Dist连接PosSales和DistributorShipments节点时,正在发生组合爆炸。

我们应该如何应对组合爆炸?

有没有更好的建模图表的方法来避免这些类型的问题?

我是否可以在Neo4j服务器上进行一些配置或设置调整,使其可以使用更多未充分利用的RAM和CPU,从而使查询运行更快?

Attaching document which has few sample queries

0 个答案:

没有答案