【问题标题】:Neo4j long lasting query to be split/executed in smaller chunks?Neo4j 持久查询以较小的块拆分/执行?
【发布时间】:2017-09-18 11:04:48
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 请与我们分享您的导入脚本。
  • @BrunoPeres 添加了示例

标签: neo4j cypher neo4j-apoc


【解决方案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

【讨论】:

    【解决方案2】:

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

    Indexing and Performance

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

    总是 MATCH 和 MERGE 单个标签和索引的主键属性

    为您的负载添加前缀 使用 USING PERIODIC COMMIT 10000 的语句如果可能,单独的节点 从关系创建到不同语句的创建

    如果你的 导入速度慢或遇到内存问题,请参阅Mark’s blog post on 急于加载。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多