安装neo4j中文版并导入owl文件
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
:
# 需要有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文件
。他在门生中努力工作。结果发现老师居然要我们用neo4j来做下面的实验!绝望的感觉立刻袭来!
没关系,我们看看如何将protégé导出的owl文件导入到neo4j中
2.1 安装neosemantics插件并配置conf
这个插件是用来提前导入数据库文件(rdf、xml)
注意:protege导出的文件类型是owl,但neo4j不支持其导入,所以我们必须将owl转换为rdf
2.1.1先下载neosemantics♶环境,下载neosemantis -4.4。 0.1.jar(我下载的是这个版本)放到plungins文件夹下
注意:
下载的mantic版本一定要和你的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 检查是否配置成功
进入数据库浏览器,输入以下命令即可显示所有导入的函数
call dbms.procedures()
检查是否有n10s开头的安装包,如果有则说明就会成功
如果导入成功,你会发现这一行
如果没有,请说明你的配置文件有问题,或者版本不对,没关系,再试一次
2.2 安装rdf2rdf插件
rdf2rdf要将owl直接转换为rdf文件,需要Java环境。下载完后可以直接使用
下载链接:
https://sourceforge.net/projects/rdf2rdf/
下载完成后将此插件和你的插件放在同一个文件夹中(只是为了方便,不用输入绝对路径),执行以下命令:(假设我需要转换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__ 被添加了
解决办法是使用密码语法,例如:
例如,删除前台链接uri :
MATCH (n)
SET n.uri = REPLACE(n.uri, 'http://www.semanticweb.org/25928/ontologies/2023/4/untitled-ontology-15#', '')
RETURN n
关于属性前的字符“ns0__”,这是由于导入的owl文件的属性造成的。还可以用密码语言来实现删除和特定修改
但是唉,我尝试过写密码的方法有很多种,密码语法我都快学死了,但是在这个中文版的neo4j上,要么报错,要么执行成功但是前面的字符没有去掉很多其他加密命令去掉属性键前面的字符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还是比写cipher舒服很多
关系也有同样的问题。注意:
关系的 ns0__ 字符存储在关系类型中(这是 owl 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)"
关系标签包含中文特殊字符,需要特殊处理
我用了密码来单独处理这个语句:
MATCH p=(b)-[r:`ns0__“教授”过刀法`]-(a)
WHERE ID(a) = 19 and ID(b)=136
create (b)-[rel:`“教授”过刀法`]->(a)
RETURN p
最终的效果是去掉 ns0__用汉字:
我改了方法`ns0__"教授"
数据已经清得差不多了,但是还有一个小问题。说明owl中的类与neo4j的重建没有很好的融合:
Node属性仍然包含ns0,如上图中的“ns0__Master”。这些实际上并不是节点属性,而是属于标签。
节点属性仍然包含ns0,如上图中的“ns0__Master”。 ”,其实不属于节点属性,而是属于标签(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__开头的东西,其实是导入引起的
去除的方法类似,只需要把上面代码中的ns0__改为owl__即可
不再解释了。它也在标签上。你可以自己尝试一下。不删除也没关系。反正我有强迫症,我把它去掉了
Python 跑数据库也方便。您还可以学习 py2neo。它是专门为连接Neo4j图数据库而设计的
如果你有其他想要实现的操作,你可以使用py2neo或cypher自己尝试。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。