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笛卡尔积,没有问题