沿路径匹配关系 - 性能问题
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)
我正在设计一个全新的应用程序,它在很大程度上依赖于日期。基本上,我所做的每个查询都以一系列日期开始。我做了一个这样的日期树:
(: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)