&引用;“放置分区”;Neo4j中的功能,用于删除大量节点

&引用;“放置分区”;Neo4j中的功能,用于删除大量节点,neo4j,database-partitioning,Neo4j,Database Partitioning,我正在评估Neo4j(2.0,但也可以使用1.0)在一个项目中的使用情况,在这个项目中,每天从不同的来源加载大量数据(数百万个节点),很可能在某个时候,任意的日期和来源都必须完全删除,因此必须快速完成 在Oracle中,我会使用分区,并为每个日期/源组合创建不同的分区,然后使用删除分区将它们快速删除。 有没有办法在Neo4j中获得相同的结果 目前,我发现标记并删除大量节点的最快方法是在插入数据时使用链接到它们的“分区节点”,必要时遍历数据的关系并删除所有节点,但无论是在Cypher中还是使用ja

我正在评估Neo4j(2.0,但也可以使用1.0)在一个项目中的使用情况,在这个项目中,每天从不同的来源加载大量数据(数百万个节点),很可能在某个时候,任意的日期和来源都必须完全删除,因此必须快速完成

在Oracle中,我会使用分区,并为每个日期/源组合创建不同的分区,然后使用
删除分区
将它们快速删除。 有没有办法在Neo4j中获得相同的结果

目前,我发现标记并删除大量节点的最快方法是在插入数据时使用链接到它们的“分区节点”,必要时遍历数据的关系并删除所有节点,但无论是在Cypher中还是使用javaapi,事务都会失败,因为要删除的节点数量无法存储在内存中


有没有一种最快的方法可以删除以前分配了某个标签的所有节点?

分区的另一种方法可能是对该分区中的节点应用自定义标签。节点可以携带任意数量的标签,因此:

neo4j-sh (?)$ create (n:Person:PartitionBLAH {name: "Bob"});
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 1
Properties set: 1
Labels added: 2
850 ms
neo4j-sh (?)$ match (n:PartitionBLAH) delete n;
+-------------------+
| No data returned. |
+-------------------+
Nodes deleted: 1
248 ms
通过这种方式,我们分配“PartitionBLAH”,然后删除带有该标签的所有节点(如果需要)


现在,至于哪一个更快——像您一样使用索引节点,或者使用自定义标签——我怀疑我们真的能说。这取决于您拥有的节点数量、找到“分区索引”节点的速度等因素。

您能否更详细地说明您的意思:“但无论是在Cypher还是使用Java API,事务都会失败,因为要删除的节点数量无法存储在内存中。”它们在单个事务中执行删除操作(至少是Cypher,在Java中,我会迭代连接的节点并在单个事务中删除它们,但可以将其拆分为不同的部分),并且为了允许回滚,当事务占用了大量内存时,它会保留对所有已删除节点的引用,但是Neo4j2.0如何在内部处理标签呢?它会迭代某个标签索引还是类似于Oracle分区,这样它就可以将标签标记为已整体删除,并在需要时重用其段,而无需在所有节点上进行迭代?这是开发人员的问题。我只是不知道。也许问问neo4j谷歌团队吧?好吧,我已经做了一些测试,对于热缓存,似乎使用这种标签方法要快得多。创建数据的速度也要快得多,因为通常情况下,如果要通过cypher创建数据,则必须匹配索引节点以创建从它到刚刚创建的新节点的关系。这种额外的匹配也会减慢数据的创建。