Neo4j的持久查询被拆分/较小的块执行?(Neo4j long lasting query to

2019-09-29 00:32发布

import.csv创造了许多节点和合并造成了巨大的笛卡尔积,并在运行的transaction timeout由于数据增长如此之快。 我因为所有其他的查询是非常快的,不应该采取任何超过一秒钟来完成交易超时当前设置为1秒。

有没有一种方法来分割或执行中的小块这个特定的查询,以防止超时?

正在增加或禁用transaction timeoutneo4j.conf因为Neo4j的服务需要在配置的每次改变重新启动是不是一种选择。

查询打从我进口脚本超时:

 MATCH (l:NameLabel)
 MATCH (m:Movie {id: l.id,somevalue: l.somevalue})
 MERGE (m)-[:LABEL {path: l.path}]->(l);

Nodecounts:1000电影,2500 Namelabel

Answer 1:

你可以尝试安装APOC过程和使用过程apoc.periodic.commit 。

call apoc.periodic.commit("
  MATCH (l:Namelabel)
  WHERE NOT (l)-[:LABEL]->(:Movie)
  WITH l LIMIT {limit}
  MATCH (m:Movie {id: l.id,somevalue: l.somevalue})
  MERGE (m)-[:LABEL {path: l.path}]->(l)
  RETURN count(*)
",{limit:1000})

下面的查询将反复在单独的事务,直到它返回0被执行。

您可以更改的值{limit : 1000}

注:记住安装根据您所使用的Neo4j的版本APOC程序。 您可以在看版本兼容性 。



Answer 2:

在你的数据库节点和标签的数量表明这是一个索引的问题。 你有两个电影和Namelabel约束(这应该是NameLabel,因为它是一个节点)的节点? 适当的约束要到位,活跃。

索引和性能

确保有指标,并宣布限制和在线为实体要匹配或合并功能

总是匹配和合并单个标签和索引的主键属性上

前缀使用周期性的负载COMMIT语句10000如果可能的话,从关系创建成不同的语句单独的节点创建

如果您导入缓慢或运行到内存问题,看到马克的博客文章上预先加载。

如果你的电影的节点有唯一的名字,然后使用CREATE UNIQUE声明。 - 文档

如果一个结点是不是唯一的,但将在关系定义中使用,则CREATE INDEX ON语句。 有了这样一个小的数据集,可能不是很明显你的查询是如何低效的。 尝试PROFILE命令,看看有多少节点正在搜索。 你的MERGE语句只应在每一步检查一对夫妇的节点。



文章来源: Neo4j long lasting query to be split/executed in smaller chunks?