如何避免密码查询中的笛卡尔积并仍然在对象之间创建链接?
How to avoid cartesian-product in a cypher query and still create links between objects?
我导入了一个table有几千个装备。然后又导入了一个table的装备种类,大概有20种。
当我在下面编写密码查询以关联它们时,Neo4j 警告我笛卡尔积。有没有更好的方法来创建关联?我应该在 CSV 导入期间完成吗?
MATCH (te:Equipment_Type),(e:Equipment)
WHERE te.type_id = e.type_id
CREATE (e)-[:TYPE_OF]→(te)
更新
在 CSV 导入过程中,我尝试了 Brian 的建议,效果非常好。
- 首先导入设备类型;
- 然后在设备上创建索引(type_id);
- 修改代码以在 CSV 导入期间进行搜索。
来自 Neo4j 控制台:
Added 100812 labels, created 100812 nodes, set 414307 properties,
created 100812 relationships, statement executed in 33902 ms.
代码:
CREATE INDEX ON :Equipment(type_id)
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "http://localhost/Equipments.csv" AS row
MERGE (e:Equipment {eqp_id: row.eqp_id, name: row.name, type_id: row.type_id})
WITH e, row
MATCH (te:Equipemnt_Type)
WHERE te.type_id = row.type_id
CREATE (e)-[:TYPE_OF]->(te)
根据您所说的数据大小,这不是什么大问题,特别是如果您在 Equipment_Type:type_id
和 Equipment:type_id
上有索引。这是警告你,因为当你第一次在一个小数据集上编写查询中的笛卡尔项目时,它看起来很快,然后随着你获得更多数据而快速增长。
但是,是的,在 CSV 导入期间创建关系可能是处理它的最佳方法。
我导入了一个table有几千个装备。然后又导入了一个table的装备种类,大概有20种。
当我在下面编写密码查询以关联它们时,Neo4j 警告我笛卡尔积。有没有更好的方法来创建关联?我应该在 CSV 导入期间完成吗?
MATCH (te:Equipment_Type),(e:Equipment)
WHERE te.type_id = e.type_id
CREATE (e)-[:TYPE_OF]→(te)
更新
在 CSV 导入过程中,我尝试了 Brian 的建议,效果非常好。
- 首先导入设备类型;
- 然后在设备上创建索引(type_id);
- 修改代码以在 CSV 导入期间进行搜索。
来自 Neo4j 控制台:
Added 100812 labels, created 100812 nodes, set 414307 properties, created 100812 relationships, statement executed in 33902 ms.
代码:
CREATE INDEX ON :Equipment(type_id)
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "http://localhost/Equipments.csv" AS row
MERGE (e:Equipment {eqp_id: row.eqp_id, name: row.name, type_id: row.type_id})
WITH e, row
MATCH (te:Equipemnt_Type)
WHERE te.type_id = row.type_id
CREATE (e)-[:TYPE_OF]->(te)
根据您所说的数据大小,这不是什么大问题,特别是如果您在 Equipment_Type:type_id
和 Equipment:type_id
上有索引。这是警告你,因为当你第一次在一个小数据集上编写查询中的笛卡尔项目时,它看起来很快,然后随着你获得更多数据而快速增长。
但是,是的,在 CSV 导入期间创建关系可能是处理它的最佳方法。