Graph 如何在cypher查询中避免笛卡尔积,并且仍然在对象之间创建链接?

Graph 如何在cypher查询中避免笛卡尔积,并且仍然在对象之间创建链接?,graph,neo4j,cypher,cartesian-product,Graph,Neo4j,Cypher,Cartesian Product,我进口了一张有数千台设备的桌子。然后导入另一个表,其中包含20种左右的设备类型 当我在下面编写cypher查询来关联它们时,Neo4j警告我要使用笛卡尔乘积。有没有更好的方法来创建关联?我是否应该在CSV导入期间执行此操作 MATCH (te:Equipment_Type),(e:Equipment) WHERE te.type_id = e.type_id CREATE (e)-[:TYPE_OF]→(te) 更新 在CSV导入过程中,我尝试了Brian的建议,并且工作得非常出色 首先引进设

我进口了一张有数千台设备的桌子。然后导入另一个表,其中包含20种左右的设备类型

当我在下面编写cypher查询来关联它们时,Neo4j警告我要使用笛卡尔乘积。有没有更好的方法来创建关联?我是否应该在CSV导入期间执行此操作

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

在CSV导入过程中,我尝试了Brian的建议,并且工作得非常出色

  • 首先引进设备类型
  • 然后在设备上创建和索引(类型_id)
  • 修改了CSV导入期间要搜索的代码
  • 从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)
    

    考虑到您所谈论的数据的大小,这并不是什么大问题,特别是如果您在
    设备\u Type:Type\u id
    设备:Type\u id
    上有索引的话。这是对您的警告,因为当您首先在一个小数据集上编写查询中的笛卡尔项目时,它看起来很快,然后随着您获得更多数据而快速增长

    但是,是的,在CSV导入期间创建关系可能是最好的方法