【问题标题】:Neo4j: Import data from CSV (PostgreSQL) do not commenceNeo4j:不开始从 CSV (PostgreSQL) 导入数据
【发布时间】:2014-11-23 04:30:53
【问题描述】:

我想将一张带有自引用的表从 PostgreSQL 移动到 Neo4j。

PostgreSQL:

 COPY (SELECT * FROM "public".empbase) TO '/tmp/empbase.csv' WITH CSV header;

结果:

$ cat /tmp/empbase.csv | head
e_id,e_name,e_bossid
1,emp_no_1,
2,emp_no_2,
3,emp_no_3,
4,emp_no_4,
5,emp_no_5,3
6,emp_no_6,2
7,emp_no_7,3
8,emp_no_8,1
9,emp_no_9,4

尺寸:

$ du -h /tmp/empbase.csv
631M    /tmp/empbase.csv

我将数据导入 neo4j:

neo4j-sh (?)$ USING PERIODIC COMMIT 1000
> LOAD CSV WITH HEADERS FROM "file:/tmp/empbase.csv" AS row
> CREATE (:EmpBase:_EmpBase {     neo_eb_id:      toInt(row.e_id),
>                                 neo_eb_bossID:  toInt(row.e_bossid),
>                                 neo_eb_name:    row.e_name});

这很好用:

+-------------------+
| No data returned. |
+-------------------+
Nodes created: 20505764
Properties set: 61517288
Labels added: 41011528
846284 ms

Neo4j 控制台显示:

Location:
/home/neo4j/data/graph.db
Size:
5.54 GiB

但是我想继续每个emp 有一个boss 的关系。如此简单的emp->bossid SELF 参考。 现在我这样做:

LOAD CSV WITH HEADERS FROM "file:/tmp/empbase.csv" AS row 
MATCH (employee:EmpBase:_EmpBase    {neo_eb_id: toInt(row.e_id)})
MATCH (manager:EmpBase:_EmpBase     {neo_eb_id: toInt(row.e_bossid)})
MERGE (employee)-[:REPORTS_TO]->(manager);

但这可以工作 5-6 个小时,最后会因系统故障而中断,它会冻结系统。 我认为这可能是非常错误的。

1.我做错了什么还是No4j的错误?

2。为什么现在我从 631 MB 的 csv 中得到了 5.5 GB?

EDIT1:

$ du -h /home/neo4j/data/
20K /home/neo4j/data/graph.db/index
899M    /home/neo4j/data/graph.db/schema/index/lucene/1
899M    /home/neo4j/data/graph.db/schema/index/lucene
899M    /home/neo4j/data/graph.db/schema/index
27M /home/neo4j/data/graph.db/schema/label/lucene
27M /home/neo4j/data/graph.db/schema/label
925M    /home/neo4j/data/graph.db/schema
6,5G    /home/neo4j/data/graph.db
6,5G    /home/neo4j/data/

解决方案:

  1. 等到控制台中的:schema 显示ONLINEe 而不是POPULATING
  2. 更改配置文件中的日志大小
  3. 在第二个 csv 导入中添加 USING PERIODIC COMMIT 1000
  4. 索引仅在label

【问题讨论】:

    标签: csv neo4j


    【解决方案1】:

    只匹配一个标签:MATCH (employee:EmpBase {neo_eb_id: toInt(row.e_id)})

    您是否创建了索引:CREATE INDEX ON :EmpBase(neo_eb_id); 然后在浏览器中等待索引上线:schema

    如果是唯一的 id:CREATE CONSTRAINT ON (e:EmpBase) assert e.neo_eb_id is unique

    否则,您的匹配将扫描数据库中的所有节点以查找每个 MATCH。

    对于第二个问题,我认为是事务日志文件, 您可以在conf/neo4j.properties 中使用

    限制它们的大小

    keep_logical_logs=100M size

    实际的节点和属性文件不应该那么大。此外,您不必将 boss-id 存储在数据库中。这实际上是由关系处理的:)

    【讨论】:

    • 他似乎也忘记了第二次加载csv中的定期提交。
    • 是否应将periodic commit 应用于关系加载csv?
    • 2. bossid 是 postgreSQL 表中的字段。在 neo4j 数据库中摆脱它并仅将其存储在关系中的最佳方法是什么?
    • 匹配 (n:EmpBase) 删除 n.neo_boss_id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    相关资源
    最近更新 更多