我正在设计一个全新的应用程序,它依赖于日期。基本上,我创建的每个查询都以一系列日期开头。我做了这样一个日期树:
(: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的节点。所以我的问题是:这是正常行为吗?或者也许有更好的方法来匹配路径上的关系?
答案 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)