我正在制作一个包含大约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秒。我认为这是因为每个节点在开始时都满足查询,但随着更新的发生,需要扫描更多节点以找到未标记的节点(但同样,这是一种预感)。
那么当操作需要触及图中的每个节点时,最佳操作方法是什么?
任何有关更好解决方案的帮助都将受到赞赏!
提前致谢。
答案 0 :(得分:0)
实现此目的的最高效方法是使用批处理插件API。您可以使用以下配方:
http://localhost:7474/webadmin
并注意"节点数"。事实上,它不是节点的数量,它是使用中最高的节点ID - 我们以后需要它。graph.db
文件夹
0..<node count>
的循环中(来自上面的步骤)检查具有给定id的节点是否存在,如果是,则抓取其当前标签并通过新标签修改列表并使用setNodeLabels
来编写它回来。shutdown