如何删除旧的neo4j数据

如何删除旧的neo4j数据,neo4j,Neo4j,我有一个图形数据库,其中每个节点都分配了一个ID,这个ID实际上由一个时间戳组成,所以它是增量的。 我想这样我可以从数据库中删除旧数据,如下所示: 匹配(n) 其中n.值

我有一个图形数据库,其中每个节点都分配了一个ID,这个ID实际上由一个时间戳组成,所以它是增量的。 我想这样我可以从数据库中删除旧数据,如下所示:
匹配(n)
其中n.值<1408684077231000000
n限制为1000
可选匹配(n)-[r]-()
删除r,n返回计数(*)


问题是这太慢了。比插入新数据慢<代码>值已编制索引。是否有更好的丢弃旧数据的解决方案?分区?

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

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

如果您想在图形上执行基于时间的查询,人们普遍认为使用时间树效果最好。对特定时间范围的查询将导致遍历子图,从而大大减少查询运行时间

以时间图为例,请看

注意:如果你只关心几个月或几天的话,你不需要减少到几秒钟。你只需要建立一个实用的时间树,把你关心的单位都写下来


自动过期功能很好,但恐怕还没有实现。

索引
值并不重要,因为

WHERE n.value < 1408684077231000000
但对于您的情况,我想到了一个解决方案:假设您想要删除比某个时间早的节点,比如说一天(它将被四舍五入/简化为一天)。每天,您都将创建一个带有标签
:helper
的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(*)
MATCH(n:Helper)//所有Helper节点
其中n.value<1408684077231000000//
使用n//值小于时间戳的所有辅助节点
匹配n--del//找出要删除的所有节点
与n,del
可选匹配del-[r]-()//现在继续上面的查询
删除n、r、del
返回计数(*)

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

然后我会有巨大的图形。这会产生问题吗?考虑到内存空间否-在每个节点上都有
值之前,现在每个节点上都有一个关系+其他辅助节点(如果天=仅365个辅助节点/年)。在neo4j中,关系占用的空间小于属性+其值。您只需要在关系中使用较大的图形,而不是在服务器上占用的内存空间中使用较大的图形。由于neo4j不关心它有多少关系(除非一个节点有百万个+关系),这个建议的解决方案很好。你必须用图表思考——如果有办法将属性(即每个节点上的时间戳)分散到关系中,比执行SOB更好,但这样我将有1个节点具有百万+关系,如果我有百万+新节点/小时。是的。但对于这样一个图,可能没有一个合理的解决方案。也许可以使用
neo4j-spatial
进行一些黑客攻击,您可以在其中放置时间戳而不是gps坐标。或者尝试设置时段较短的
助手
节点-小时或数十分钟。一天只是一个例子。
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(*)