我有给定的模式
(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或更高。如果有人有一个更快的解决方案,我会很高兴知道。
- 您的
MATCH
正在扫描数据库中的所有节点以查找CONNECTED_TO
关系。您应该使带有Tag
标签的端节点符合只扫描Tag
节点的条件 - 您应该只计算一次静态
date
值 - 您应该使用
REDUCE
函数来计算范围内的日期,而不是列表理解(它会生成查询将丢弃的新列表( - 不需要使用
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