如何在cypher查询中避免使用cartesian-product并仍在对象之间创建链接?

时间:2015-11-09 13:27:58

标签: graph neo4j cypher cartesian-product

我导入了一个包含数千台设备的桌子。然后导入另一个包含设备类型的表,其中包含大约20种类型。

当我写下面的密码查询来关联它们时,Neo4j警告我一个笛卡尔积。有没有更好的方法来创建关联?我应该在CSV导入期间完成吗?

MATCH (te:Equipment_Type),(e:Equipment)
WHERE te.type_id = e.type_id
CREATE (e)-[:TYPE_OF]→(te)

更新

在CSV导入期间,我尝试了布莱恩所吮吸的东西,并且像魅力一样工作。

  1. 首先导入设备类型;
  2. 然后在Equipment(type_id)上创建并编制索引;
  3. 修改了在CSV导入期间搜索的代码。
  4. 来自Neo4j控制台:

      

    添加了100812个标签,创建了100812个节点,设置了414307个属性,   创建了100812个关系,声明在33902毫秒内执行。

    守则:

    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)
    

1 个答案:

答案 0 :(得分:2)

根据您所谈论的数据大小并不是什么大问题,特别是如果您有Equipment_Type:type_idEquipment:type_id的索引。它会警告你,因为当你第一次在一个小数据集上编写一个笛卡尔项目时,它看起来会很快,然后随着你获得更多数据而快速增长。

但是,是的,在CSV导入期间创建关系可能是接近它的最佳方式。