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

时间:2015-01-16 13:41:30

标签: neo4j cypher

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

(: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)

上面的查询需要几秒钟才能返回少于30K的节点。所以我的问题是:这是正常行为吗?或者也许有更好的方法来匹配路径上的关系?

1 个答案:

答案 0 :(得分:3)

您可以进行三项优化:

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

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节点是相同的,则省略标签会更高效,你可以在这里查看我的答案:

Neo4j: label vs. indexed property?

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)