1

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

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

增加或禁用transaction timeoutin theneo4j.conf不是一个选项,因为 neo4j 服务需要为配置中所做的每次更改重新启动。

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

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

节点数:1000 个电影,2500 个名称标签

4

2 回答 2

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 程序。查看版本兼容性矩阵

于 2017-09-18T12:40:01.507 回答
0

数据库中节点和标签的数量表明这是一个索引问题。您对电影和名称标签(应该是名称标签,因为它是一个节点)节点都有限制吗?适当的约束应该到位并处于活动状态。

索引和性能

确保为您想要 MATCH 或 MERGE 的实体声明索引和约束并在线

始终在单个标签和索引主键属性上进行 MATCH 和 MERGE

使用 USING PERIODIC COMMIT 10000 作为加载语句的前缀 如果可能,将节点创建与关系创建分开到不同的语句中

如果您的导入速度很慢或遇到内存问题,请参阅Mark关于 Eager loading的博客文章。

如果您的电影节点具有唯一名称,则使用该CREATE UNIQUE语句。-文档

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

于 2017-09-18T12:41:12.823 回答