【问题标题】:Cypher Query Optimization: matching timesCypher 查询优化:匹配时间
【发布时间】:2018-02-15 02:35:33
【问题描述】:

我创建了一个以小时为单位的 Needham 时间树 (http://www.markhneedham.com/blog/2014/04/19/neo4j-cypher-creating-a-time-tree-down-to-the-day/)。 在每个小时节点上,我存储了纪元时间

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)

我同时索引了事件时间和小时时间。

这对于小型事件组很有效,但是当我将事件扩展到数十万范围时,它会变得非常缓慢。 (每小时大约几百到 1000 个关系)

我怎样才能更快地做到这一点?

我都试过了

match (e:Event) ...`

using load CSV 遍历每个事件,将其与现有事件节点匹配,然后创建与时间树的关系。

`

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    [编辑]

    首先,在:Hour(time) 上创建一个index

    CREATE INDEX ON :Hour(time);
    

    然后,将您的查询更改为以下内容(假设您将事件时间作为event_time parameter 传递:

    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);
    

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

    注意:USING INDEX 子句用于向 Cypher Planner 提示它应该利用索引。计划者并不总是这样做。如果您的问题是PROFILE,您可以查看是否需要提供提示。

    您的查询不能使用索引,因为它的WHERE 子句太复杂了。

    【讨论】:

    • 我已编辑此答案以添加 USING INDEX 子句,以向 Cypher Planner 提示它应该使用索引。
    【解决方案2】:

    这是我找到的解决方案: 感谢cybersam 我意识到我的 where 子句对于索引工作来说太复杂了。不幸的是,cybersam 的方法同样缓慢。我通过添加 timeHour 属性(并对其进行索引)更新 (:Event) 节点,从 match 中删除了计算

    match (e:Event) set e.timeHour = e.time/3600*3600
    

    然后我可以在 3 秒内加入几十万的关系:

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

    【讨论】:

    • 查看我的更新答案。有时您必须向 Cypher Planner 提示它需要使用索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多