如何将CSV/MySQL数据进行初始批量导入到neo4j数据库中。

5
我正在考虑用neo4j数据库替换MySQL数据库。 我是neo4j的完全初学者,想知道如何将当前MySQL数据批量插入到neo4j数据库中,以便我可以进行实验并开始学习neo4j。
关系数据库由4个表组成:PersonOrganismStoryLinksLinks描述了其他3个表中行之间的关系。 Links: ID,FromTable,FromID,ToTable,ToID,LinkType Person: ID,property_2,property_1等 Organism: ID,property_A,property_B等 Story: ID,property_x,property_y
每个ID字段都是从1开始自动递增的整数,适用于每个表。
如果不明显的话,例如将ID为3的人与ID为42的故事之间的链接,在Links表中会有一行记录,其中ID=自动增量,FromTable=Person,FromID=3,ToTable=Story,ToID=42。 尽管我使用了“from”和“to”的术语,但实际上这些链接在实践中并不是真正“有向”的。
我已经查看了Michael Hunger的batch-import,但似乎只能处理单个节点表和一个关系表,而我需要导入三种不同类型的节点和一个它们之间关系的列表。
我已经启动并运行了neo4j, 任何帮助我入门的建议都将不胜感激。
我不熟悉Java,但我使用Python和bash shell脚本。 在初始导入之后,我将使用RESTful接口和Javascript。
2个回答

9
基于Git仓库中的建议。使用Michael Hunger的batch-import,可以从一个.csv文件中导入多个节点类型。 引用Michael的话:

只需将它们全部放入一个节点文件中,您可以在某一行中没有值的任何属性,它将被跳过。

所以我使用的一般方法是:
将所有节点表合并到一个名为nodes的新表中:
  1. 创建一个新的表nodes,具有自动增量的newID字段和一个type字段。类型字段将记录节点数据来自哪个表
  2. 添加三个节点表中所有可能的列名,允许null。
  3. INSERT INTO nodesPersonOrganismStory中插入值,另外设置type字段为person、organism或story。将任何无关的字段留空。

在另一个新表rels中,根据sql JOIN,将新创建的newID索引添加到Links表中:

INSERT INTO rels
SELECT  
    n1.newID AS fromNodeID, 
    n2.newID AS toNodeID,
    L.LinkType,
    L.ID
FROM 
    Links L
LEFT JOIN 
    nodes n1 
    ON 
    L.fromID = n1.ID 
    AND 
    L.fromType = n1.type
LEFT JOIN 
    nodes n2 
    ON 
    L.toID = n2.ID 
    AND 
    L.toType = n2.type;

然后将这两个新表 nodesrels 导出为制表符分隔的 .csv 文件,并使用批量导入功能:

$java -server -Xmx4G -jar target/batch-import-jar-with-dependencies.jar target/graph.db nodes.csv rels.csv

很棒的东西 :) 这是由Max De Marzi制作的与ETL相关的演示文稿http://www.slideshare.net/maxdemarzi/etl-into-neo4j - Michael Hunger

1

根据您所说,您喜欢使用Python和Shell脚本进行工作,您可能还希望查看随 py2neo 一起提供的命令行工具,特别是 geoff。它使用我编写的平面文件格式来保存图形数据,因此在您的实例中,您需要从源数据构建一个平面文件,并将其插入到图形数据库中。

文件格式和服务器插件的文档在 此处,客户端应用程序的 py2neo 模块在 此处

如果文档中缺少任何内容或您想要更多关于此事的信息,请随时给我发电子邮件。

Nigel


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接