Graph 在大型图形中,在所有节点上设置新标签花费的时间太长

Graph 在大型图形中,在所有节点上设置新标签花费的时间太长,graph,neo4j,Graph,Neo4j,我正在研究一个包含大约5000万个节点和4000万个关系的图表。 我需要更新每个节点。 我正在尝试为这些节点设置一个新标签,但它花费的时间太长。 标签适用于所有5000万个节点,因此操作永远不会结束。 经过一些研究,我发现Neo4j将此操作视为一个事务(我不知道是否乐观),将更改保持为未提交状态,直到结束(这永远不会以这种方式发生)。 我目前正在使用Neo4j 2.1.4,它有一个名为“使用定期提交”的特性(在早期版本中已经存在)。不幸的是,此功能与“加载CSV”功能相耦合,并不适用于每个cyp

我正在研究一个包含大约5000万个节点和4000万个关系的图表。 我需要更新每个节点。 我正在尝试为这些节点设置一个新标签,但它花费的时间太长。 标签适用于所有5000万个节点,因此操作永远不会结束。 经过一些研究,我发现Neo4j将此操作视为一个事务(我不知道是否乐观),将更改保持为未提交状态,直到结束(这永远不会以这种方式发生)。 我目前正在使用Neo4j 2.1.4,它有一个名为“使用定期提交”的特性(在早期版本中已经存在)。不幸的是,此功能与“加载CSV”功能相耦合,并不适用于每个cypher命令

密码非常简单:

match n set n:Person;
我决定使用一种变通方法,并进行某种块更新,如下所示:

match n
where not n:Person
with n
limit 500000
set n:node;
这很难看,但我还没有想出更好的解决办法

以下是我的一些谈话:

== neo4j.properties =========
neostore.nodestore.db.mapped_memory=250M
neostore.relationshipstore.db.mapped_memory=500M
neostore.propertystore.db.mapped_memory=900M
neostore.propertystore.db.strings.mapped_memory=1300M
neostore.propertystore.db.arrays.mapped_memory=1300M
keep_logical_logs=false
node_auto_indexing=true
node_keys_indexable=name_autocomplete,document
relationship_auto_indexing=true
relationship_keys_indexable=role
execution_guard_enabled=true
cache_type=weak
=============================

== neo4j-server.properties ==
org.neo4j.server.webserver.limit.executiontime=20000
org.neo4j.server.webserver.maxthreads=200
=============================
硬件规格为:

RAM: 24GB
PROC: Intel(R) Xeon(R) X5650 @ 2.67GHz, 32 cores
HDD1: 1.2TB
在此环境中,500000个节点的每个块更新需要200到400秒。我认为这是因为每个节点在开始时都满足查询,但随着更新的进行,需要扫描更多的节点以找到未标记的节点(但这也是一种预感)

那么,当一个操作需要触及图形中的每个节点时,最佳的操作过程是什么

任何有助于更好地解决此问题的帮助都将不胜感激


提前感谢。

实现这一点最有效的方法是使用batch inserter API。您可以使用以下配方:

  • 看看
    http://localhost:7474/webadmin
    并注意“节点计数”。事实上,这不是节点的数量,更重要的是使用的最高节点id——我们稍后将需要它
  • 确保完全关闭图形数据库
  • 获取graph.db目录的备份副本
  • 编写一小段java/groovy/(您喜欢的任何jvm语言…)程序,执行以下任务
  • 使用
  • 0..
    (从上面的步骤)的循环中,检查具有给定id的节点是否存在,如果存在,则抓取其当前标签并用新标签修改列表,然后使用
    setNodeLabels
    将其写回
  • 确保使用批插入器运行
    shutdown
  • 再次启动Neo4j实例

  • 您是否试过小批量的,例如50000?这是neo4j交易规模中通常提到的经验值(10k-50k,取决于您所做的工作)。我认为这确实可以解决这个问题,但这是生产数据库。我不能简单地关闭它。如果在访问图中的每个节点时,唯一的方法是关闭数据库,那么我们就真的遇到麻烦了。谢谢Stefan的回答。