1 neo4j中文版的安装
下载链接:(自行选择版本)
https://we-yun.com/doc/neo4j-chs
中文版官方文档:
linux和Windows安装教程在官方文档都有
大家也可以去搜别的关于neo4j的安装教程,中文版和英文版都是一毛一样的
- 不要用wget去获取linux版本的neo4j,会有文件损失
- 下载传到服务器上后用tar命令解压
tar -zxvf /home/neo4j-chs-community-4.4.18-unix.tar.gz
说明:
- 这个网站有些时候是挂掉了的,也就是访问不了,所以遇到这种情况需要改天再尝试
- 注意jdk要和neo4j版本相匹配(也就是java环境必须高于neo4j的匹配版本)
我个人安装的JDK环境是java11,neo4j为4.4.18 如果你的linux上没有java环境而且你又不是root用户的话,就需要联系服务器的root用户帮你装一下啦
- 环境变量大家看自己情况配,想方便一些就配咯
- Windows就直接鼠标点点点,这就不教学啦
- linux的话我还是说一下吧:
其实很简单,打开环境变量配置文件:
# 需要有root权限,普通用户就vim ~/.bashrc文件
sudo vim /etc/profile
然后在文件结尾添加:(路径根据自己的进行修改)
export NEO4J_HOME=/home/neo4j-chs-community-4.4.18-unix
export PATH=$PATH:$NEO4J_HOME/bin
最后重载配置就好啦:
source /etc/profile
2 neo4j导入owl文件
有些同学把自己在protege辛辛苦苦手打的各种实体和关系构建出来后,发现老师居然要我们用neo4j来做后面的实验!绝望感一下就上来了!
没关系,我们来看看怎么导入protege导出的owl文件到neo4j
2.1 安装neosemantics插件并配置conf
这个插件是用来将数据库文件(rdf,xml)导入的
提前说明:protege导出的文件类型为owl,而neo4j中却不支持导入,因此我们需要将owl转为rdf
2.1.1 下载neosemantics
首先构建好环境,下载neosemantics-4.4.0.1.jar(我下的是这个版本),并放入plungins文件夹中
说明:
下载的neosemantics版本必须和你的neo4j版本相匹配,可去官网寻找:
https://github.com/neo4j-labs/neosemantics/releases
2.1.2 配置conf
根目录下的conf/neo4j.conf就是专门配置neo4j的文件,包括网络,插件,存储等配置
进入conf/neo4j.conf中并在末行加入:
dbms.unmanaged_extension_classes=semantics.extension=/rdf
这样才是代表你允许插件启动
配置完后保存退出并重启neo4j:
neo4j restart
如果你后面发现并没有导入成功,则可能是java环境或者配置文件问题,因人而异
我个人也出现了类似的问题,接下来我贴一下我对配置文件关于插件修改了的部分:
(我的宝贝你别复制粘贴,读一下配置文件很容易懂的,自己按需求来改,么么!)
# Paths of directories in the installation.
# 这里不改也是可以的,默认就是这些文件夹,但是因为我出问题了,我还是把路径精确了
dbms.directories.data=/home/neo4j-chs-community-4.4.18-unix/data
dbms.directories.plugins=/home/neo4j-chs-community-4.4.18-unix/plugins
dbms.directories.logs=/home/neo4j-chs-community-4.4.18-unix/logs
dbms.directories.lib=/home/neo4j-chs-community-4.4.18-unix/lib
dbms.directories.run=/home/neo4j-chs-community-4.4.18-unix/run
dbms.directories.licenses=/home/neo4j-chs-community-4.4.18-unix/licenses
dbms.directories.transaction.logs.root=/home/neo4j-chs-community-4.4.18-unix/data/transactions
# Other Neo4j system properties
#********************************************************************
# 这里就是刚刚导入插件的部分,这两个命令自己尝试哪个可以就用哪个,我使用的是第二个
# dbms.unmanaged_extension_classes=n10s.endpoint=/rdf
dbms.unmanaged_extension_classes=semantics.extension=/rdf
2.1.3 查看是否配置成功
进入你的数据库browser中,输入以下命令可查看所有导入的功能
call dbms.procedures()
查看是否有n10s.开头的安装包,有的话就成功了
导入成功可以发现这一行
没有的话说明你的配置文件有问题,或者版本不对,没关系,再试一下
2.2 安装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 wj.owl wj.rdf
这样你就得到了一个关于你的知识图谱的rdf文件啦,马上成功啦
突然!!
是不是发现报错了?
因为这个插件不支持高版本的java JDK,只支持JDK8!
是不是很气人?前面的neo4j又需要较高版本的JDK,而这个又和其相反
因此需要自己找一个java8的环境后才能把自己的owl文件转换为rdf格式,否则有如下报错,转换后的文件内容也是空的:
JDK不匹配报的错
如果你是Windows用户,则需要自己手动下载jdk然后配置环境
大家自己去搜切换java版本或者如何装双JDK环境吧,我就不教学啦
我个人是在学校的服务器上解决的,系统为Ubuntu20.04,因为我有服务器的root权限
懒得搞自己的Windows环境那么麻烦就在虚拟机上弄啦
我在学校服务器上的操作:
因为系统之前有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
2.3 导入转换后的rdf
一步一步地执行下面命令,自己改一下路径:
call n10s.graphconfig.init(); // 图初始化,这一步必须有,没有就导不进去
CREATE CONSTRAINT n10s_unique_uri ON (r:Resource) ASSERT r.uri IS UNIQUE; // 这一步可能也要,如果报错了的话也不用担心直接执行下一步
call n10s.rdf.import.fetch( "file:////home/neo4j-chs-community-4.4.18-unix/wj.rdf", "RDF/XML"); // 导入数据
如果导入成功,那么恭喜你啦
2.4 导入后的数据调整
导入数据后我们可以发现,很多数据类似长成了这样:
显示的节点名称也是uri,而我却只想要#后面的那个猪八戒而已
显示的是uri,前面有很大的前缀
无论是哪个节点或者关系,属性名称前面多了一个ns0__字符串,看着很不顺心
ns0__多出来了
解决方法,使用cypher语法,举个例子:
例如把uri前面的链接去掉:
MATCH (n)
SET n.uri = REPLACE(n.uri, 'http://www.semanticweb.org/25928/ontologies/2023/4/untitled-ontology-15#', '')
RETURN n
关于属性前面包含字符“ns0__”是因为导入owl文件特性所致,也可以使用cypher语言实现删除和特定的调整
但是很遗憾的是,我尝试了很多种cypher写法,cypher语法都快学烂了,但是在这个neo4j中文版上却要不就是有报错,要不就是执行成功了却没有去掉前面的字符
例如我写了如下cypher语句来删除节点,但是这样报错很奇怪:
他不让我打中括号
我还尝试写了很多其他的cypher语句来实现去掉属性键前面的ns0__字符,但是都无济于事,这个可能是中文版的一个bug导致
最终还是决定用我擅长的python连接图数据库来修改吧
from py2neo import Graph, NodeMatcher
# 连接到数据库
sever = "http://10.100.132.154:7474" # 你的网址
graph = Graph(sever, user="wj", password="xx")
# 创建 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)
修改成功!!写python还是要比写cypher舒服多啦
关系也有同样的问题,注意:
关系的ns0__字符保存在关系类型中(这是protege导出owl为rdf的特性,因为neo4j不能显示类)
所以需要修改关系类型名称即可,大家当做作业检验一下自己
我也贴个答案:
from py2neo import Graph
# 连接到数据库
sever = "http://10.100.132.154:7474"
graph = Graph(sever, user="wj", password="xx")
# 查询所有关系类型
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)
关于上面代码的说明:
匹配的关系名称中不能有中文的特殊字符,需要为英文,不然就需要你进行手动的异常处理一下
比如我的关系名字中包含了中文的特殊符号然后报错了,因为有中文引号所以py2neo传递过去会出问题:
py2neo.errors.ClientError: [Statement.SyntaxError] Invalid input '“': expected
"*"
"]"
"{"
"|"
a parameter (line 2, column 19 (offset: 27))
" MATCH (a)-[r:ns0__“教授”过刀法]->(b)"
关系标签中包含了中文特殊字符需要特殊处理一下
我是用cypher对这个语句单独处理的:
MATCH p=(b)-[r:`ns0__“教授”过刀法`]-(a)
WHERE ID(a) = 19 and ID(b)=136
create (b)-[rel:`“教授”过刀法`]->(a)
RETURN p
最后效果就是把带有中文字符的ns0__也去掉咯:
把`ns0__“教授”过刀法`改过来了
数据差不多就清洗完了,但是还有一个小问题,据说是因为owl中的类没有很好的和neo4j重构融合所致:
节点属性中还是包含ns0,例如上图的“ns0__法师”,他们其实不是属于节点的属性而是属于标签(label)
节点属性中还是包含ns0,例如上图的“ns0__法师”,他们其实不是属于节点的属性而是属于标签(label)
去除方法也差不多:
from py2neo import Graph
# 连接到数据库
sever = "http://10.100.132.154:7474"
graph = Graph(sever, user="wj", password="xx")
# 查询所有节点及其标签
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导入时的一些数据相关的东西:
包含owl__开头的一些东西其实都是导入造成的
去除方法也差不多,把上面的代码的ns0__改成owl__就行啦
我就不再阐释了,也在label标签中,大家自己去试试吧,不去除也行,反正我有强迫症去掉了
还是python操作数据库方便,大家也可以学习一下py2neo,是专门连接Neo4j图数据库
有其他想要实现的操作也可以自己用py2neo或者cypher尝试