如何删除旧的neo4j数据

时间:2014-08-26 07:42:47

标签: neo4j

我有一个图形数据库,其中每个节点都分配了一个ID,并且该ID实际上由时间戳组成,因此它是增量的。 我这样想我可以从数据库中删除旧数据,如下所示: MATCH (n) WHERE n.value < 1408684077231000000 WITH n LIMIT 1000 OPTIONAL MATCH (n)-[r]-() DELETE r,n RETURN COUNT(*)

问题是这太慢了。比插入新数据慢。 value已编入索引。丢弃旧数据有更好的解决方案吗?分区?

2 个答案:

答案 0 :(得分:0)

基于属性的查询总是很慢,因为需要读取所有候选节点(在本例中是图中的所有节点)以确定它们是否应该被过滤掉。

要实现更快的查询,您应该尝试限制候选节点。通常,您可以通过利用标签和/或关系来实现这一目标。

如果您想在图表上进行基于时间的查询,似乎普遍认为使用时间树效果最佳。针对特定时间范围的查询将导致遍历子图,从而大大减少查询运行时间。

有关时间图的示例,请查看this post by Michael Hunger

注意:如果您只关心数月或数天,则不需要等到几秒钟。你可以建立一个实用的时间树,直到你关心的单位。

自动过期功能很不错,但AFAIK还没有实现。

答案 1 :(得分:0)

values编入索引并不重要,因为

WHERE n.value < 1408684077231000000

没有,实际上也不能使用索引。它是一个纯粹的匹配比较,没有索引。使用索引只是为了搜索MATCH中的数据

MATCH (n {value:1408684077231000000})

但是有一个解决方案让我想到你的情况:想象你想要删除比一段时间更早的节点,让我们说一天(它将被舍入/降低到一天)。每天,您将创建一个带有标签:Helper的辅助节点,该节点实际上具有该特定日期的时间戳值。在白天,所有新创建的节点都将与该助手节点建立关系。

将来稍后,我们可以说,在一年内,您可以在那些帮助节点中搜索那些值小于您想要的值,并删除所有相关节点,如下所示:

MATCH (n:Helper) //all helper nodes
WHERE n.value < 1408684077231000000 //some day in the past
WITH n  //all helper nodes with value less than the timestamp
MATCH n--del //find out all nodes to delete
WITH n, del
OPTIONAL MATCH del-[r]-() //now continue with your query above
DELETE n, r, del
RETURN count(*)

这将适用于四舍五入到几天的时间,如果您需要更严格的时间,您可以每小时,每分钟左右创建这些辅助节点。