我有csv
一个包含一对多关系的文件,其中每个 type 元素A
由一个或多个 type 元素组成,B
但每个元素B
仅指一个 type 元素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 提示以下警告:
此查询在断开连接的模式之间构建笛卡尔积。如果查询的一部分包含多个不连贯的模式,这将在所有这些部分之间构建一个笛卡尔积。这可能会产生大量数据并减慢查询处理速度。虽然偶尔是有意的,但通常可以通过在不同部分之间添加关系或使用
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 抱怨第一个查询是无用的,还是第二个查询有有效的好处?