neo4j过滤器的结果是,日期在几个周期的范围内



我需要按日期筛选访客,所以我使用这个查询

match (v:Visitor)
where datetime('2020-01-01T09:00:00.000000+13:00') <= v.at < datetime('2020-01-01T19:00:00.000000+13:00')
return count(v)

这非常简单明了。

现在我有另一个要求,我需要根据一系列日期过滤访客,比如:

match (v:Visitor)
where
datetime('2020-01-01T09:00:00.000000+13:00') <= v.at < datetime('2020-01-01T19:00:00.000000+13:00')
or
datetime('2020-01-02T09:00:00.000000+13:00') <= v.at < datetime('2020-01-02T19:00:00.000000+13:00')
or
datetime('2020-01-03T09:00:00.000000+13:00') <= v.at < datetime('2020-01-03T19:00:00.000000+13:00')
return count(v)

尽管这是有效的,但与使用不同范围执行3个不同的查询相比,它非常慢。

有没有一种方法可以在不影响性能的情况下完成上述操作?

注意:我有一个索引:访问者(在(

Cypher规划师显然还不够聪明,无法在像您这样的情况下(可能很罕见(使用索引。

然而,您可以通过使用UNION来获得3个子查询的结果(每个子查询都使用索引(,然后使用neo4j 4.0中的新CALL{}子查询来进行后UNION处理,以对3个子汇总求和,从而获得total计数。

CALL {
MATCH (v:Visitor)
WHERE datetime('2020-01-01T09:00:00.000000+13:00') <= v.at < datetime('2020-01-01T19:00:00.000000+13:00')
RETURN count(v) AS cnt
UNION
MATCH (v:Visitor)
WHERE datetime('2020-01-02T09:00:00.000000+13:00') <= v.at < datetime('2020-01-02T19:00:00.000000+13:00')
RETURN count(v) AS cnt
UNION
MATCH (v:Visitor)
WHERE datetime('2020-01-03T09:00:00.000000+13:00') <= v.at < datetime('2020-01-03T19:00:00.000000+13:00')
RETURN count(v) AS cnt
}
RETURN SUM(cnt) AS total

最新更新