一 、安装Neo4j
- 先装java
- 注意:Neo4j 4.0 要求java必须是jdk11及以上,所以要更新java。
我首先尝试了直接装 jdk13,也按要求修改了环境变量,但 java -verison 显示我的版本还是jdk8。所以我把java全部卸载了,没有保留其他版本的java,再重新装,就ok了。
2. 配置neo4j
很简单,从官网下载需要的版本:https://neo4j.com/download/
我下载的是4.0.0 community版本。
- 将下载的压缩包解压到需要的路径上,例如:E:neo4j
- 然后运行服务器,windows下,cmd在该路径下运行binneo4j console,例如:E:neo4j>binneo4j console
出现下面的提示就连接上neo4j服务器了:
二、 通过浏览器访问neo4j
Neo4j服务器具有一个集成的浏览器,在启动neo4j服务之后,可以使用neo4j集成的浏览器管理图数据库[1]。
- 第一次访问的时候,在浏览器输入:http://localhost:7474/
默认的用户是neo4j,默认的密码是:neo4j,第一次成功connect到Neo4j服务器之后,需要重置密码。
2. 写代码
在这个输入框里写即可,注意一次只能写一个查询
使用[1]中的例子:
CREATE (n:Person { name: 'Andres', title: 'Developer' }) return n;
在节点创建之后,在Graph模式下,能够看到创建的图形,依次继续执行Cypher脚本,依次创建其他节点及关系
CREATE (n:Person { name: 'Vic', title: 'Developer' }) return n;
match(n:Person{name:"Vic"}),(m:Person{name:"Andres"}) create (n)-[r:Friend]->(m) return r;
match(n:Person{name:"Vic"}),(m:Person{name:"Andres"}) create (n)<-[r:Friend]-(m) return r;
显然这里有一个问题,出现了两个 vic 实体。这是为啥呢?因为我把CREATE (n:Person { name: 'Vic', title: 'Developer' }) return n; 执行了两遍,故需要删除一个vic
3. 删除节点[2]:
【1】先删关系,再删节点
【2】当记不得关系名时,type(r)可以查到关系名
【3】彻底删除节点标签名,需要删除前期对该标签名建立的索引
直接删节点会报错:
通过语句:MATCH(n:Person)-[r]-() return n,r 查询所有节点和关系
通过语句:MATCH(n:Person)-[r]-() DELETE n,r 删除所有节点和关系
经过一系列操作,最终得到了我想要的效果:
他们保存在neo4j - default database里
4. 断开连接:
只需在cmd里输入: Ctrl-C
5. 再次登录
依然是cmd在数据库路径下运行binneo4j console
然后浏览器输入:http://localhost:7474/,就可以看到原来保存的数据了。
三、 向neo4j数据库中批量导入csv文件
前面学习的是单个创建节点,不适合大批量导入。
- 打开bin文件下的import文件夹,将准备好的CSV文件复制进去:
2. cmd到bin文件的目录下,因为到用到的命令 neo4j-admin 在bin文件中,注意,导入的时候需要把neo4j停掉。而且删掉原来的数据库。
通过neo4j-admin import命令只可以将数据从 CSV 文件批量导入到未使用的数据库。(load data into a previously unused database).
输入命令:
neo4j-admin import --database=graph.db --ignore-extra-columns --ignore-empty-strings --id-type=STRING --skip-duplicate-nodes --bad-tolerance=10000 --nodes=E:neo4jimportxxx.csv --relationships=E:neo4jimportxxx.csv
虽然成功导入了,但全局id有许多报错,类似如下:
Duplicate input ids that would otherwise clash can be put into separate id space. Caused by:Id '3c2906a0a55a491a1dea2c1e4a28e701' is defined more than once in group 'global id space'
经过检查,发现原因在于:hash不是唯一映射[3]。 自增长ID可以解决唯一性问题,但也有其他解决全局id的办法,下面说。
四、CSV处理的一点经验
- 官方指导:https://neo4j.com/docs/operations-manual/current/tutorial/import-tool/
- 电子书 Graph Databases for beginners
- neo4j 属性图知识:
- 解决全局id冲突的问题:通过定义 ID space
前面提到了这个问题,全局id冲突。因为默认情况下,import 假定节点标识符在全局节点文件中是唯一的。但在许多情况下,ID在只是在每个实体文件中是唯一的。为了处理这种情况,需要定义了 ID space :ID(<ID space identifier>)
.
在 relation.csv 中,使用:START_ID(<ID space identifier>) ; END_ID(<ID space identifier>)
写在header上