文章目录
- 0. 环境准备
- 0.1 静态配置IP:192.168.1.54,及网卡类型:NAT模式
- 0.2 激活root用户:
- 0.3 更改apt国内镜像源(下载快)
- 0.4 关闭相关防火墙等保证网络顺畅
- 1. 相关软件安装
- 1.1 安装好服务器内的相关软件
- 1.2 然后在压缩包目录下解压:
- 1.3 配置环境变量
- 1.4 确保JDK环境
- 2. Neo4j的配置和使用
- 2.1 修改neo4j配置文件
- 启动或重启neo4j
- 2.2 查看是否配置成功
- 3. 将owl转换为rdf方可使用
- 3.1 安装rdf2rdf
- 3.2 解决办法实操
- 4. Neo4j browser的使用
- 4.1 导入转换后的rdf
- 4.2 导入后的数据调整
- 4.3 使用py2neo进一步对数据进行清洗
- 5. 最终效果图
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环境变量:
查找JDK的安装路径:
sudo update-alternatives --config javac
#我得到的是
root@jiangda:/home/jiang# sudo update-alternatives --config javac
There is only one alternative in link group javac (providing /usr/bin/javac): /usr/lib/jvm/java-11-openjdk-amd64/bin/javac
Nothing to configure.
把 /usr/lib/jvm/java-11-openjdk-amd64/bin/javac截取出来
sudo nano /etc/environment
(请注意,您可以使用任何其他文本编辑器代替nano)
在打开的文件中,添加以下代码行,并将其粘贴刚刚复制的JDK路径:
JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64/bin/javac"
等号右边即你刚刚截取的路径。
保存并关闭文件。
生效:
source /etc/environment
测试是否正确设置:
root@jiangda:/home/jiang# echo $JAVA_HOME
/usr/lib/jvm/java-11-openjdk-amd64/bin/javac
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. 最终效果图
得到了大佬的夸赞,非常开心,向他请教了很多!