Neo4j 持久查询是 split/executed 更小的块?
Neo4j long lasting query to be split/executed in smaller chunks?
我的 import.csv
创建了许多节点并且合并创建了一个巨大的笛卡尔积并在 transaction timeout
中运行,因为数据已经增长了这么多。我目前将事务超时设置为 1 秒,因为其他所有查询都非常快,完成时间不应超过 1 秒。
有没有办法以较小的块拆分或执行此特定查询以防止超时?
在 neo4j.conf
中升级或禁用 [=13=] 不是一个选项,因为 neo4j 服务需要在配置中进行的每次更改时重新启动。
查询从我的导入脚本中超时:
MATCH (l:NameLabel)
MATCH (m:Movie {id: l.id,somevalue: l.somevalue})
MERGE (m)-[:LABEL {path: l.path}]->(l);
节点数:1000 部电影,2500 名称标签
您可以尝试安装 APOC Procedures and using the procedure 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})
下面的查询将在单独的事务中重复执行,直到 returns 0。
您可以更改 {limit : 1000}
的值。
注意:记得根据你使用的Neo4j版本安装APOC Procedures。看看 Version Compatibility Matrix.
您数据库中的节点和标签数量表明这是一个索引问题。您是否对 Movie 和 Namelabel(应该是 NameLabel,因为它是一个节点)节点都有约束?适当的约束应该到位并处于活动状态。
Make sure to have indexes and constraints declared and ONLINE for
entities you want to MATCH or MERGE on
Always MATCH and MERGE on a
single label and the indexed primary-key property
Prefix your load
statements with USING PERIODIC COMMIT 10000 If possible, separate node
creation from relationship creation into different statements
If your
import is slow or runs into memory issues, see Mark’s blog post on
Eager loading.
如果您的 Movie 节点具有唯一名称,则使用 CREATE UNIQUE
语句。 - docs
如果其中一个节点不是唯一的但将在关系定义中使用,则 CREATE INDEX ON
语句。对于如此小的数据集,您的查询效率有多低可能并不明显。尝试 PROFILE
命令并查看正在搜索的节点数。您的 MERGE
语句应该在每一步只检查几个节点。
我的 import.csv
创建了许多节点并且合并创建了一个巨大的笛卡尔积并在 transaction timeout
中运行,因为数据已经增长了这么多。我目前将事务超时设置为 1 秒,因为其他所有查询都非常快,完成时间不应超过 1 秒。
有没有办法以较小的块拆分或执行此特定查询以防止超时?
在 neo4j.conf
中升级或禁用 [=13=] 不是一个选项,因为 neo4j 服务需要在配置中进行的每次更改时重新启动。
查询从我的导入脚本中超时:
MATCH (l:NameLabel)
MATCH (m:Movie {id: l.id,somevalue: l.somevalue})
MERGE (m)-[:LABEL {path: l.path}]->(l);
节点数:1000 部电影,2500 名称标签
您可以尝试安装 APOC Procedures and using the procedure 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})
下面的查询将在单独的事务中重复执行,直到 returns 0。
您可以更改 {limit : 1000}
的值。
注意:记得根据你使用的Neo4j版本安装APOC Procedures。看看 Version Compatibility Matrix.
您数据库中的节点和标签数量表明这是一个索引问题。您是否对 Movie 和 Namelabel(应该是 NameLabel,因为它是一个节点)节点都有约束?适当的约束应该到位并处于活动状态。
Make sure to have indexes and constraints declared and ONLINE for entities you want to MATCH or MERGE on
Always MATCH and MERGE on a single label and the indexed primary-key property
Prefix your load statements with USING PERIODIC COMMIT 10000 If possible, separate node creation from relationship creation into different statements
If your import is slow or runs into memory issues, see Mark’s blog post on Eager loading.
如果您的 Movie 节点具有唯一名称,则使用 CREATE UNIQUE
语句。 - docs
如果其中一个节点不是唯一的但将在关系定义中使用,则 CREATE INDEX ON
语句。对于如此小的数据集,您的查询效率有多低可能并不明显。尝试 PROFILE
命令并查看正在搜索的节点数。您的 MERGE
语句应该在每一步只检查几个节点。