关于如何使用neo4j-admin import
,最好是参考官方文档。我这里记录的内容适用于Neo4j的3.5.22版本。
1、A quick start
假设我需要导入三类实体、两类关系,那么,可以利用5个csv文件来分别存储上述数据。其中一类实体的数据格式为:
name | id:ID | :LABEL |
---|---|---|
北京平谷区110kV变电站 | gs0 | GIS;SUBS |
北京顺义区35kV变电站 | gs2 | GIS;SUBS |
… | … | … |
对于表头,name
和id
分别为节点的属性,其中,:ID
意味着对声明id
属性的值是全局唯一的;LABEL
为节点的标签,可以设置多个标签,用;
分割。
Note:
这里说的「全局唯一」的意思是,在那些表示实体的csv中的用:ID
修饰了的属性值里,是唯一的。对于了解Neo4j的读者来说,可能会存在疑问,因为用:ID
修饰的是节点的属性而不是原生<id>。关于这一点,会在第二部分进行说明。
其余两类实体对应的csv的格式类似。
其中一类关系的数据格式为:
:START_ID | :END_ID | :TYPE |
---|---|---|
gs32 | gl0 | connect |
gs157 | gl1 | connect |
… | … | … |
其中,:START_ID
与:END_ID
均指代一个节点的进行了ID
声明的属性的值,:TYPE
指代的关系的类型。在这个例子里,没有对关系的属性进行定义。
2、Some deeper thoughts
在表示关系的csv文件中,通过将gs32
和gl0
放在一行,表明将为id
是gs32
和gl0
的节点建立一条有向关系。更准确地说,是为被:ID
修饰的属性中值为gs32
和gl0
的节点建立一条有向关系。被修饰的属性名称不一定是id
,也可以是其他的任何合法的名称。
因此,第一部分要求被:ID
修饰的属性中的值是「全局唯一」的目的,就是为了在创建关系时可以准确地定位到目标节点,无论其在哪个csv文件中。
但实际上,这种全局唯一性不是必须的:因为对于不同类的实体已经用不同的csv文件进行了区分,因此,只需要保证在当前csv文件中,被:ID
修饰的属性值是唯一的即可。这就引出了ID空间
的用法。
对上面的文件例子进行修改:
实体类别1.csv:
name | id:ID(SpaceA-ID) | :LABEL |
---|---|---|
北京平谷区110kV变电站 | 1 | GIS;SUBS |
北京顺义区35kV变电站 | 2 | GIS;SUBS |
… | … | … |
实体类别2.csv:
name | id:ID(SpaceB-ID) | :LABEL |
---|---|---|
万州区6kVⅢ线 | 1 | GIS;LINE |
合川区10kV③线 | 2 | GIS;LINE |
… | … | … |
关系.csv:
:START_ID(SpaceA-ID) | :END_ID(SpaceB-ID) | :TYPE |
---|---|---|
1 | 2 | connect |
1 | 1 | connect |
… | … | … |
可以看出,通过在关系中指定了节点的id
来自哪个ID空间,从而可以避免保证id
的全局唯一性。
3、Import nodes and relationships
在Neo4j安装的根目录位置进入shell,然后执行:
bin/neo4j-admin import --nodes=import/yx_sub.csv --nodes=import/yx_line.csv --nodes=import/yx_tran.csv \
--nodes=import/gis_sub.csv --nodes=import/gis_line.csv --nodes=import/gis_tran.csv \
--relationships=import/yx_sub_line.csv --relationships=import/yx_line_tran.csv \
--relationships=import/gis_sub_line.csv --relationships=import/gis_line_tran.csv
即,把要导入的csv文件放到根目录下的import
路径下,先配置--nodes
,再配置--relationships
,如果有多个文件,重复配置多次即可。
创建好的测试数据在这里。