为什么会收到“笛卡尔乘积”警告?

Aly*_*Aly 6 neo4j graph-databases

我仍在尝试理解为什么为什么针对neo4j中的某种查询而不是针对另一种格式收到笛卡尔乘积警告。这是我设置数据库的方式:

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

然后,我尝试了以下查询:

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

但是,我收到以下警告:

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))
Run Code Online (Sandbox Code Playgroud)

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

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

当我使用此查询时:

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

我将下面的这篇文章用作资源,但是仍然不能完全回答我的问题:neo4j为什么发出警告:“此查询在断开连接的模式之间建立笛卡尔积”?

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

Bri*_*ood 6

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

MATCH (a:Foo), (b:Bar)
Run Code Online (Sandbox Code Playgroud)

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

我可以看到您正在过滤versionfor Formtextfor Question,这样会有所帮助。甚至可能只给您一个Form节点和一个Question节点。因此,只要您在Form(version)和上都有索引,Question(text)查询就应该很快。Neo4j不能告诉(或者至少目前没有实现告诉)要返回多少行,因此它发出警告说您的查询可能很慢。