我有一个图形数据库,其中每个节点都分配了一个ID,并且该ID实际上由时间戳组成,因此它是增量的。
我这样想我可以从数据库中删除旧数据,如下所示:
MATCH (n)
WHERE n.value < 1408684077231000000
WITH n LIMIT 1000
OPTIONAL MATCH (n)-[r]-()
DELETE r,n RETURN COUNT(*)
问题是这太慢了。比插入新数据慢。 value
已编入索引。丢弃旧数据有更好的解决方案吗?分区?
答案 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(*)
这将适用于四舍五入到几天的时间,如果您需要更严格的时间,您可以每小时,每分钟左右创建这些辅助节点。