我的
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);
节点数量:1000 个电影,2500 个名称标签
您可以尝试安装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程序。查看版本兼容性矩阵。
数据库中的节点和标签数量表明这是一个索引问题。您对 Movie 和 Namelabel (应该是 NameLabel 因为它是一个节点)节点有限制吗?适当的约束应该到位并且有效。
确保已声明索引和约束并在线 您想要匹配或合并的实体
始终匹配并合并 单个标签和索引主键属性
前缀您的负载 带有 USING PERIODIC COMMIT 10000 的语句 如果可能,单独的节点 从关系创造到不同的陈述
如果您的 导入速度很慢或遇到内存问题,请参阅 Mark 的博客文章 急切加载。
如果您的电影节点具有唯一的名称,则使用
CREATE UNIQUE
语句。 - 文档
如果其中一个节点不是唯一的,但将在关系定义中使用,则使用
CREATE INDEX ON
语句。对于如此小的数据集,您的查询效率有多低可能并不明显。尝试使用 PROFILE
命令并查看正在搜索多少个节点。您的 MERGE
语句应该在每一步仅检查几个节点。
您可以使用带有 IN TRANSACTIONS 的 CALL 子句将查询拆分为多个事务,
例如:
致电{ 加载带标题的 CSV 来自'https://data.neo4j.com/importing- 密码/persons.csv' AS行 合并(p:人 {tmdbId: toInteger(row.person_tmdbId)}) 放 p.imdbId = toInteger(row.person_imdbId), p.bornIn = row.bornIn, p.name = 行.name, p.bio = 行.bio, p.海报 = 行.海报, p.url = 行.url, p.born = 日期(row.born), p.died = date(row.died); } 在 100 行交易中