我的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
答案 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,因为它是一个节点)节点有约束吗?适当的约束应该到位并且有效。
确保声明了索引和约束,并且为ONLINE 您希望在
上匹配或合并的实体始终匹配和合并 单个标签和索引的主键属性
加载前缀 使用PERICODIC COMMIT 10000的语句如果可能,单独的节点 从关系创造到不同陈述的创造
如果你的 导入速度很慢或遇到内存问题,请参阅Mark’s blog post 渴望加载。
如果您的Movie节点具有唯一名称,请使用CREATE UNIQUE
语句。 - docs
如果其中一个节点不是唯一的,但将在关系定义中使用CREATE INDEX ON
语句。有了这么小的数据集,您的查询效率可能不高。尝试PROFILE
命令,查看正在搜索的节点数。您的MERGE
语句应该只检查每一步的几个节点。