沿路径匹配关系 - 性能问题

Match relationships along path - Performance issues

我正在设计一个全新的应用程序,它在很大程度上依赖于日期。基本上,我所做的每个查询都以一系列日期开始。我做了一个这样的日期树:

(:Date)-[:NEXT_DAY]->(:Date)-[:NEXT_DAY]-> ....

我发现使用 [:NEXT_DAY] 关系查询范围和排序结果非常有效。

我这几天链接了很多文件:

(:Document)-[:PUBLISHED_ON]->(:Day)

更基本的查询是匹配沿日期路径发布的所有文档。这是我的实际查询:

MATCH DatePath = (b:Date)-[:NEXT*30]->(e:Date {day:20150101})
UNWIND nodes(DatePath) as date

WITH date
MATCH (doc:Document)-[:PUBLISHED_ON]->(date)

RETURN count(doc)

上面的查询对 return 不到 30K 个节点几乎用了一秒钟。所以我的问题是:这是正常行为吗?或者也许有更好的方法来匹配路径上的关系?

您可以进行三种优化:

首先,请确保您的日期 属性 已编入索引:

CREATE INDEX ON :Date(day);

其次,与其首先匹配将导致全局图形查找的模式,不如尝试拆分查询并从使用日期索引开始:

MATCH (e:Date {day:20150101})
WITH e
MATCH DatePath = (b:Date)-[:NEXT*30]->(e)
UNWIND nodes(DatePath) as date
WITH date
MATCH (doc:Document)-[:PUBLISHED_ON]->(date)
RETURN count(doc)

第三,如果您确定 (b:Date)-[:NEXT*30]->(e) 的 b 节点将具有 Date 标签,并且在最后一个 MATCH 中对 doc 节点具有相同的标签,则省略标签会更高效,你可以在这里查看我的答案以了解详细信息:

MATCH (e:Date {day:20150101})
WITH e
MATCH DatePath = (e)<-[:NEXT*30]-(b)
UNWIND nodes(DatePath) as date
WITH date
MATCH (doc)-[:PUBLISHED_ON]->(date)
RETURN count(doc)