gpt4 book ai didi

neo4j - 为什么我会收到 "Cartesian Product"警告?

转载 作者:行者123 更新时间:2023-12-02 05:25:12 25 4
gpt4 key购买 nike

我仍然试图理解为什么我在 Neo4j 中的查询中收到某种格式的笛卡尔积警告,而不是其他格式的警告。这就是我设置数据库的方式:

CREATE (q:Form {version: "1.0"})
CREATE (q:Question {text: "Sector de la empresa", active: true})

然后我尝试了以下查询:

MATCH
(f:Form {version: "1.0"}),
(q:Question {text: "Sector de la empresa"})
CREATE (f)-[:asks]->(q)
RETURN f, q

但是,我收到以下警告:

This query builds a cartesian product between disconnected patterns.
If a part of a query contains multiple disconnected patterns,
this will build a cartesian product between all those parts.
This may produce a large amount of data and slow down query processing.
While occasionally intended, it may often be possible to reformulate the
query that avoids the use of this cross product, perhaps by adding a
relationship between the different parts or by using OPTIONAL MATCH
(identifier is: (q))

当我使用以下查询时,它不会给我此警告:

MATCH (f:Form {version: "1.0"})
WITH f
(q:Question {text: "Sector de la empresa"})
CREATE (f)-[:asks]->(q)
RETURN f, q

当我使用此查询时:

MATCH (f:Form {version: "1.0"})
MATCH (q:Question {text: "Sector de la empresa"})
CREATE (f)-[:asks]->(q)
RETURN f, q

我使用了以下文章作为资源,但它仍然没有完全回答我的问题:Why does neo4j warn: "This query builds a cartesian product between disconnected patterns"?

为什么我能得到某些格式的查询的笛卡尔积,而不是其他格式的查询?另外,我不完全理解什么是笛卡尔积警告。

最佳答案

如果您MATCH两个不同的标签,而它们之间没有任何关系,那么您将收到此警告。原因是因为如果你这样做:

MATCH (a:Foo), (b:Bar)

Neo4j 的工作就是找到这两个节点的所有可能的组合。因此,对于 a 的第一个匹配,它将为 b 的每个匹配返回一行,对于 a 的第二个匹配,它将再次返回 a b 的每个匹配行,依此类推。因此,您将在结果中得到 (Foo 节点数) x (Bar 节点数) 总行数。随着数据库的增长,这对性能来说确实很糟糕。

我可以看到您正在对 FormversionQuestiontext 进行过滤,以便有助于。这甚至可能只为您提供一个 Form 节点和一个 Question 节点。因此,只要您在 Form(version)Question(text) 上有索引,查询就会非常快。 Neo4j 无法判断(或者至少目前无法判断)将返回多少行,因此它会发出警告,指出您的查询可能会很慢。

关于neo4j - 为什么我会收到 "Cartesian Product"警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37751154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com