如何解决为过去 24 小时内创建的节点添加 WHERE 子句的 Cypher 查询
#include <vector>
#include <string.h>
const char * string_to_char(std::string str)
{
return (char*) str.c_str();
return str.c_str();
return (const char*) str.c_str();
return str.data();
return const_cast<char*>(str.c_str());
std::vector<char> vec(str.begin(),str.end());
char * chr;
vec.push_back('\0');
chr = (char*) &vec[0];
//chr = & (*vec.begin());
return chr; //completely breaks both
return &str[0]; //both appear empty when given to a variable,but works fine when taken straight to std::cout
return strcpy((char *) malloc(str.length() + 1),str.c_str()); //memory leak,as when not using const
std::vector<char> copied(str.c_str(),str.c_str() + str.size() + 1);
return copied.data(); //same as when not using const
}
还有一个 createdAt 日期时间属性。在执行查询的最后 24 小时内仅返回 createdAt 的用户的最干净方法是什么?目标是每晚 CRON 作业检查所有新注册用户是否发送欢迎消息,从而检查特定时间范围。
解决方法
您需要将属性编入索引,并且您需要利用 index-backed ordering,它将从索引中获取有序条目,而不必查看和过滤所有 :User 节点。>
因此,对于您首先需要的索引:
CREATE INDEX ON :User(createdAt)
您应该使用时间类型,因此我假设使用的是 dateTime 类型。
接下来是 WHERE 子句,为了利用索引,您不能应用函数或使用来自 createdAt
属性的任何访问器,需要单独保留。我们可以通过使用 dateTime()
来计算 24 小时或一天前的当前日期时间时刻,然后减去持续时间,然后我们将使用不等式来完成。
此外,当您不使用列表类型时,我们建议使用单数而不是复数,因此 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。