Neo4j Cypher 查询 EXPLAINed 相同,但只为一个生成警告
Neo4j Cypher queries EXPLAINed identically but warnings are generated just for one
我的 csv
文件包含一对多关系,其中 A
类型的每个元素都由一个或多个 B
类型的元素组成,但 B
类型的每个元素=15=] 仅引用 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提示如下警告:
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: (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 不会抱怨。
但是,如果我 EXPLAIN
两个查询结果相同。
neo4j 抱怨第一个查询是无用的还是第二个查询有实际好处?
虽然警告为真,但查询确实构建了笛卡尔积,在这种情况下很好,因为这正是您想要的,n
和 t
即使它们不是' t 连接,并且基数在任何情况下都会很低(可能是 1,如果这些是唯一节点)。
忽略警告并保留你的第一个查询,当你做这样的事情时,每个变量的预期节点数是 1,或者至少很小。
至于为什么第二个计划中没有出现警告,这可能只是对生成警告的查看内容的限制。这些仍然是等价的,同样适用。
请注意警告的真正原因,它是为了防止您执行以下操作:
MATCH (a:A), (b:B)
或类似的,你最终会得到一种节点与另一种节点之间的笛卡尔积。当您使用特定属性(尤其是唯一属性)缩小范围时,这只是 1x1 笛卡尔积,没问题。
我的 csv
文件包含一对多关系,其中 A
类型的每个元素都由一个或多个 B
类型的元素组成,但 B
类型的每个元素=15=] 仅引用 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提示如下警告:
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: (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 不会抱怨。
但是,如果我 EXPLAIN
两个查询结果相同。
neo4j 抱怨第一个查询是无用的还是第二个查询有实际好处?
虽然警告为真,但查询确实构建了笛卡尔积,在这种情况下很好,因为这正是您想要的,n
和 t
即使它们不是' t 连接,并且基数在任何情况下都会很低(可能是 1,如果这些是唯一节点)。
忽略警告并保留你的第一个查询,当你做这样的事情时,每个变量的预期节点数是 1,或者至少很小。
至于为什么第二个计划中没有出现警告,这可能只是对生成警告的查看内容的限制。这些仍然是等价的,同样适用。
请注意警告的真正原因,它是为了防止您执行以下操作:
MATCH (a:A), (b:B)
或类似的,你最终会得到一种节点与另一种节点之间的笛卡尔积。当您使用特定属性(尤其是唯一属性)缩小范围时,这只是 1x1 笛卡尔积,没问题。