Neo4j Cypher查询的解释相同,但仅针对一个查询生成警告

Neo4j Cypher查询的解释相同,但仅针对一个查询生成警告,neo4j,cypher,warnings,load-csv,Neo4j,Cypher,Warnings,Load Csv,我有一个包含一对多关系的csv文件,其中a类型的每个元素由B类型的一个或多个元素组成,但B类型的每个元素只指a类型的一个元素 例如: A | B ------------- a1 | b1 a1 | b2 a1 | b3 a2 | b4 我已经在neo4j图中创建了节点,现在我想为这些关系创建一条边 我想这个问题 LOAD CSV WITH HEADERS FROM "file:///file.csv" AS row WITH row

我有一个包含一对多关系的
csv
文件,其中
a
类型的每个元素由
B
类型的一个或多个元素组成,但
B
类型的每个元素只指
a
类型的一个元素

例如:

   A   |  B   
-------------
   a1  |  b1
   a1  |  b2
   a1  |  b3
   a2  |  b4
我已经在neo4j图中创建了节点,现在我想为这些关系创建一条边

我想这个问题

LOAD CSV WITH HEADERS FROM "file:///file.csv" AS row
WITH row
MATCH (n:A {A_ID: row.a_id}), (t:B {BID : row.b_id})
MERGE (n)-[:HAS_CONNECTION]->(t);
但Neo4j会提示以下警告:

此查询在断开连接的模式之间构建笛卡尔积。 如果查询的一部分包含多个断开连接的模式,则 将在所有这些部分之间建立笛卡尔积。今年五月 生成大量数据并减慢查询处理速度。虽然 偶尔,可能经常可以重新制定 可以通过添加 不同部分之间的关系或使用
可选匹配
(标识符为:(t))

所以我把它改成:

LOAD CSV WITH HEADERS FROM "file:///file.csv" AS row
WITH row
MATCH (t:B {BID : row.b_id})
WITH row, t
MATCH (n:A {AID: row.a_id})
MERGE (n)-[:HAS_CONNECTION]->(t);
Neo4j也没有抱怨

但是,如果我解释两个查询,结果是相同的


neo4j抱怨第一个查询是无用的还是第二个查询有有效的好处?

虽然警告是真的,但查询确实构建了笛卡尔积,在这种情况下这很好,因为这正是您想要的,
n
t
,即使它们没有连接,而且基数在任何情况下都很低(如果这些节点是唯一的,则可能为1)

忽略警告并保留第一个查询,当您执行类似操作时,其中每个变量的预期节点数为1,或者至少很小

至于为什么警告没有出现在第二个计划中,这很可能只是对生成警告的方法的一个限制。它们仍然是等价的,同样适用

请注意警告的真正原因,它是为了阻止你做以下事情:

MATCH (a:A), (b:B)
或者类似的情况下,一种节点与另一种节点之间的笛卡尔积。当你用特定属性(特别是唯一属性)缩小这些属性时,这只是1x1笛卡尔积,没有问题