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

Neo4j 沿路径匹配关系-性能问题,neo4j,cypher,Neo4j,Cypher,我正在设计一个全新的应用程序,它很大程度上依赖于日期。基本上,我做的每个查询都以一系列日期开始。我做了一棵这样的枣树: (:Date)-[:NEXT_DAY]->(:Date)-[:NEXT_DAY]-> .... 我发现使用[:NEXT_DAY]关系查询范围和排序结果非常有效 我现在有很多文档链接到: (:Document)-[:PUBLISHED_ON]->(:Day) 更基本的查询是匹配沿日期路径发布的所有文档。这是我的实际查询: MATCH DatePath = (

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

(: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个节点。所以我的问题是:这是正常的行为吗?或者也许有更好的方法来匹配路径上的关系?

您可以进行三种优化:

首先,确保您的day属性已编制索引:

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节点将具有日期标签,并且在上一次匹配中的doc节点具有相同的标签,那么省略标签将更有效,您可以在这里查看我的答案以了解详细信息:

MATCH(e:Date{day:20150101})
带e
匹配日期路径=(e)(日期)
退货数量(单据)

您可以进行三种优化:

首先,确保您的day属性已编制索引:

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节点将具有日期标签,并且在上一次匹配中的doc节点具有相同的标签,那么省略标签将更有效,您可以在这里查看我的答案以了解详细信息:

MATCH(e:Date{day:20150101})
带e
匹配日期路径=(e)(日期)
退货数量(单据)

您可以进行三种优化:

首先,确保您的day属性已编制索引:

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节点将具有日期标签,并且在上一次匹配中的doc节点具有相同的标签,那么省略标签将更有效,您可以在这里查看我的答案以了解详细信息:

MATCH(e:Date{day:20150101})
带e
匹配日期路径=(e)(日期)
退货数量(单据)

您可以进行三种优化:

首先,确保您的day属性已编制索引:

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节点将具有日期标签,并且在上一次匹配中的doc节点具有相同的标签,那么省略标签将更有效,您可以在这里查看我的答案以了解详细信息:

MATCH(e:Date{day:20150101})
带e
匹配日期路径=(e)(日期)
退货数量(单据)

My
:Date(day)
索引还可以,但您绝对正确:首先拆分查询,然后省略查询,这是一个很大的改进!我从1800毫秒到80毫秒!非常感谢您的帮助查看GraphAware Time Tree,可能对您的用例感兴趣:My
:Date(day)
索引还可以,但您完全正确:首先拆分查询,省略查询,这是一个很大的改进!我从1800毫秒到80毫秒!非常感谢您的帮助查看GraphAware Time Tree,可能对您的用例感兴趣:My
:Date(day)
索引还可以,但您完全正确:首先拆分查询,省略查询,这是一个很大的改进!我从1800毫秒到80毫秒!非常感谢您的帮助查看GraphAware Time Tree,可能对您的用例感兴趣:My
:Date(day)
索引还可以,但您完全正确:首先拆分查询,省略查询,这是一个很大的改进!我从1800毫秒到80毫秒!非常感谢您的帮助查看GraphAware TimeTree,可能会对您的用例感兴趣: