neo4j中文版安装及导入owl文件

2023年 7月 10日 35.7k 0

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.开头的安装包,有的话就成功了

neo4j中文版安装及导入owl文件

导入成功可以发现这一行

没有的话说明你的配置文件有问题,或者版本不对,没关系,再试一下

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格式,否则有如下报错,转换后的文件内容也是空的:

neo4j中文版安装及导入owl文件

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,而我却只想要#后面的那个猪八戒而已

neo4j中文版安装及导入owl文件

显示的是uri,前面有很大的前缀

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

neo4j中文版安装及导入owl文件

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语句来删除节点,但是这样报错很奇怪:

neo4j中文版安装及导入owl文件

他不让我打中括号

我还尝试写了很多其他的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)"

neo4j中文版安装及导入owl文件

关系标签中包含了中文特殊字符需要特殊处理一下

我是用cypher对这个语句单独处理的:

MATCH p=(b)-[r:`ns0__“教授”过刀法`]-(a)
WHERE ID(a) = 19 and ID(b)=136
create (b)-[rel:`“教授”过刀法`]->(a)
RETURN p

最后效果就是把带有中文字符的ns0__也去掉咯:

neo4j中文版安装及导入owl文件

把`ns0__“教授”过刀法`改过来了

数据差不多就清洗完了,但是还有一个小问题,据说是因为owl中的类没有很好的和neo4j重构融合所致:

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

neo4j中文版安装及导入owl文件

节点属性中还是包含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导入时的一些数据相关的东西:

neo4j中文版安装及导入owl文件

包含owl__开头的一些东西其实都是导入造成的

去除方法也差不多,把上面的代码的ns0__改成owl__就行啦

我就不再阐释了,也在label标签中,大家自己去试试吧,不去除也行,反正我有强迫症去掉了

还是python操作数据库方便,大家也可以学习一下py2neo,是专门连接Neo4j图数据库

有其他想要实现的操作也可以自己用py2neo或者cypher尝试

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论