Cypher 查询为过去 24 小时内创建的节点添加 WHERE 子句
Cypher query to add WHERE clause for nodes that were created within the last 24 hours
我有一个获取所有特定类型用户的查询:
MATCH (users:User {role: "USER", hasCompletedRegistration: true})
RETURN users
还有一个 createdAt datetime 属性。只有 return 用户最干净的方法是什么,其中 createdAt 是在执行查询的最后 24 小时内?目标是每晚的 CRON 作业检查所有新注册的用户是否发送欢迎消息,从而确定具体的时间范围。
您需要将 属性 编入索引,并且您需要利用 index-backed ordering,这将从索引中获取有序条目,而不必查看和过滤所有条目:用户节点。
因此,对于您首先需要的索引:
CREATE INDEX ON :User(createdAt)
您应该使用时态类型,为此我假设使用了 dateTime 类型。
接下来是 WHERE 子句,为了利用索引,您不能应用函数或使用 createdAt
属性 中的任何访问器,需要单独放置。我们可以通过使用 dateTime()
来计算 24 小时或一天前得到当前 dateTime 时刻,并减去持续时间,然后我们将使用不等式来完成。
此外,我们建议您在不使用列表类型时使用单数而不是复数,因此 user
而不是 users
,因为它代表每行一个用户。
MATCH (user:User {role: "USER", hasCompletedRegistration: true})
WHERE user.createdAt > dateTime() - duration({days:1})
RETURN user
如果您查看查询的 EXPLAIN 计划,您希望看到正在使用的 NodeIndexSeekByRange。如果您看到正在使用任何其他索引(比如在角色或 hasCompletedRegistration 上),那么您可以提供一个规划器提示以强制它使用 createdAt:
上的索引
MATCH (user:User {role: "USER", hasCompletedRegistration: true})
USING INDEX user:User(createdAt)
WHERE user.createdAt > dateTime() - duration({days:1})
RETURN user
您可以使用函数 duration.inSeconds 并获取小时部分。 Datetime() 函数现在获取系统日期时间。
MATCH (n:User )
WHERE duration.inSeconds(n.createdAt, datetime()).hours <= 24
RETURN n
我有一个获取所有特定类型用户的查询:
MATCH (users:User {role: "USER", hasCompletedRegistration: true})
RETURN users
还有一个 createdAt datetime 属性。只有 return 用户最干净的方法是什么,其中 createdAt 是在执行查询的最后 24 小时内?目标是每晚的 CRON 作业检查所有新注册的用户是否发送欢迎消息,从而确定具体的时间范围。
您需要将 属性 编入索引,并且您需要利用 index-backed ordering,这将从索引中获取有序条目,而不必查看和过滤所有条目:用户节点。
因此,对于您首先需要的索引:
CREATE INDEX ON :User(createdAt)
您应该使用时态类型,为此我假设使用了 dateTime 类型。
接下来是 WHERE 子句,为了利用索引,您不能应用函数或使用 createdAt
属性 中的任何访问器,需要单独放置。我们可以通过使用 dateTime()
来计算 24 小时或一天前得到当前 dateTime 时刻,并减去持续时间,然后我们将使用不等式来完成。
此外,我们建议您在不使用列表类型时使用单数而不是复数,因此 user
而不是 users
,因为它代表每行一个用户。
MATCH (user:User {role: "USER", hasCompletedRegistration: true})
WHERE user.createdAt > dateTime() - duration({days:1})
RETURN user
如果您查看查询的 EXPLAIN 计划,您希望看到正在使用的 NodeIndexSeekByRange。如果您看到正在使用任何其他索引(比如在角色或 hasCompletedRegistration 上),那么您可以提供一个规划器提示以强制它使用 createdAt:
上的索引MATCH (user:User {role: "USER", hasCompletedRegistration: true})
USING INDEX user:User(createdAt)
WHERE user.createdAt > dateTime() - duration({days:1})
RETURN user
您可以使用函数 duration.inSeconds 并获取小时部分。 Datetime() 函数现在获取系统日期时间。
MATCH (n:User )
WHERE duration.inSeconds(n.createdAt, datetime()).hours <= 24
RETURN n