存活时间 (TTL) - 使节点过期
有些节点并非注定永存。因此,使用 APOC,您可以通过利用模式索引和附加标签来指定节点何时从数据库中移除。一些过程有助于实现此功能。
可用过程
下表描述了可用过程
限定名称 | 类型 | 发布版本 |
---|---|---|
|
|
|
|
|
|
|
|
配置和参数
对于配置,您需要在 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
上面列出的可用过程中,有一些参数具有特定值。下表列出了有效参数的值和格式。
参数 | 描述 | 可能的值 | 示例 |
---|---|---|---|
|
需要添加存活时间标签和属性的实体(需要之前的选择语句) |
任何符合所需标准的节点或节点组 |
|
|
节点应该过期的日期时间值 |
任何以 epoch 秒或毫秒格式表示的值 |
|
|
输入值的单位度量 |
|
|
示例:存活时间
本节包含如何使用存活时间过程的示例。这些示例基于电影数据集,可以通过运行以下 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 seconds
后),节点将过期并从图中删除。运行下面的语句将不会为我们的示例图返回任何结果。
MATCH (movie:Movie)<-[directed:DIRECTED]-(person:Person)
RETURN movie, directed, person
手动过程:TTL 工作原理
您也可以通过运行以下步骤手动执行存活时间过程
-
在要过期的节点上设置
:TTL
标签和ttl
属性。
SET n:TTL
SET n.ttl = timestamp() + 3600
ttl
属性保存节点过期的时间,以**自 epoch 以来的毫秒**为单位。
-
在存活时间标签和属性上创建索引。
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