我正在评估一个项目使用Neo4j(2.0,但也可以使用1.0),其中每天从不同来源加载大量数据(数百万个节点),很可能是在任何时候,任意日子和来源都必须完全删除,所以必须快速完成。
在Oracle中,我会使用分区并为每个日期/源命令创建一个不同的分区,然后使用DROP PARTITION
删除它们会很快。
有没有办法在Neo4j中获得相同的结果?
目前,我发现标记然后可能删除大量节点的最快方法是使用"分区节点"在插入数据时链接到它们并在必要时遍历它们的关系并删除所有数据,但是在Cypher或使用Java API时,事务都会失败,因为要删除的节点数量无法存储在内存中。
是否有最快的方法来删除之前分配了某些标签的所有节点?
答案 0 :(得分: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
通过这种方式,我们分配了#34; PartitionBLAH"然后删除具有该标签的所有节点(如果需要)。
现在,关于哪个更快 - 使用索引节点或使用自定义标签 - 我怀疑我们真的可以说。这取决于诸如您拥有多少节点,您可以多快找到您的"分区索引"等因素。节点,等等。