在一个巨大的图表中,在所有节点上设置新标签需要太长时间

时间:2014-09-16 13:02:11

标签: graph neo4j

我正在制作一个包含大约5000万个节点和4000万个关系的图表。 我需要更新每个节点。 我正在尝试为这些节点设置一个新标签,但这需要太长时间。 该标签适用于所有5000万个节点,因此操作永远不会结束。 经过一些研究,我发现Neo4j将此操作视为单个事务(我不知道是否乐观),保持更改未提交,直到结束(这将永远不会以这种方式发生)。 我目前正在使用Neo4j 2.1.4,它具有一个名为“USING PERIODIC COMMIT”的功能(已在早期版本中出现)。不幸的是,此功能与“LOAD 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秒。我认为这是因为每个节点在开始时都满足查询,但随着更新的发生,需要扫描更多节点以找到未标记的节点(但同样,这是一种预感)。

那么当操作需要触及图中的每个节点时,最佳操作方法是什么?

任何有关更好解决方案的帮助都将受到赞赏!

提前致谢。

1 个答案:

答案 0 :(得分:0)

实现此目的的最高效方法是使用批处理插件API。您可以使用以下配方:

  1. 查看http://localhost:7474/webadmin并注意"节点数"。事实上,它不是节点的数量,它是使用中最高的节点ID - 我们以后需要它。
  2. 确保干净地关闭图表数据库。
  3. 获取graph.db目录的备份副本。
  4. 写一小段java / groovy /(无论你喜欢什么jvm语言......)程序执行以下任务
    1. 使用batch inserter api
    2. 打开您的graph.db文件夹
    3. 在来自0..<node count>的循环中(来自上面的步骤)检查具有给定id的节点是否存在,如果是,则抓取其当前标签并通过新标签修改列表并使用setNodeLabels来编写它回来。
    4. 确保您使用batchinserter
    5. 运行shutdown
  5. 再次启动您的Neo4j实例