生存时间 (TTL) - 节点过期

有些节点并非旨在永久存在。因此,使用 APOC,您可以通过利用模式索引和附加标签来指定节点从数据库中删除的时间。一些过程可以帮助实现这一点。

可用过程

下表描述了可用过程

限定名称 类型 版本

apoc.ttl.expire

CALL apoc.ttl.expire(node,time,'time-unit') - 通过设置 :TTL 标签和 ttl 属性,在指定时间使节点过期

过程

Apoc 扩展

apoc.ttl.expireIn

CALL apoc.ttl.expireIn(node,timeDelta,'time-unit') - 通过设置 :TTL 标签和 ttl 属性,在指定时间段后使节点过期

过程

Apoc 扩展

apoc.ttl.config

函数

Apoc 扩展

配置和参数

对于配置,您需要在 apoc.conf 中使用以下设置启用生存时间功能

apoc.conf
apoc.ttl.enabled=true

# Optional: controls the repeat frequency
# apoc.ttl.schedule=5

# Optional: controls how many nodes are deleted in each batch
# apoc.ttl.limit=5000

在上列出的可用过程中,有一些参数具有特定值。下表概述了有效参数的值和格式。

参数 描述 可能的值 示例

node

要添加生存时间标签和属性的实体或实体(需要先前的选择语句)

符合所需条件的任何节点或节点组

n, person, group

epochTime

节点应过期的日期时间值

以 epoch 秒或毫秒格式表示的任何值

1540944000, 1582209630000

time-unit

输入值的单位测量

ms, s, m, h, d(完整形式:millis, milliseconds, seconds, minutes, hours, days)

milliseconds, h

示例:生存时间

本节包含显示如何使用生存时间过程的示例。这些示例基于电影数据集,可以通过运行以下 Cypher 查询导入

CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
CREATE (Carrie:Person {name:'Carrie-Anne Moss', born:1967})
CREATE (Laurence:Person {name:'Laurence Fishburne', born:1961})
CREATE (Hugo:Person {name:'Hugo Weaving', born:1960})
CREATE (LillyW:Person {name:'Lilly Wachowski', born:1967})
CREATE (LanaW:Person {name:'Lana Wachowski', born:1965})
CREATE (JoelS:Person {name:'Joel Silver', born:1952})
CREATE
(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix),
(Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrix),
(Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrix),
(Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrix),
(LillyW)-[:DIRECTED]->(TheMatrix),
(LanaW)-[:DIRECTED]->(TheMatrix),
(JoelS)-[:PRODUCED]->(TheMatrix);

下面的 Neo4j 浏览器可视化显示了导入的图

play movies
图 1. 电影图可视化

在指定时间使节点过期

apoc.ttl.expire 过程在指定日期时间后删除节点或节点组。

要删除单个节点或节点集,我们可以在调用定义要应用生存时间标签和属性的节点的过程之前使用选择查询。然后,我们调用该过程并传入选定的节点、节点要删除的未来日期时间以及日期时间的具体性(秒、毫秒等)。

MATCH (movie:Movie)<-[produced:PRODUCED]-(person:Person)
CALL apoc.ttl.expire(person,1585176720,'s')
RETURN movie, produced, person
表 1. 结果
"movie" "produced" "person"

{"title":"The Matrix","tagline":"Welcome to the Real World","released":1999}

{}

{"name":"Joel Silver","ttl":1585176720000,"born":1952}

在指定的时间点(在本例中,2020-03-25 17:52:00 之后),节点将过期并从图中删除。运行以下语句将对我们的示例图返回无结果。

MATCH (movie:Movie)<-[produced:PRODUCED]-(person:Person)
RETURN movie, produced, person

在指定时间段后过期节点

apoc.ttl.expireIn 过程会在指定时间段后删除一个或一组节点。与上面类似的过程一样,我们可以在调用该过程之前使用选择查询来定义我们想要应用生存时间标签和属性的节点。然后,我们调用该过程并传入选定的节点、我们希望节点被删除的当前时间的时间差以及时间量的具体信息(秒、毫秒等)。

MATCH (movie:Movie)<-[directed:DIRECTED]-(person:Person)
CALL apoc.ttl.expireIn(person,120,'s')
RETURN movie, directed, person
表 2. 结果
"movie" "定向" "person"

{"title":"The Matrix","tagline":"Welcome to the Real World","released":1999}

{}

{"name":"Lana Wachowski","ttl":1618008344450,"born":1965}

{"title":"The Matrix","tagline":"Welcome to the Real World","released":1999}

{}

{"name":"Lilly Wachowski","ttl":1618008344450,"born":1967}

在指定的时间段过去后(在本例中,120 秒后),节点将过期并从图中删除。运行下面的语句将不会返回我们示例图的任何结果。

MATCH (movie:Movie)<-[directed:DIRECTED]-(person:Person)
RETURN movie, directed, person

手动流程:TTL 如何工作

您也可以通过运行以下步骤手动执行生存时间流程

  • 在您想要过期的节点上设置 :TTL 标签和 ttl 属性。

SET n:TTL
SET n.ttl = timestamp() + 3600

ttl 属性保存**节点过期的时间(以自纪元以来的毫秒为单位)**。

  • 在生存时间标签和属性上创建索引。

CREATE INDEX FOR (n:TTL) ON (n.ttl)

使用该过程时,索引将在启动/创建新数据库 30 秒后创建。

  • 删除已超过过期时间或时间长度的节点

MATCH (t:TTL) where t.ttl < timestamp() WITH t LIMIT 1000 DETACH DELETE t

使用该过程时,删除过期节点的语句将每 60 秒运行一次。您还可以通过在 apoc.conf 中添加以下设置来配置计划

apoc.conf
# Optional: controls the repeat frequency
apoc.ttl.schedule=120