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

2023-06-1319:55:48数据库教程Comments1,963 views字数 6348阅读模式

1 neo4j中文版的安装

下载链接:(自行选择版本)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

https://we-yun.com/doc/neo4j-chs文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

中文版官方文档:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

linux和Windows安装教程在官方文档都有文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

大家也可以去搜别的关于neo4j的安装教程,中文版和英文版都是一毛一样的文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

  • 不要用wget去获取linux版本的neo4j,会有文件损失
  • 下载传到服务器上后用tar命令解压
tar -zxvf /home/neo4j-chs-community-4.4.18-unix.tar.gz

说明:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

  • 这个网站有些时候是挂掉了的,也就是访问不了,所以遇到这种情况需要改天再尝试
  • 注意jdk要和neo4j版本相匹配(也就是java环境必须高于neo4j的匹配版本)

我个人安装的JDK环境是java11,neo4j为4.4.18
如果你的linux上没有java环境而且你又不是root用户的话,就需要联系服务器的root用户帮你装一下啦文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

  • 环境变量大家看自己情况配,想方便一些就配咯
  • Windows就直接鼠标点点点,这就不教学啦
  • linux的话我还是说一下吧:

其实很简单,打开环境变量配置文件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

# 需要有root权限,普通用户就vim ~/.bashrc文件
sudo vim /etc/profile

然后在文件结尾添加:(路径根据自己的进行修改)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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

最后重载配置就好啦:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

source /etc/profile

2 neo4j导入owl文件

有些同学把自己在protege辛辛苦苦手打的各种实体和关系构建出来后,发现老师居然要我们用neo4j来做后面的实验!绝望感一下就上来了!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

没关系,我们来看看怎么导入protege导出的owl文件到neo4j文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

2.1 安装neosemantics插件并配置conf

这个插件是用来将数据库文件(rdf,xml)导入的文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

提前说明:protege导出的文件类型为owl,而neo4j中却不支持导入,因此我们需要将owl转为rdf文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

2.1.1 下载neosemantics

首先构建好环境,下载neosemantics-4.4.0.1.jar(我下的是这个版本),并放入plungins文件夹中文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

说明:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

下载的neosemantics版本必须和你的neo4j版本相匹配,可去官网寻找:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

https://github.com/neo4j-labs/neosemantics/releases文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

2.1.2 配置conf

根目录下的conf/neo4j.conf就是专门配置neo4j的文件,包括网络,插件,存储等配置文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

进入conf/neo4j.conf中并在末行加入:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

dbms.unmanaged_extension_classes=semantics.extension=/rdf

这样才是代表你允许插件启动文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

配置完后保存退出并重启neo4j:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

neo4j restart

如果你后面发现并没有导入成功,则可能是java环境或者配置文件问题,因人而异文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

我个人也出现了类似的问题,接下来我贴一下我对配置文件关于插件修改了的部分文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

(我的宝贝你别复制粘贴,读一下配置文件很容易懂的,自己按需求来改,么么!)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

# 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中,输入以下命令可查看所有导入的功能文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

call dbms.procedures()

查看是否有n10s.开头的安装包,有的话就成功了文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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

导入成功可以发现这一行文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

没有的话说明你的配置文件有问题,或者版本不对,没关系,再试一下文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

2.2 安装rdf2rdf

rdf2rdf这个插件可以把owl直接转为rdf文件,需要有java环境,下载后可以直接用文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

下载链接:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

https://sourceforge.net/projects/rdf2rdf/文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

下载完成后,把这个插件和你的owl文件放在同一个文件夹下(只是为了方便不写绝对路径而已),执行如下命令:(假设我需要转换的是wj.owl文件,下载的插件为rdf2rdf-1.0.2-2.3.1.jar)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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

这样你就得到了一个关于你的知识图谱的rdf文件啦,马上成功啦文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

突然!!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

是不是发现报错了?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

因为这个插件不支持高版本的java JDK,只支持JDK8!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

是不是很气人?前面的neo4j又需要较高版本的JDK,而这个又和其相反文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

因此需要自己找一个java8的环境后才能把自己的owl文件转换为rdf格式,否则有如下报错,转换后的文件内容也是空的:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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

JDK不匹配报的错文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

如果你是Windows用户,则需要自己手动下载jdk然后配置环境文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

大家自己去搜切换java版本或者如何装双JDK环境吧,我就不教学啦文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

我个人是在学校的服务器上解决的,系统为Ubuntu20.04,因为我有服务器的root权限文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

懒得搞自己的Windows环境那么麻烦就在虚拟机上弄啦文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

我在学校服务器上的操作:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

因为系统之前有java11的环境,于是我直接先卸掉java11和对应的包文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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

一般apt安装的话,环境变量也不需要动文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

如果发现还是没有卸干净或者别的问题,可以回头检查一下你的bashrc文件里的环境变量配置文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

接下来是安装java8:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

sudo apt-get install openjdk-8-jdk

安装好后可以通过java -version查看对应的版本是否正确文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

想要换回来JDK11的话再次卸掉重装吧,反正操作也不多,类似这样:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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

2.3 导入转换后的rdf

一步一步地执行下面命令,自己改一下路径:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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"); // 导入数据

如果导入成功,那么恭喜你啦文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

2.4 导入后的数据调整

导入数据后我们可以发现,很多数据类似长成了这样:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

显示的节点名称也是uri,而我却只想要#后面的那个猪八戒而已文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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

显示的是uri,前面有很大的前缀文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

无论是哪个节点或者关系,属性名称前面多了一个ns0__字符串,看着很不顺心文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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

ns0__多出来了文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

解决方法,使用cypher语法,举个例子:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

例如把uri前面的链接去掉:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

MATCH (n)
SET n.uri = REPLACE(n.uri, 'http://www.semanticweb.org/25928/ontologies/2023/4/untitled-ontology-15#', '')
RETURN n

关于属性前面包含字符“ns0__”是因为导入owl文件特性所致,也可以使用cypher语言实现删除和特定的调整文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

但是很遗憾的是,我尝试了很多种cypher写法,cypher语法都快学烂了,但是在这个neo4j中文版上却要不就是有报错,要不就是执行成功了却没有去掉前面的字符文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

例如我写了如下cypher语句来删除节点,但是这样报错很奇怪:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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

他不让我打中括号文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

我还尝试写了很多其他的cypher语句来实现去掉属性键前面的ns0__字符,但是都无济于事,这个可能是中文版的一个bug导致文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

最终还是决定用我擅长的python连接图数据库来修改吧文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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舒服多啦文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

关系也有同样的问题,注意:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

关系的ns0__字符保存在关系类型中(这是protege导出owl为rdf的特性,因为neo4j不能显示类)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

所以需要修改关系类型名称即可,大家当做作业检验一下自己文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

我也贴个答案:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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)

关于上面代码的说明:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

匹配的关系名称中不能有中文的特殊字符,需要为英文,不然就需要你进行手动的异常处理一下文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

比如我的关系名字中包含了中文的特殊符号然后报错了,因为有中文引号所以py2neo传递过去会出问题:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

py2neo.errors.ClientError: [Statement.SyntaxError] Invalid input '“': expected
"*"
"]"
"{"
"|"
a parameter (line 2, column 19 (offset: 27))
" MATCH (a)-[r:ns0__“教授”过刀法]->(b)"
neo4j中文版安装及导入owl文件

关系标签中包含了中文特殊字符需要特殊处理一下文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

我是用cypher对这个语句单独处理的:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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

最后效果就是把带有中文字符的ns0__也去掉咯:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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

把`ns0__“教授”过刀法`改过来了文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

数据差不多就清洗完了,但是还有一个小问题,据说是因为owl中的类没有很好的和neo4j重构融合所致:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

节点属性中还是包含ns0,例如上图的“ns0__法师”,他们其实不是属于节点的属性而是属于标签(label)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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

节点属性中还是包含ns0,例如上图的“ns0__法师”,他们其实不是属于节点的属性而是属于标签(label)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

去除方法也差不多:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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导入时的一些数据相关的东西:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

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

包含owl__开头的一些东西其实都是导入造成的文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

去除方法也差不多,把上面的代码的ns0__改成owl__就行啦文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

我就不再阐释了,也在label标签中,大家自己去试试吧,不去除也行,反正我有强迫症去掉了文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

还是python操作数据库方便,大家也可以学习一下py2neo,是专门连接Neo4j图数据库文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

有其他想要实现的操作也可以自己用py2neo或者cypher尝试文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/46946.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/46946.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定