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

有些节点不需要永久存在。因此,使用 APOC,你可以通过利用模式索引 (schema index) 和附加标签,指定节点从数据库中移除的时间。有一些过程可以辅助完成此操作。

可用过程

下表描述了可用的过程:

限定名称 类型 版本

apoc.ttl.expire

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

过程

Apoc Extended

apoc.ttl.expireIn

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

过程

Apoc Extended

apoc.ttl.config

函数

Apoc Extended

配置与参数

如需配置,你需要在 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

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

参数 描述 可能的值 示例

节点

要添加存活时间标签和属性的实体(需要先进行选择语句)

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

n, person, group

epochTime (纪元时间)

节点预期过期的日期时间值

以秒或毫秒格式表示的任何纪元时间值

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 Browser 可视化显示了导入的图

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" "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 中添加以下设置来配置调度:

apoc.conf
# Optional: controls the repeat frequency
apoc.ttl.schedule=120
© . This site is unofficial and not affiliated with Neo4j, Inc.