我有给定的模式
(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或更大。如果有人可以提供更快的解决方案,我将很高兴知道。
答案 0 :(得分:2)
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