计算列表中两个日期之间的日期数



我有给定的模式

(t1:Tag)-[c:CONNECTED_TO]-(t2:Tag)

CONNECTED_TO类型的每个关系都有一个将日期存储为列表的属性。

{
"dates": [
"2019-11-27",
"2019-01-24",
"2017-06-27"
]
}

现在,我想找到每种关系,其中一个日期介于两个日期之间。

MATCH ()-[c:CONNECTED_TO]-()
WHERE ANY (item IN c.dates WHERE date({year: 2019, month: 12}) > item >= date({year: 2019, month: 10}))
RETURN c

但除此之外,我还想计算列表属性中有多少日期介于这两个日期之间。对于上面的例子,它应该返回1,因为列表上只有一个日期在2019-12-01和2019-10-01之间。

我该怎么做?

编辑

我为我的问题找到了以下解决方案:

MATCH ()-[c:CONNECTED_TO]-()
WITH [x IN range(0,size(c.dates)-1) WHERE date({year: 2019, month: 12}) > c.dates[x] >= date({year: 2019, month: 1})] AS index, id(c) AS id
RETURN id, size(index) AS Size

遗憾的是,这个解决方案非常缓慢。日期列表的大小可以是10.000或更高。如果有人有一个更快的解决方案,我会很高兴知道。

  1. 您的MATCH正在扫描数据库中的所有节点以查找CONNECTED_TO关系。您应该使带有Tag标签的端节点符合只扫描Tag节点的条件
  2. 您应该只计算一次静态date
  3. 您应该使用REDUCE函数来计算范围内的日期,而不是列表理解(它会生成查询将丢弃的新列表(
  4. 不需要使用RANGE函数,它也会生成一个列表

此查询应该更快:

WITH date({year: 2019, month: 12}) AS a, date({year: 2019, month: 1}) AS b
MATCH (:Tag)-[c:CONNECTED_TO]-(:Tag)
RETURN ID(c) AS id, REDUCE(s=0, d IN c.dates | CASE WHEN a > d >= b THEN s + 1 ELSE s END) AS Size

最新更新