Neo4j

docker 安装

# STEP 1
docker pull neo4j
# STEP 2
sudo docker run --name neo4j --detach --publish=7474:7474   \
        --restart=always \
        --privileged=true \
        --publish=7687:7687   \
        --volume=/home/daiyizheng/docker/neo4j/data:/data   \
        --volume=$PWD/neo4j/logs:/logs  \
        --volume=$PWD/neo4j/conf:/conf   \
        --volume=$PWD/neo4j/import:/import   \
        --env=NEO4J_dbms_memory_pagecache_size=8G   \
        --env=NEO4J_dbms_memory_heap_initial__size=4G   \
        --env=NEO4J_dbms_memory_heap_max__size=8G neo4j

docker-compose安装

docker-compose.yml

version: '3'

services:
  neo4j:
    image: neo4j:3.5.8
    container_name: neo4j
    privileged: true
    restart: always

    environment:
      - NEO4J_dbms_memory_heap_maxSize=8G
      - NEO4J_dbms_memory_heap_initial__size=4G
      - NEO4J_dbms_memory_pagecache_size=8G
      - NEO4J_AUTH=neo4j/123456  #修改默认用户密码
      - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes
      - NEO4J_dbms_security_procedures_unrestricted=apoc.*
      - NEO4J_apoc_import_file_enabled=true
      - NEO4J_dbms_shell_enabled=true
      - NEO4J_dbms_connector_http_listen__address=:7474
      - NEO4J_dbms_connector_https_listen__address=:6477
      - NEO4J_dbms_connector_bolt_listen__address=:7687

    ports:
    - "7474:7474"
    - "7687:7687"

    volumes:
    - "./data:/var/lib/neo4j/data"
    - "./logs:/var/lib/neo4j/logs"
    - "./import:/var/lib/neo4j/import"
    - "./plugins:/var/lib/neo4j/plugins"
    - "./conf:/var/lib/neo4j/conf"

docker-compose up

源码安装

要求

解压安装
tar -axvf neo4j-community-3.4.5-unix.tar.gz

修改配置
在安装目录下找到conf目录下的neo4j.conf文件
修改相应配置如下:

# 修改第22行load csv时l路径,在前面加个#,可从任意路径读取文件
#dbms.directories.import=import

# 修改35行和36行,设置JVM初始堆内存和JVM最大堆内存
# 生产环境给的JVM最大堆内存越大越好,但是要小于机器的物理内存
dbms.memory.heap.initial_size=5g
dbms.memory.heap.max_size=10g

# 修改46行,可以认为这个是缓存,如果机器配置高,这个越大越好
dbms.memory.pagecache.size=10g

# 修改54行,去掉改行的#,可以远程通过ip访问neo4j数据库
dbms.connectors.default_listen_address=0.0.0.0

# 默认 bolt端口是7687,http端口是7474,https关口是7473,不修改下面3项也可以
# 修改71行,去掉#,设置http端口为7687,端口可以自定义,只要不和其他端口冲突就行
#dbms.connector.bolt.listen_address=:7687

# 修改75行,去掉#,设置http端口为7474,端口可以自定义,只要不和其他端口冲突就行
dbms.connector.http.listen_address=:7474

# 修改79行,去掉#,设置http端口为7473,端口可以自定义,只要不和其他端口冲突就行
dbms.connector.https.listen_address=:7473

# 修改227行,去掉#,允许从远程url来load csv
dbms.security.allow_csv_import_from_file_urls=true

# 修改246行,允许使用neo4j-shell,类似于mysql 命令行之类的
dbms.shell.enabled=true

# 修改235行,去掉#,设置连接neo4j-shell的端口,一般都是localhost或者127.0.0.1,这样安全,其他地址的话,一般使用https就行
dbms.shell.host=127.0.0.1

# 修改250行,去掉#,设置neo4j-shell端口,端口可以自定义,只要不和其他端口冲突就行
dbms.shell.port=1337

# 修改254行,设置neo4j可读可写
dbms.read_only=false

启动

# 把Neo4j安装为系统服务,之后自动运行即可。
neo4j install-service #在windows
neo4j uninstall-service #在windows

# 在linux
# .用编辑器打开开机启动脚本文件
vi /etc/rc.d/rc.local
# 2.添加Neo4j 启动命令
# 在文件最后添加如下命令行:
/usr/share/neo4j/bin/neo4j start
# 其中/usr/share/neo4j/bin/是安装Neo4j的路径

进入bin目录执行./neo4j start
进入bin目录执行./neo4j stop
查看图数据库状态
进入bin目录执行./neo4j status

客户端访问
http://服务器ip地址:7474/browser/
在浏览器访问图数据库所在的机器上的7474端口(第一次访问账号neo4j,密码neo4j,会提示修改初始密码)

安装可能出现的问题

访问Neo4j验证失败(The client is unauthorized due to authentication failure.)
大概意思就是说服务器验证失败。

如果你有在浏览器上登录不同的neo4j数据库,很可能是由于缓存没有清理掉导致的。
可以试试无痕浏览来访问neo4j的web页面。
另外有还有两种解决方案:

  • 停止neo4j服务,并且删除data/dbms/auth,重新启动
    修改neo4j.conf配置文件,取消验证机制,修改如下:
  • dbms.security.auth_enabled=false

数据导入导出

# neo4j数据进行备份、还原、迁移的操作时,首先要关闭neo4j;
cd /usr/share/neo4j/bin
neo4j stop

## Neo4j not running

出现这种情况, Neo4j没有运行, 但是浏览器仍然可以访问neo4j数据库的情况, 直接执行导入数据后,是无法看到导入的数据库,
其实这种情况下Neo4j仍在运行(否则浏览器是无法然访问的),
这就需要强制杀死Neo4j进程,则执行命令

ps -ef|grep neo4j
kill -9 <对应的pid>

关闭Neo4j后, 再次用浏览器访问Neo4j,是无法访问的,说明Neo4j是关闭运行了,在此情况下,是可以执行Neo4j的数据导出与导入的.

## 执行数据导出命令
./neo4j-admin  dump --database=graph.db --to=/home/robot/Neoj_data/graph.db.dump


##执行数据导入命令
./neo4j-admin  dump --database=graph.db --to=/home/robot/Neoj_data/graph.db.dump
## 开启
neo4j start

CSV文件数据导入

Neo4j默认是从安装目录下的import文件夹导入文件的。所以先把自己要导入的数据文件放进该文件夹中。

浏览器导入csv

  1. 将文件复制到import 文件夹中
  2. 窗口中执行脚本
    http://127.0.0.1:7474/browser/窗口中执行脚本(注意,数据过大可能报错)
    可以在浏览器端或者是neo4j的console下进行这种方式的数据导入,但是这种方式只适用于20M以内的数据导入,对于大量数据是不适用的。

结点的导入
要导入的结点文件如下,第一行为数据项名:



在Neo4j的命令行中输入以下命令并执行:

# node节点
LOAD CSV WITH HEADERS FROM "file:///tags.csv" AS line
MERGE (p:tag{id:line.id,name:line.name,p:line.p,w:line.w})

## 查询所有节点:
start n=node(*) return n

具体的参数说明可以见下图:


关系的导入
要导入的关系文件如下,第一行为数据项名:


在Neo4j的命令行中输入以下命令并执行:

LOAD CSV WITH HEADERS FROM "file:///muls.csv" AS line
match (from:tag{id:line.from_id}),(to:tag{id:line.to_id})
merge (from)-[r:mul{mul:line.mul}]->(to)

参数说明:

命令行导入csv

使用条件

  • 关闭neo4j
  • 无法在原有数据库添加,只能重新生成一个数据库
  • 导入文件格式为csv

参数

  • –into:数据库名称
  • –bad-tolerance:能容忍的错误数据条数(即超过指定条数程序直接挂掉),默认1000
  • –multiline-fields:是否允许多行插入(即有些换行的数据也可读取)
  • –nodes:插入节点
  • –relationships:插入关系

将现有的数据删除

  • 停掉服务;
  • 删除 graph.db 目录;


将数据放入相应文件夹

movies.csv. 
----------------------------------------------------
movie:ID	name	:LABEL
tt0133093	The Matrix	movie
tt0234215	The Matrix Reloaded	movie
tt0242653	The Matrix Revolutions	movie
actors.csv
-----------------------------------------------------
person:ID	name	:LABEL
keanu	Keanu Reeves	person
laurence	Laurence Fishburne	person
carrieanne	Carrie-Anne Moss	person
roles.csv
------------------------------------------------------
:START_ID	role	:END_ID
keanu	Neo	tt0133093
keanu	Neo	tt0234215
keanu	Neo	tt0242653
laurence	Morpheus	tt0133093
laurence	Morpheus	tt0234215
laurence	Morpheus	tt0242653
carrieanne	Trinity	tt0133093

终端输入导入命令

neo4j-import --into ../data/databases/graph.db --nodes actors.csv --nodes movie.csv --relationships:ACTED_IN roles.csv --skip-duplicate-nodes=true --skip-bad-relationships=true --stacktrace --bad-tolerance=500000

启动数据库,查看数据

其他命令参考

./neo4j-admin import --database=pkubase.db --nodes "/home/daiyizheng/文档/NLP-NER-projet/CCKS -2020-ckbqa/data/pre-data/node.csv" --relationships "/home/daiyizheng/文档/NLP-NER-projet/CCKS -2020-ckbqa/data/pre-data/relation.csv" --ignore-extra-columns=true --ignore-missing-nodes=true --ignore-duplicate-nodes=true

或者

./bin/neo4j-import --into data/databases/graph_kg_merge_id.db --nodes:Persons data/csv_kg_merge_id/persons.csv --nodes:Industry data/csv_kg_merge_id/industry.csv --relationships:Director data/csv_kg_merge_id/director.csv --multiline-fields=true

数据导入之neo4j-admin和neo4j-import的区别

注意: 目前比较常用的批量导入数据的方法有两种,新版本提供的neo4j-import和旧版本升级的neo4j-admin import,之间有些许的不同,但在导入数据的效率上没有太多的不同。

neo4j-admin参数

usage: neo4j-admin import [--mode=csv] [--database=<name>] //模式,默认csv
                      [--additional-config=<config-file-path>]
                      [--report-file=<filename>]
                      [--nodes[:Label1:Label2]=<"file1,file2,...">] //实体文件
                      [--relationships[:RELATIONSHIP_TYPE]=<"file1,file2,...">] // 关系文件
                      [--id-type=<STRING|INTEGER|ACTUAL>]
                      [--input-encoding=<character-set>] // 编码格式
                      [--ignore-extra-columns[=<true|false>]] // 忽略多余列参数
                      [--ignore-duplicate-nodes[=<true|false>]] // 忽略重复节点参数
                      [--ignore-missing-nodes[=<true|false>]] // 忽略丢失的节点参数

或者

bin/neo4j-import [--into]  
                 [--id-type=<STRING|INTEGER|ACTUAL>]
                 [--nodes[:Label1:Label2]=<"file1,file2,...">] //实体文件
                 [--relationships[:RELATIONSHIP_TYPE]=<"file1,file2,...">] // 关系文件

Neo4j多库切换

  • 方法一:
    因为Neo4j的import导入时,只能导入一个不存的db,这就在想创建多个库时,需要去切换,Neo4j默认的库是graph.db,在./conf/neo4j.conf可以修改
# Neo4j configuration
#
# For more details and a complete list of settings, please see
# https://neo4j.com/docs/operations-manual/current/reference/configuration-settings/
#*****************************************************************

# The name of the database to mount
#dbms.active_database=graph.db

  • 方法二:
    切换多个库的方法,将新库重新连接到默认库graph.db,然后重启Neo4j
//软连接
cd ./data/databases/
ln -s graph_kg.db graph.db

//重启neo4j
cd $NEO4j_HOME/bin
./neo4j restart

// 删除软连接
ln-s test_chk  test_chk_ln
rm -rf  ./test_chk_ln