如何在Neo4j中对关联TimeTree的邮件进行日期范围查询?
解决Neo4j时间树邮件日期范围查询问题
首先得提一句,你之前关联邮件和时间节点的语句有个小疏漏——最后写的是->(Day),这里应该用变量d也就是->(d),不然会创建一个新的Day标签节点,而不是关联已有的日期节点。不过假设你已经修正了这个问题,咱们来看符合需求的查询写法:
要查询2017年1月1日至2017年6月30日(注意哦,6月没有31日,得调整下结束日期)之间发送的邮件,这里推荐两种直观且高效的写法:
方法1:基于时间树层级精准匹配
利用你已有的Year-Month-Day层级结构,精准筛选目标日期范围:
MATCH (y:Year {year: 2017})-[:HAS_MONTH]->(m:Month)-[:HAS_DAY]->(d:Day) WHERE (m.month = 1 AND d.day >= 1) OR (m.month BETWEEN 2 AND 5) OR (m.month = 6 AND d.day <= 30) MATCH (e:Email)-[:SENT_ON]->(d) RETURN e
逻辑解释:
- 先匹配2017年下的所有月份和对应日期节点
- 通过
WHERE条件分段筛选:1月1日及以后的日期、2-5月的全部日期、6月30日及以前的日期 - 最后匹配关联到这些日期节点的邮件,返回所有符合条件的邮件
方法2:拼接日期数值做范围判断
如果你的Day节点没有存储完整日期数值,也可以通过年、月、日属性拼接成数字,再用范围判断:
MATCH (y:Year {year: 2017})-[:HAS_MONTH]->(m:Month)-[:HAS_DAY]->(d:Day) WITH y.year * 10000 + m.month * 100 + d.day AS dateNum, d WHERE dateNum BETWEEN 20170101 AND 20170630 MATCH (e:Email)-[:SENT_ON]->(d) RETURN e
逻辑解释:
- 把年、月、日拼接成8位数字(比如2017年1月1日就是
20170101) - 直接用
BETWEEN判断数值是否在目标范围内 - 关联并返回对应的邮件节点
额外小提示:
- 如果你想同时返回邮件和对应的日期信息,可以把
RETURN语句改成RETURN e, y.year AS send_year, m.month AS send_month, d.day AS send_day - 务必确认你的
SENT_ON关系确实关联到了正确的Day节点,之前的错误语句如果没修正,可能需要先清理误创建的节点和关系再重新关联
内容的提问来源于stack exchange,提问作者user9167430
相关产品推荐
相关产品推荐

