Neo4j 密码查询优化:匹配时间

Neo4j 密码查询优化:匹配时间,neo4j,cypher,Neo4j,Cypher,我创建了一个李约瑟时间树(Needham time tree()),一直到小时。 在每个小时节点上,我存储了历元时间 CREATE (h:Hour {hour: hour, day:day, month: month, year:year, time: apoc.date.parse(year +"-"+month+"-"+day+" "+hour+":00", "s", "yyyy-MM-dd hh:mm")}) 现在,我想将该小时内发生的事件链接到小时节点。我通过以下查询完成了此操作: /

我创建了一个李约瑟时间树(Needham time tree()),一直到小时。 在每个小时节点上,我存储了历元时间

CREATE (h:Hour {hour: hour, day:day, month: month, year:year, time: apoc.date.parse(year +"-"+month+"-"+day+" "+hour+":00", "s", "yyyy-MM-dd hh:mm")})
现在,我想将该小时内发生的事件链接到小时节点。我通过以下查询完成了此操作:

//Create one example event node
create (e:Event {time: apoc.date.parse("2017-11-17 13:15", "s", "yyyy-mm-dd HH:mm")})
with e
match (h:Hour) where h.time <= e.time and (h.time+3600) > e.time
merge (e)-[:IN_HOUR]->(h)
使用load CSV
迭代每个事件,将其与现有事件节点匹配,然后创建与时间树的关系

`

[已编辑]

首先,创建一个on
:Hour(time)

然后,将查询更改为以下内容(假设您将事件时间作为
event\u time
传递):

表达式
e.time/3600*3600
e.time
向下舍入到最近的小时(但仍以秒为单位)。由于
:hour(time)
已被索引,因此
匹配应该很快

注意:
USING INDEX
子句用于向密码计划者提示它应该利用索引。计划者通常不会这样做。如果您查询,您可以查看是否需要提供提示


查询无法使用索引,因为它的
WHERE
子句太复杂了。

以下是我找到的解决方案: 多亏了,我意识到我的where子句太复杂了,索引无法工作。不幸的是,cybersam的方法同样缓慢。我通过添加
timeHour
属性(并索引它)更新(:Event)节点,从
匹配中删除了计算

然后,我可以在3秒钟内加入几十万人的关系,方法是:

match (e:Event)
match (h:Hour) where h.time = e.timeHour
merge (e)-[:IN_HOUR]->(h)

请参阅我的更新答案。有时,您必须向Cypher Planner提示它需要使用索引。我已编辑此答案,以添加一个
USING index
子句,向Cypher Planner提示它应该使用索引。
CREATE INDEX ON :Hour(time);
CREATE (e:Event {time: apoc.date.parse($event_time, "s", "yyyy-MM-dd HH:mm")})
WITH e
MATCH (h:Hour {time: e.time/3600*3600})
USING INDEX h:Hour(timer)
MERGE (e)-[:IN_HOUR]->(h);
match (e:Event) set e.timeHour = e.time/3600*3600
match (e:Event)
match (h:Hour) where h.time = e.timeHour
merge (e)-[:IN_HOUR]->(h)