我按照以下方法在Neo4j中创建了一个时间树:
http://www.markhneedham.com/blog/2014/04/19/neo4j-cypher-creating-a-time-tree-down-to-the-day/
然后我创建了一封电子邮件:
CREATE (e:Email {Sender:"A", Recipient:"C"})
之后我将电子邮件连接到时间树:
MATCH
(y:Year {year:2017})-[:HAS_MONTH]->(m:Month {month:2})-[:HAS_DAY]->(d:Day {day:10}),
(e:Email {Sender:"A",Recipient:"C"})
CREATE (e)-[r:SENT_ON]->(Day)
RETURN *
我在很多特定日期都这样做了,现在我希望匹配在01.01.2017和31.06.2017之间发送的每封电子邮件
我如何查询?
答案 0 :(得分:1)
如果您有时间树,图表的关系会编码一些时间关系,因此您可以使用NEXT
关系。
MATCH
(:Year {year: 2017})-[:HAS_MONTH]->(:Month {month: 1})-[:HAS_DAY]->(d1:Day {day: 1}),
(:Year {year: 2017})-[:HAS_MONTH]->(:Month {month: 6})-[:HAS_DAY]->(d2:Day {day: 30}),
(d1)-[:NEXT*]->(d)-[:NEXT*]->(d2),
(e)-[r:SENT_ON]->(d)
RETURN e
对于此特定日期范围(01.01.2017和31.06.2017),以下黑客工作并且可能比以前的解决方案更快:
MATCH
(y:Year {year: 2017})-[:HAS_MONTH]->(m:Month)-[:HAS_DAY]->(d:Day),
(e:Email {Sender:"A", Recipient:"C"}),
(e)-[r:SENT_ON]->(d)
WHERE 1 <= m.month <= 6
RETURN e
对于一般的处理日期,提供一个好的解决方案比听起来更棘手。 Neo4j还没有内置的Date / DateTime类型,因此通常将它们存储为纪元时间戳,将APOC library's utility functions存储为转换它们。
如果由于某种原因无法使用APOC,但需要比较日期范围,可能的解决方法是将日期存储为yyyymmdd
格式的数字。在这种情况下,您可以使用以下方法获取2017年1月1日至2017年6月31日之间的日期:
WHERE 20170101 <= (10000*y.year + 100*m.month + d.day) <= 20170631