Neo4j持久查询是否以较小的块分割/执行?

时间:2017-09-18 11:04:49

标签: neo4j cypher neo4j-apoc

我的import.csv创建了许多节点,合并创建了一个巨大的笛卡尔积,并在transaction timeout中运行,因为数据增长了很多。我目前将事务超时设置为1秒,因为每个其他查询都非常快,并且不应该花费任何超过一秒的时间来完成。

有没有办法在较小的块中拆分或执行此特定查询以防止超时?

升级或禁用transaction timeout中的neo4j.conf不是一个选项,因为neo4j服务需要重新启动配置中的每个更改。

查询从我的导入脚本命中超时:

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

Nodecounts:1000 Movie,2500 Namelabel

2 个答案:

答案 0 :(得分:1)

您可以尝试安装APOC Procedures并使用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程序。请查看Version Compatibility Matrix

答案 1 :(得分:0)

数据库中的节点和标签数表明这是一个索引问题。你对Movie和Namelabel(它应该是NameLabel,因为它是一个节点)节点有约束吗?适当的约束应该到位并且有效。

  

Indexing and Performance

     

确保声明了索引和约束,并且为ONLINE   您希望在

上匹配或合并的实体      

始终匹配和合并   单个标签和索引的主键属性

     

加载前缀   使用PERICODIC COMMIT 10000的语句如果可能,单独的节点   从关系创造到不同陈述的创造

     

如果你的   导入速度很慢或遇到内存问题,请参阅Mark’s blog post   渴望加载。

如果您的Movie节点具有唯一名称,请使用CREATE UNIQUE语句。 - docs

如果其中一个节点不是唯一的,但将在关系定义中使用CREATE INDEX ON语句。有了这么小的数据集,您的查询效率可能不高。尝试PROFILE命令,查看正在搜索的节点数。您的MERGE语句应该只检查每一步的几个节点。