【问题标题】:How to avoid cartesian-product in a cypher query and still create links between objects?如何在密码查询中避免笛卡尔积并仍然在对象之间创建链接?
【发布时间】:2016-02-10 03:52:16
【问题描述】:

我导入了一张包含数千个设备的桌子。然后又导入了另外一张表,里面有设备的种类,大概有20种左右。

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

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

更新

在导入 CSV 期间,我尝试了 Brian 建议的方法,并且工作起来非常棒。

  1. 先导入设备类型;
  2. 然后在 Equipment(type_id) 上创建和索引;
  3. 修改了 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)

【问题讨论】:

    标签: graph neo4j cypher cartesian-product


    【解决方案1】:

    就您所说的数据大小而言,这没什么大不了的,尤其是如果您在Equipment_Type:type_idEquipment:type_id 上有索引。这是警告您,因为当您第一次在小型数据集上编写查询中的笛卡尔项目时,它看起来很快,然后随着您获得更多数据而迅速增长。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多