范围搜索在Neo4j中连接到TimeTree的电子邮件

时间:2018-01-15 12:42:04

标签: neo4j cypher

我按照以下方法在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之间发送的每封电子邮件

我如何查询?

1 个答案:

答案 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