存活时间 (TTL) - 节点过期
有些节点不需要永久存在。因此,使用 APOC,你可以通过利用模式索引 (schema index) 和附加标签,指定节点从数据库中移除的时间。有一些过程可以辅助完成此操作。
可用过程
下表描述了可用的过程:
| 限定名称 | 类型 | 版本 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
配置与参数
如需配置,你需要在 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
在上述列出的可用过程中,有几个具有特定值的参数。下表概述了有效参数的值和格式。
| 参数 | 描述 | 可能的值 | 示例 |
|---|---|---|---|
|
要添加存活时间标签和属性的实体(需要先进行选择语句) |
符合所需条件的任何节点或节点组 |
|
|
节点预期过期的日期时间值 |
以秒或毫秒格式表示的任何纪元时间值 |
|
|
输入值的单位度量 |
|
|
示例:存活时间
本节包含演示如何使用存活时间过程的示例。这些示例基于一个电影数据集,可以通过运行以下 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 Browser 可视化显示了导入的图
在指定时间使节点过期
apoc.ttl.expire 过程会在指定的日期时间之后删除节点或节点组。
要移除单个节点或一组节点,我们可以在调用过程之前使用选择查询来定义我们要应用存活时间标签和属性的节点。然后,我们调用该过程并传入选定的节点、我们希望节点被移除的未来日期时间,以及日期时间的精确度(秒、毫秒等)。
MATCH (movie:Movie)<-[produced:PRODUCED]-(person:Person)
CALL apoc.ttl.expire(person,1585176720,'s')
RETURN movie, produced, person
| "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
| "movie" | "directed" | "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 中添加以下设置来配置调度:
# Optional: controls the repeat frequency
apoc.ttl.schedule=120