【问题标题】:Neo4j conditional batch importNeo4j 条件批量导入
【发布时间】:2013-03-12 04:49:11
【问题描述】:

数据以 300-500 TPS 的速率持续进入系统。我需要使用以下方案将其导入 neo4j:

  1. 如果N节点不存在,则创建它
  2. 如果关系 N-[rel:rel_type]->X 不存在,则创建它
  3. 增加相对重量

使用 REST 批处理似乎无法解决问题。 不同的密码查询太长,因为它们会生成许多小事务。

Gremlin 的运行速度要快得多。我在数组中收集 gremlin 脚本的参数并将其作为批处理执行。但即使我几乎无法达到 300 TPS 的速度。

我应该提一下,除了会有大约 500 TPS 的查询流:

START N=node(...) MATCH N-[rel:rel_type]->X return rel.weight,X.name;

堆大小设置为 5 Gb。其他选项:

-XX:MaxPermSize=1G -XX:+CMSClassUnloadingEnabled -XX:+UseParallelGC -XX:+UseNUMA

导入此类数据的最佳方式和配置是什么?

【问题讨论】:

  • 您是否尝试过在不使用 cypher 或 gremlin 的情况下使用 REST 批量插入?批处理在单个事务上运行,我得到了相当不错的性能(特别是如果执行插入的进程与数据库在同一个盒子上)

标签: neo4j batch-processing


【解决方案1】:

要检查传入节点是否存在并与其他节点有关系,您可以使用创建唯一语法。

START n=node:node_index(newNode={N})
CREATE UNIQUE n-[:REL_TYPE]->x ;

要自动增加关系的权重,我会假设这样的事情(但对此没有保证,可能有更快的方法):

START n=node:node_index(newNode={N})
CREATE UNIQUE n-[rel:REL_TYPE]->x
SET rel.weight = coalesce(rel.weight?,0) +1

【讨论】:

  • 问题是 REST API 在查询/交易中只接受一个 Cypher 请求。这种方法不能保证我需要的速度。
  • 是的,以上是 2 个不同的查询。它并不是要同时使用它们。第二个查询也包含第一个查询(虽然我没有检查它,所以它可能会弹出一些语法错误)。
  • 这不是真的,Batch-REST-API 接受尽可能多的密码语句。 docs.neo4j.org/chunked/milestone/rest-api-batch-ops.html 我的表现相当不错。确保使用参数。
  • 是的,我已经将我所有的密码请求放到了一个批处理语句中,但是在那之后 neo4j 无法及时响应任何其他查询。负载太高了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2014-07-31
  • 1970-01-01
相关资源
最近更新 更多