2014-04-14 39 views
2

我正在评估Neo4j(2.0,但也可以使用1.0)的项目使用情况,其中大量数据(数百万个节点)每天从不同的来源加载,很可能在某个时间点任意日期和来源将不得不完全删除,因此必须尽快完成。Neo4j中的“drop partition”功能,删除很多节点

在Oracle中,我将使用分区并为每个日期/源组合创建一个不同的分区,然后使用DROP PARTITION删除它们将会很快。 有什么方法可以在Neo4j中获得相同的结果吗?

现在,我发现标记并最终删除很多节点的最快方式是在插入数据时使用与其链接的“分区节点”,并在必要时遍历它们的关系并删除它们中的所有节点,但是在Cypher中或使用Java API时,事务都会失败,因为要删除的节点数量不能存储在内存中。

是否有一种最快的方法来删除所有具有先前分配的标签的节点?

+0

您能否在您的意思上添加更多细节:“但是在Cypher中或使用Java API时,事务都会失败,因为要删除的节点数量不能存储在内存中。” – FrobberOfBits

+0

他们在单个事务中完成删除操作(至少Cypher,在Java中,我将迭代所连接的节点,并在单个事务中删除它们,但可以将它拆分成不同的部分),并允许回滚事务持有对所有被删除的节点,当它有很多时,它会消耗我看到的所有内存 – Jacopofar

回答

1

分区的备用方法可能是将自定义标签应用于该分区中的节点。节点可以承载尽可能多的标签,只要你喜欢,所以:

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”,然后删除所有节点与标签(需要时)。

现在,关于哪个更快 - 使用索引节点或使用自定义标签 - 我怀疑我们真的可以说。这将取决于您拥有多少节点,可以多快找到“分区索引”节点等因素。

+0

,但Neo4j2.0如何在内部处理标签?它是否会遍历某个标签索引,或者它是否像Oracle分区一样,因此它可以将标签标记为整个删除,并在需要时重新使用它的分段,而无需在所有节点上进行迭代? – Jacopofar

+0

这是开发者的问题。我只是不知道。也许问neo4j谷歌组? – FrobberOfBits

+0

好吧,所以我一直在做一些测试,对于温暖的缓存,看起来好像使用这种标签方法要快得多。创建数据的速度也快很多,因为通常情况下,如果要通过密码创建数据,则必须匹配索引节点,以便创建与它刚刚创建的新节点的关系。额外的匹配也会减慢数据创建速度。 – FrobberOfBits