Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j:性能问题_Neo4j - Fatal编程技术网

Neo4j:性能问题

Neo4j:性能问题,neo4j,Neo4j,我们使用Neo4j 3.4企业版作为应用程序的数据存储。它运行在具有8核CPU和16GB RAM的EC2实例上 我们已上载这些数据集: 销售:包括美元、折扣、数量和每卷价格等,根据品牌、周和业务单位等维度可视化 天气:由气温、降水量和降雪量组成,根据日、月和气象站的维度进行可视化 媒体:由事实支出、TRP和印象组成,根据维度周、业务单位、品牌、渠道、观众和活动进行可视化 这是我们设计的通用模型,可以容纳不同类型的数据集 该模型基于以下箭头图- 我们在其上运行的查询类型不依赖于数据集所属的应用

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

我们已上载这些数据集:

  • 销售:包括美元、折扣、数量和每卷价格等,根据品牌、周和业务单位等维度可视化
  • 天气:由气温、降水量和降雪量组成,根据日、月和气象站的维度进行可视化
  • 媒体:由事实支出、TRP和印象组成,根据维度周、业务单位、品牌、渠道、观众和活动进行可视化
  • 这是我们设计的通用模型,可以容纳不同类型的数据集

    该模型基于以下箭头图-

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

    设计理念:

  • 每个节点表示事实表中的一行数据。这些事实的值被捕获为属性。如果一个数据集在事实表中有200万行,它将有200万个遵循上述模式的对应节点。检查PosSales节点
  • 我们创建关系的基础是什么?一个数据集中的所有度量值与属性位于同一个节点上,而维度与节点相连。每个维度都是一个单独的节点
  • 时间和位置的一致维度用于在销售、天气和媒体交付等不同数据集之间建立路径/关系-时间、位置或数据集特定维度
  • 我们希望在上述数据集之间执行连接。结果集应该返回这三个提到的数据集之间的内部连接,以呈现三个数据集中的每一个事实,如:美元销售额、每日天气和印象。这些数据将根据所有三个数据集的维度组合进行分组。 该数据库有1M个节点和2M个关系

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

    我们的查询正在经历组合爆炸,如下图所示。我们研究了查询执行计划,该计划反映了在几个阶段中超过100万次点击的db数

    下面是每个标签的一些统计信息

  • PosSales–178k节点
  • SKU_IRI–237个节点
  • SKU区–90个节点
  • 分销商–68000个节点
  • 我们想从两个数据集,即销售额和发货量中获取事实。当我们通过SKU_IRI和SKU Dist连接PosSales和经销商节点时,组合爆炸正在发生

    我们应该如何处理组合爆炸

    有没有更好的建模方法来避免这些问题

    我可以在Neo4j服务器上调整一些配置或设置,使其能够使用更多明显未充分利用的RAM和CPU,从而使查询运行得更快吗


    如果使用对终端节点进行编码的具体关系,我不会使用诸如
    连接的
    包含的一般关系。Neo4j可以更有效地预过滤这些关系。您的查询没有任何限制,它们会拉入整个数据库。这是故意的吗?你想实现什么?如果你使用对终端节点进行编码的具体关系,我不会使用像CONNECTED或CONTAINS这样的通用关系,Neo4j可以更有效地预过滤这些关系。-认可的。我们将进行更改并更新此线程。您的查询没有任何限制,它们将拖入整个数据库。这是故意的吗?你想要实现什么这是故意的。我们想让用户能够对上传的数十万个数据集执行连接。举个例子,用户在web应用程序UI上选择了一个名为“美元销售额”的变量。用户认为,如果她也有历史天气和消费者物价指数(CPI)数据,她可以改进对该变量的预测。现在这三个都是从不同的数据集上传到Neo4j的。每个数据集都有自己的粒度,我们可以在它们之间建立基于位置或时间的公共路径。每天的美元销售额为城市水平。天气/温度为每小时城市水平。CPI为每个季度的国家水平。她希望使用graph执行左连接的等效操作。在应用程序级别,我们必须生成相应的密码。这些节点可能位于图中的任何位置。如果用户希望根据特定时间(例如年/月)和/或位置(国家/城市)过滤返回的数据,我们会在Cypher中添加WHERE子句。