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

问题描述 投票:0回答:3

我的

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 个名称标签

neo4j cypher neo4j-apoc
3个回答
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程序。查看版本兼容性矩阵


0
投票

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

索引和性能

确保已声明索引和约束并在线 您想要匹配或合并的实体

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

前缀您的负载 带有 USING PERIODIC COMMIT 10000 的语句 如果可能,单独的节点 从关系创造到不同的陈述

如果您的 导入速度很慢或遇到内存问题,请参阅 Mark 的博客文章 急切加载。

如果您的电影节点具有唯一的名称,则使用

CREATE UNIQUE
语句。 - 文档

如果其中一个节点不是唯一的,但将在关系定义中使用,则使用

CREATE INDEX ON
语句。对于如此小的数据集,您的查询效率有多低可能并不明显。尝试使用
PROFILE
命令并查看正在搜索多少个节点。您的
MERGE
语句应该在每一步仅检查几个节点。


0
投票

您可以使用带有 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 行交易中

© www.soinside.com 2019 - 2024. All rights reserved.