NEO4J - 可选查询非常慢

时间:2021-03-17 16:22:43

标签: performance neo4j graphql match optional

我是 Neo4J 的新手,我有以下查询,如何使其更快?确实需要很长时间

future

Explain model

1 个答案:

答案 0 :(得分:0)

您获得了所有这些可选信息(应用程序、排名、注释、评论者),这有点奇怪,但您并没有对它做任何事情。你不会返回任何这些,你只会返回来自年份的信息。

如果你不打算使用它,就不要匹配它。

但如果您的目的是确保每个模式至少存在一个这样的路径,请对这些使用 WHERE 子句,如果某些可选匹配存在多个路径,这也将避免交叉产品问题。

但由于您使用的是 OPTIONAL MATCH,您似乎不希望它们在图表中的存在与否来控制是否返回年份。因此,它们没有任何用途,只会使您的查询变慢。您似乎唯一的硬性要求是 :Vintage 是由 :Wine 制成的(尽管如果所有 :Vintage 都是由 :Wine 制成的,您也可以删除该部分)。我们会保留它并移除其他的。

此外,您对总年份的计算也不正确。由于您使用的是 OPTIONAL MATCHes,因此您不关心年份是否符合那里的模式,因此我们可以在匹配单个节点之前将年份合计。

最后,不清楚您只是在寻找节点的子集,因此我们可以取消列表切片方法并使用 SKIP 和 LIMIT 代替。这也可能是您的查询花费这么长时间的原因……它正在计算所有老式信息,但您在最后只取了一部分,因此您正在做很多工作,而这些工作只是在结束。

试试这个:

MATCH (vintage:Vintage)
WHERE (vintage)-[:MADE_FROM]->(:Wine)
WITH count(vintage) as total

MATCH (vintage:Vintage)
WHERE (vintage)-[:MADE_FROM]->(:Wine)
WITH total, vintage
ORDER BY vintage.code ASC, vintage.year DESC
SKIP 0
LIMIT 10
WITH total, collect({ uid: vintage.uid, year: vintage.year, cv: vintage.referencePrice}) as vintages
RETURN { vintages:vintages, total:total} as vintage

如果这些 OPTIONAL MATCH 是有目的的,请在评论中解释,我会看看如何修改查询来处理它们。