微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为过去 24 小时内创建的节点添加 WHERE 子句的 Cypher 查询

如何解决为过去 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 举报,一经查实,本站将立刻删除。