5

我正在考虑用 neo4j 数据库替换 MySQL 数据库。我是 neo4j 的初学者,想知道如何将我当前的 MySQL 数据批量插入到 neo4j 数据库中,这样我就可以进行实验并开始学​​习 neo4j。

关系数据库由 4 个表组成:PersonOrganismStoryLinks。链接描述了其他 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 的故事之间的链接将在链接表 ID=autoincrement、FromTable=Person、FromID=3、ToTable=Story、ToID=42 中有一行。即使我使用“来自”和“到”这两个术语,实际链接在实践中并不是真正“定向”的。

我查看了 Michael Hunger 的批量导入,但这似乎只适用于单个节点表和一个关系表,而我希望导入三种不同类型的节点和它们之间的关系列表。

我已经启动并运行了 neo4j,任何让我入门的建议将不胜感激。

我不熟悉 Java,但我确实使用 Python 和 bash shell 脚本。初始导入后,我将使用带有 Javascript 的 RESTful 接口。

4

2 回答 2

9

基于git repo 中的建议。使用 Michael Hunger 的批量导入,可以从一个 .csv 文件中导入多种节点类型。引用迈克尔的话:

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

所以我使用的一般方法是:

将所有节点表合并到一个名为的新表中nodes

  1. 创建一个nodes具有自动递增newID字段和type字段的新表。type 字段将记录节点数据来自哪个表
  2. 从允许空值的 3 个节点表中添加所有可能的列名称。
  3. INSERT INTO nodes除了将字段设置为 person、organization 或 story之外,还有来自Person、then Organism、then的值。将任何不相关的字段留空。Storytype

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

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;

nodes然后将这两个新表导出rels为制表符分隔的 .csv 文件,并将它们与批量导入一起使用:

$java -server -Xmx4G -jar target/batch-import-jar-with-dependencies.jar target/graph.db nodes.csv rels.csv
于 2012-09-20T13:09:08.690 回答
1

正如您所说,您很高兴使用 python 和 shell 脚本,您可能还想看看py2neo 附带的命令行工具,特别是geoff. 这使用我放在一起的平面文件格式来保存图形数据,因此在您的实例中,您需要从源数据构建一个平面文件并将其插入到您的图形数据库中。

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

如果文档中缺少任何内容,或者您​​想了解更多信息,请随时给我发电子邮件

奈杰尔

于 2012-09-21T06:28:36.030 回答