知识图谱使用图数据库会更加高效,其存储实体——关系,以及各种属性信息。
1.neo4j安装
- 安装jdk,并配置环境,在cmd中输入javac或java -version能够通过即安装完成
- 下载neo4j,各版本下载地址:https://dist.neo4j.org
解压后在…/bin目录下,打开cmd输入neo4j.bat console,即可启动该服务,显示 neo4j staring started - 在浏览器中打开http://localhost:7474,初次登录neo4j/neo4j,登陆后根据提示修改密码
可能遇到的问题
打开no4j.ps1,修改Import-Module为绝对路径即可
2. python使用示例
入门案例:https://www.jianshu.com/p/e53175c81b22
配置完成后,再次连接时使用如下语句
neo_graph = Graph("bolt://localhost:7687", user="neo4j", password="XXXXX")
3. 常用查询语句
- 查询某类节点中包含某字符串的节点
MATCH (n: Product) WHERE n.name =~ ".*%s.*" RETURN n limit %s
- 查询两个节点之间的关系
match path=(m:Party_b)-[r:Have]-(p:Product) where %s.name = '%s' return r limit 10
- 删除一条特定的关系
match(m:Party_b)-[r:Have]-(n:Product) where m.name='AAA' and n.name='BBB' delete r
- 删除与一个节点相连的某类关系
MATCH (m:Product)-[r:SIM]-(n:Product) WHERE m.name='AAA' DELETE r
- 删除一个节点,当节点存在关系时,无法删除,需要执行上一条语句,删除其关系网,当该节点成为孤立节点时,即可删除
MATCH (n: Product) WHERE n.name ="AAA" DELETE n
- 删除某类节点
MATCH (n: R_TEL) DELETE n
- 删除2类节点之间的关系
match(m:S_ADDRESS)-[r:S]-(n:S_NAME) delete r
- 一层扩展,查找二级节点
首先查找节点类型:S_NAME中包含chenhui的,将与之关联的节点类型S_TEL种的值存为tel_list,继续查找与所有tel_list存在边类型:S的的所有关系,并返回
match (c:S_TEL)-[r2]-(d:S_NAME) where d.name =~ ".*chenhui.*" with collect(c.name) as tel_list match p=(c:S_TEL)-[r2:S]-(d) where c.name in tel_list return p
4. docker安装
4.1 创建neo4j镜像
- 下载基础docker镜像
docker pull docker.io/ansible/centos7-ansible
- 基于该镜像创建一个容器
docker run -tid --name neo4j_container --privileged=true -t docker.io/ansible/centos7-ansible /usr/sbin/init
- 进入容器
docker exec -it neo4j_container /bin/bash
- 安装centos基础环境
yum -y install vim wget screen openssh-server openssh-clients ifconfig ip initscripts tcping java-11-openjdk java-11-openjdk-devel
若neo4j版本为3.5,基础环境的java版本有所变化
yum -y install vim wget screen openssh-server openssh-clients ifconfig ip initscripts tcping java-1.8.0-openjdk java-1.8.0-openjdk-devel
- 将neo4j安装包拷贝到容器中
# Windows上下载安装包,版本号可以自己变动
https://dist.neo4j.org/neo4j-community-3.2.3-unix.tar.gz
# linux上拷贝
docker cp neo4j-community-4.0.4-unix.tar.gz neo4j_container:/opt
- 解压
docker exec -it neo4j_container /bin/bash
cd /opt
tar -zxvf neo4j-community-4.0.4-unix.tar.gz -C /opt/
# 重命名
mv neo4j-community-4.0.4 neo4j
- 修改配置文件
vim /opt/neo4j/conf/neo4j.conf
dbms.default_listen_address=0.0.0.0
- 将该容器做成镜像
docker commit neo4j_container tfws/neo4j-server:v1.0
4.2 docker启动neo4j服务
- 创建neo4j容器
docker run -d --name neo4j_server_test -p 7475:7474 -p 7688:7687 -h neo4j_server -t tfws/neo4j-server:v1.0
- 进入容器,并启动服务,此处启动命令并未在创建容器时直接使用,而是在容器创建后进入容器内手动启动,坏处:容器挂掉时需要重复该行为,而不能通过
docker restart
就可重启
docker exec -it neo4j_server_test /bin/bash
cd /opt/neo4j/bin
./neo4j start &
# 启动完成后退出容器
exit
4.2 浏览器查看neo4j服务
!!!采用无痕浏览模式!!!打开该页面
http://localhost:7474/
登录页面
本项目中使用示例
5. neo4j导入
5.1 neo4j-admin导入
官方参考文档:https://neo4j.com/docs/operations-manual/current/tools/neo4j-admin/neo4j-admin-import/
该方法必须停止neo4j服务,且只能用于数据库初始化时导入,当数据库中已存在数据时,无法导入。
5.2 Cypher CREATE导入
最灵活的导入方式,但是速度最慢。
create(n:Movie{title:'Forrest Gup'}) return n;
5.3 load csv导入
比较推荐的批量导入方式,速度还可以。
节点的csv文件格式如图
在shell窗口下执行如下命令
LOAD CSV WITH HEADERS FROM 'file:///artists-with-headers.csv' AS line CREATE (:Artist {name: line.Name, year: toInteger(line.Year)})
6. neo4j导出
- 查看neo4j的版本
call dbms.components() yield name, versions, edition unwind versions as version return name, version, edition;
- 从https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases下载与版本匹配的插件,此处下载4.0.0.11的版本
将jar包放到plugins目录下 - 配置neo4j.conf,添加如下语句
apoc.export.file.enabled=true
- 重新启动neo4j,采用如下命令查看apoc是否安装成功
!插件版本要与neo4j版本对应,否则重启neo4j会报错
return apoc.version()
# 导出CSV文件,文件位置默认在import目录
CALL apoc.export.csv.all("tender.csv",{})
# 导出特定数据
CALL apoc.export.csv.query("MATCH (a:company) RETURN id(a) as id, labels(a) as label, properties(a) AS properties", "company.csv", {})
7. neo4j数据库迁移
7.1 导出
./neo4j stop
# 不指定database则默认导出全部
./neo4j-admin dump --to=/opt/neo4j/import/customs_data
7.2 导入
./neo4j stop
# 不指定database则默认导出全部
./neo4j-admin load --from=/opt/neo4j/import/customs_data --force