【图数据库实践教程】Ubuntu22.04-Neo4j中文版安装及导入owl文件(通用教程)


Ubuntu 22.04.2 LTS
如果你已经上手了服务器,你可以直接跳过第0步,第0步是为了有些从零开始的伙伴,对服务器的基础配置。

0. 环境准备

0.1 静态配置IP:192.168.1.54,及网卡类型:NAT模式
$ cat /etc/netplan/00-installer-config.yaml 
# This is the network config written by 'subiquity'
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: no
      addresses: [192.168.1.54/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [114.114.114.114, 8.8.8.8]

0.2 激活root用户:
sudo passwd root

完成输入用户密码相关步骤,即可被激活。

0.3 更改apt国内镜像源(下载快)
# 备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup

# 打开 /etc/apt/sources.list 文件(vim也行)
sudo nano /etc/apt/sources.list

# 在编辑器中,将原来的软件源列表注释掉,然后添加新的国内软件源
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse

保存文件退出后,重新运行以下命令以更新软件包列表:

sudo apt-get update
0.4 关闭相关防火墙等保证网络顺畅

关闭防火墙:

使用以下命令停止防火墙服务:sudo systemctl stop ufw
禁用防火墙服务开机自启动:sudo systemctl disable ufw

禁用AppArmor:

sudo systemctl stop apparmor
sudo systemctl disable apparmor

1. 相关软件安装

1.1 安装好服务器内的相关软件

neo4j中文版的安装链接

中文版官方文档

下载neosemantics链接
注意一下:(下载的neosemantics版本必须和你的neo4j版本相匹配)可以和我一样的版本。

安装好后:
在这里插入图片描述
通过Xftp 7将软件传入服务器里:
关于那个.jar包你可以等解压后再用xtfp传,也可以一次性传过去,待会解压后,在服务器里用mv命令将.jar包传到plugins目录下
在这里插入图片描述

1.2 然后在压缩包目录下解压:
tar -zxvf /home/jiang/neo4j-chs-community-4.4.18-unix.tar.gz

成功查看:

root@jiangda:~$ ls
neo4j-chs-community-4.4.18-unix  neo4j-chs-community-4.4.18-unix.tar.gz
root@jiangda:~$ pwd
/home/jiang

root@jiangda:~$ cd neo4j-chs-community-4.4.18-unix/plugins/
root@jiangda:~/neo4j-chs-community-4.4.18-unix/plugins$ ls
apoc-4.4.0.7-all.jar  neosemantics-4.4.0.1.jar  README.txt  rs-4.0.0.jar  rs-license.Trial.20231231.txt 

注意这里我顺便对neosemantics-4.4.0.1.jar进行了权限管理(为了实验一路畅通):

chmod 777 neosemantics-4.4.0.1.jar
chmod root:root neosemantics-4.4.0.1.jar

在这里插入图片描述

1.3 配置环境变量
vim ~/.bashrc

然后在文件末尾添加:(路径根据自己的进行修改)

export NEO4J_HOME=/home/jiang/neo4j-chs-community-4.4.18-unix
export PATH=$PATH:$NEO4J_HOME/bin

保存退出后
重载配置:

source ~/.bashrc
1.4 确保JDK环境

在Ubuntu上安装OpenJDK 11:

sudo apt update
sudo apt install openjdk-11-jdk

验证JDK是否正确安装:

java -version

设置JAVA_HOME环境变量:

vim ~/.bashrc

在打开的文件中,添加以下代码行:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

重载配置:

source ~/.bashrc

测试是否正确设置:

root@jiangda:/home/jiang# echo $JAVA_HOME
/usr/lib/jvm/java-11-openjdk-amd64

2. Neo4j的配置和使用

2.1 修改neo4j配置文件

conf/neo4j.conf就是专门配置neo4j的文件,包括网络,插件,存储等配置。

root@jiangda:~# cd /home/jiang/neo4j-chs-community-4.4.18-unix/conf/

vim neo4j.conf 

在末行加入允许插件启动:

dbms.unmanaged_extension_classes=semantics.extension=/rdf

如果你后面发现并没有导入成功,则可能是java环境或者配置文件问题。
我个人也出现了类似的问题,接下来我贴一下我对配置文件关于插件修改了的部分:
在这里插入图片描述
在这里插入图片描述
根据自身问题做出以上修改:

dbms.directories.data=/home/jiang/neo4j-chs-community-4.4.18-unix/data
dbms.directories.plugins=/home/jiang/neo4j-chs-community-4.4.18-unix/plugins
dbms.directories.logs=/home/jiang/neo4j-chs-community-4.4.18-unix/logs
dbms.directories.lib=/home/jiang/neo4j-chs-community-4.4.18-unix/lib
dbms.directories.run=/home/jiang/neo4j-chs-community-4.4.18-unix/run
dbms.directories.licenses=/home/jiang/neo4j-chs-community-4.4.18-unix/licenses
dbms.directories.transaction.logs.root=/home/jiang/neo4j-chs-community-4.4.18-unix/data/transactions
dbms.connectors.default_listen_address=192.168.1.54

dbms.connectors.default_advertised_address=192.168.1.54
启动或重启neo4j

配置完后保存退出并重启neo4j:

root@jiangda:/home/jiang/neo4j-chs-community-4.4.18-unix/conf# neo4j restart
Stopping Neo4j....... stopped.
Directories in use:
home:         /home/jiang/neo4j-chs-community-4.4.18-unix
config:       /home/jiang/neo4j-chs-community-4.4.18-unix/conf
logs:         /home/jiang/neo4j-chs-community-4.4.18-unix/logs
plugins:      /home/jiang/neo4j-chs-community-4.4.18-unix/plugins
import:       /home/jiang/neo4j-chs-community-4.4.18-unix/import
data:         /home/jiang/neo4j-chs-community-4.4.18-unix/data
certificates: /home/jiang/neo4j-chs-community-4.4.18-unix/certificates
licenses:     /home/jiang/neo4j-chs-community-4.4.18-unix/licenses
run:          /home/jiang/neo4j-chs-community-4.4.18-unix/run
Starting Neo4j.
Started neo4j (pid:7618). It is available at http://localhost:7474
There may be a short delay until the server is ready.

2.2 查看是否配置成功

好的,一切顺利,打开浏览器,默认端口为7474
输入url:http://192.168.1.54:7474
请添加图片描述
账号密码都是默认neo4j
根据提示的步骤完成

进来后在顶端窗口输入
输入以下命令可查看所有导入的功能

call dbms.procedures()

查看是否有n10s.开头的安装包,有的话就成功了
在这里插入图片描述
没有的话说明你的配置文件有问题,或者版本不对,没关系,再试一下。

3. 将owl转换为rdf方可使用

在protege中做到owl文件,我们需要转换为rdf格式后,才可在neo4j browser导入并操作。因为需要对java版本的变动,我这里不赘述,
这里可以看我好朋友的文章,写的很详细
https://zhuanlan.zhihu.com/p/622406724
我可以大概给个步骤,即将owl --> rdf

3.1 安装rdf2rdf

rdf2rdf这个插件可以把owl直接转为rdf文件,需要有java环境,下载后可以直接用
下载链接:
https://sourceforge.net/projects/rdf2rdf/

下载完成后,把这个插件和你的owl文件放在同一个文件夹下(只是为了方便不写绝对路径而已),执行如下命令:(假设我需要转换的是wj.owl文件,下载的插件为rdf2rdf-1.0.2-2.3.1.jar)

java -jar rdf2rdf-1.0.2-2.3.1.jar jd.owl jd.rdf

这样你就得到了一个关于你的知识图谱的rdf文件。

这个插件不支持高版本的java JDK,只支持JDK8!

因此需要自己找一个java8的环境后才能把自己的owl文件转换为rdf格式,否则有如下报错,转换后的文件内容也是空的

JDK不匹配报的错:
在这里插入图片描述

3.2 解决办法实操

因为系统之前有java11的环境,于是直接先卸掉java11和对应的包

# 在Terminal下输入以下命令来删除OpenJDK包
sudo apt-get purge openjdk*
# 然后卸载 OpenJDK 相关包
sudo apt-get purge icedtea-* openjdk-*
# 检查所有 OpenJDK包是否都已卸载完毕:
dpkg --list | grep -i jdk

一般apt安装的话,环境变量也不需要动

如果发现还是没有卸干净或者别的问题,可以回头检查一下你的bashrc文件里的环境变量配置

接下来是安装java8:

sudo apt-get install openjdk-8-jdk

安装好后可以通过java -version查看对应的版本是否正确

想要换回来JDK11的话再次卸掉重装吧,反正操作也不多,类似这样:

sudo apt-get install openjdk-11-jdk-headless

4. Neo4j browser的使用

4.1 导入转换后的rdf

在窗口中依次输入:
在这里插入图片描述
一步一步地执行下面命令,自己改一下路径:

// 图初始化,这一步必须有,没有就导不进去
all n10s.graphconfig.init(); 

// 这一步可能也要,如果报错了的话也不用担心直接执行下一步
CREATE CONSTRAINT n10s_unique_uri ON (r:Resource) ASSERT r.uri IS UNIQUE; 

 // 导入数据
call n10s.rdf.import.fetch( "file:home/jiang/neo4j-chs-community-4.4.18-unix/jd.rdf", "RDF/XML");
4.2 导入后的数据调整

导入数据后我们可以发现,很多数据类似长成了这样:
显示的节点名称是uri

无论是哪个节点或者关系,属性名称前面多了一个ns0__字符串,看着很不顺心

解决方法,使用cypher语法,举个例子:

例如把uri前面的链接去掉:

MATCH (n)
SET n.uri = REPLACE(n.uri, "http://www.semanticweb.org/86137/ontologies/2023/3/untitled-ontology-6#", '')
RETURN n

运行完后,效果很棒:
请添加图片描述
请添加图片描述

4.3 使用py2neo进一步对数据进行清洗

cypher写法非常不熟悉,就用自己熟悉的python连接图数据库来修改吧。
打开Pycharm,安装相关库:

pip install py2neo neo4j-driver

安装好后,依次运行程序进行清洗(大佬的代码):

代码及说明:
1.可替换刚刚的cypher语句,即一样的功效

"""
@date: 2023/4/25
@file: py2neo-test
@author: Jiangda
@desc: test

"""

from py2neo import Graph, NodeMatcher

# 连接到数据库
sever = "http://192.168.1.54:7474"  # 你的网址
graph = Graph(sever, user="neo4j", password="jd123456")

# 创建 NodeMatcher 实例
matcher = NodeMatcher(graph)
nodes = matcher.match()

# 遍历属性查找符合条件的并修改
for node in nodes:
    for key in list(node.keys()):
        if key.startswith('ns0__'):
            new_key = key[len("ns0__"):]
            node[new_key] = node[key]
            del node[key]
    graph.push(node)

2.匹配的关系名称中不能有中文的特殊字符,需要为英文,不然就需要你进行手动的异常处理一下。

"""
@date: 2023/4/25
@file: py2neo-test
@author: Jiangda
@desc: test

"""

from py2neo import Graph, NodeMatcher

# 连接到数据库
sever = "http://192.168.1.54:7474"  # 你的网址
graph = Graph(sever, user="neo4j", password="jd123456")

# 查询所有关系类型
relationship_types_query = "CALL db.relationshipTypes() YIELD relationshipType RETURN relationshipType"
relationship_types = graph.run(relationship_types_query).to_data_frame()

# 遍历所有关系类型,去掉 'ns0' 前缀并更新关系名称
for index, row in relationship_types.iterrows():
    old_type = row['relationshipType']
    if old_type.startswith("ns0__"):
        new_type = old_type[len("ns0__"):].replace("“","").replace("”","")
        update_query = f"""
        MATCH (a)-[r:{old_type}]->(b)
        CREATE (a)-[r_new:{new_type}]->(b)
        SET r_new = r
        WITH r
        DELETE r
        """
        graph.run(update_query)

3.节点属性中还是包含ns0,例如上图的“ns0__法师”,他们其实不是属于节点的属性而是属于标签(label)

"""
@date: 2023/4/25
@file: py2neo-test
@author: Jiangda
@desc: test

"""

from py2neo import Graph, NodeMatcher

# 连接到数据库
sever = "http://192.168.1.54:7474"  # 你的网址
graph = Graph(sever, user="neo4j", password="jd123456")

# 查询所有节点及其标签
query = "MATCH (n) RETURN n"
result = graph.run(query)

# 遍历所有节点
for record in result:
    node = record["n"]
    labels = node.labels

    # 删除所有标签中的ns0__字符
    for label in labels:
        if "ns0__" in label:
            print(label)
            new_label=label.replace("ns0__", "")
            node.add_label(new_label)
            node.remove_label(label)
    graph.push(node)

    # 删除所有标签中的owl__字符
    for label in labels:
        if "owl__" in label:
            print(label)
            new_label=label.replace("owl__", "")
            node.add_label(new_label)
            node.remove_label(label)
    graph.push(node)

前提是运行都没出错:
在这里插入图片描述

5. 最终效果图

在这里插入图片描述
请添加图片描述
得到了大佬的夸赞,非常开心,向他请教了很多!

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日 近 长 安 远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值