自学内容网 自学内容网

Linux服务器安装 Virtuoso 数据库并导入Freebase 知识图谱数据

摘要

本文详细介绍了在Linux服务器上安装Virtuoso数据库并导入Freebase知识图谱数据的步骤。主要内容包括:

  1. 下载Freebase数据集:从Google提供的链接下载Freebase三元组数据,解压后约400G。
  2. 数据过滤:通过Python脚本过滤Freebase RDF数据,保留符合命名空间、英文文本和XML数据类型的三元组,过滤后数据约为125G。
  3. 下载并安装Virtuoso:从SourceForge下载Virtuoso数据库,解压并配置环境变量。
  4. 启动Virtuoso服务:修改配置文件以优化内存使用,启动Virtuoso服务并进入数据库。
  5. 导入数据:将过滤后的数据导入Virtuoso数据库,导入过程可能需要数小时,最终生成约42G的数据库文件。
  6. 验证导入结果:通过Python脚本或Virtuoso的Web界面验证数据是否成功导入。

本文还提供了参考文章链接,供进一步学习和 troubleshooting。

正文

下载Freebase数据集

Freebase 三元组:https://developers.google.com/freebase?hl=zh-cn

在这里插入图片描述

使用特定方法下载至服务器:

在这里插入图片描述

下载后解压大概400G
在这里插入图片描述

数据过滤

这段代码过滤的是 Freebase RDF 数据,具体包括:

  1. 符合 Freebase 命名空间的三元组。
  2. 包含英文文本的三元组。
  3. 包含 XML 数据类型的三元组。
  4. 跳过不符合规则的行(如空行、格式错误行、非英文文本行等)。

通过这种过滤,可以提取出高质量、符合特定格式的 RDF 数据,用于后续的知识图谱构建、数据分析等任务。
在这里插入图片描述

创建FilterEnglishTriplets.py

执行下列命令行开始过滤,/your/path替换为你的数据集路径:

nohup python -u FilterEnglishTriplets.py 0</your/path/freebase-rdf-latest 1>FilterFreebase 2>log_err & 
import re
import sys
 
prefixes = re.compile("@")
quotes = re.compile("[\"]")
ns = "http://rdf.freebase.com/ns/"
xml = "http://www.w3.org/2001/XMLSchema"
re_ns_ns = "^\<{0}[mg]\.[^>]+\>\t\<{0}[^>]+\>\t\<{0}[^>]+\>\t.$".format(ns)
re_ns_en = "^\<{0}[mg]\.[^>]+\>\t\<{0}[^>]+\>\t[\'\"](?!/).+[\'\"](?:\@en)?\t\.$".format(ns)
re_ns_xml = "^\<{0}[mg]\.[^>]+\>\t\<{0}[^>]+\>\t.+\<{1}\#[\w]+\>\t.$".format(ns, xml)
 
line_number = 0
for line in sys.stdin:
    line_number += 1
    # line = line.rstrip().replace(ns, 'ns:').replace(key, 'key:')
    line = line.rstrip()
    if line == "":
        sys.stdout.write('\n')
    elif prefixes.match(line):
        sys.stdout.write(line + '\n')
    elif line[-1] != ".":
        sys.stderr.write("No full stop: skipping line %d\n" % (line_number))
        continue
 
    else:
        parts = line.split("\t")
        if len(parts) != 4 or parts[0].strip() == "" or parts[1].strip() == "" or parts[2].strip() == "":
            sys.stderr.write("n tuple size != 3: skipping line %d\n" % (line_number))
            continue
 
        if re.search(re_ns_en, line):
            sys.stdout.write(line + "\n")
        elif re.search(re_ns_ns, line):
            sys.stdout.write(line + "\n")
        elif re.search(re_ns_xml, line):
            sys.stdout.write(line + "\n")
 
    if line_number % 1000000 == 0:
        #sys.stderr.write("{}: {}\n".format(part, line_number))
        sys.stderr.flush()

过滤后的数据大概为125G:

在这里插入图片描述

下载Virtuoso

下载链接:https://master.dl.sourceforge.net/project/virtuoso/virtuoso/7.2.6-dev/virtuoso-opensource.x86_64-generic_glibc25-linux-gnu.tar.gz?viasf=1

在这里插入图片描述

1. 解压缩
tar xvpfz virtuoso-opensource.x86_64-generic_glibc25-linux-gnu.tar.gz

2. 进入database目录
cd virtuoso-opensource/database/

3. 重命名配置文件
mv virtuoso.ini.sample virtuoso.ini

自己创建一个virtuoso目录,然后解压在该目录下
解压后目录如下所示:
在这里插入图片描述

配置环境变量

使用vi命令配置用户环境变量

vi ~/.bashrc

然后加入以下语句,更改语句中用户路径为你自己的用户路径,即语句中的/yourpath:

export VIRTUOSO_HOME=/yourpath/virtuoso/virtuoso-opensource
export PATH=.:${VIRTUOSO_HOME}/bin:$PATH

保存退出,然后使用以下命令使环境变量配置生效:

source ~/.bashrc

启动Virtuoso服务

参考《Freebase 知识图谱数据导入 Virtuoso 数据库》,我将内存大小修改为:

NumberOfBuffers          = 1360000
MaxDirtyBuffers          = 1000000

设置 Virtuoso 目录下的 \database\virtuoso.ini 文件中,NumberOfBuffers 和 MaxDirtyBuffers 这两项。这两项的值如果不调大,后面 freebase的导入将会很慢。这里我的电脑是32G内存,保险起见按照16G的占用进行设置的。

在这里插入图片描述

# ../bin/virtuoso-t -df # 当前窗口启动服务
../bin/virtuoso-t  # 后台 启动服务
../bin/isql 1111 dba dba # 进入数据库

此处进入数据库时发生报错:

../bin/isql 1111 dba dba
../bin/isql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory

这个错误表明在运行 …/bin/isql 时,系统找不到所需的共享库 libncurses.so.5。libncurses 是一个用于终端处理的库,许多命令行工具依赖它。以下是解决这个问题的步骤:

方法 1:安装 libncurses5
在大多数 Linux 发行版中,libncurses.so.5 是由 libncurses5 包提供的。你可以通过包管理器安装它:

sudo apt update
sudo apt install libncurses5

安装完成后,重新运行 …/bin/isql,看看问题是否解决。

输出下列内容代表启动成功:

在这里插入图片描述
在本地打开浏览器,以Chrome浏览器为例,在浏览器url栏输入:服务器IP:8890即可:
在这里插入图片描述

导入数据

在database目录下执行:
在这里插入图片描述

../bin/isql 1111 dba dba # 进入数据库

再执行下列语句:

SQL> ld_dir('.', 'FilterFreebase', 'http://freebase.com');

SQL> rdf_loader_run();

在这里插入图片描述
可以在virtuoso/virtuoso-opensource/database目录下使用下列命令行查看数据库大小,观察变化判断导入过程:

du -sh *

在这里插入图片描述

这个另一个博主大概跑了3个小时左右,最终 virtuoso.db 文件大概是 42G。

导入后清理一下 load_list。

delete from db.dba.load_list;

验证是否安装并导入成功

这时候可以有两种方式验证是否导入成功:

  1. 运行以下python文件
import json
from SPARQLWrapper import SPARQLWrapper, JSON
 
SPARQLPATH = "http://localhost:8890/sparql"
 
def test():
    try:
        sparql = SPARQLWrapper(SPARQLPATH)
        sparql_txt = """PREFIX ns: <http://rdf.freebase.com/ns/>
            SELECT distinct ?name3
            WHERE {
            ns:m.0k2kfpc ns:award.award_nominated_work.award_nominations ?e1.
            ?e1 ns:award.award_nomination.award_nominee ns:m.02pbp9.
            ns:m.02pbp9 ns:people.person.spouse_s ?e2.
            ?e2 ns:people.marriage.spouse ?e3.
            ?e2 ns:people.marriage.from ?e4.
            ?e3 ns:type.object.name ?name3
            MINUS{?e2 ns:type.object.name ?name2}
            }
        """
        #print(sparql_txt)
        sparql.setQuery(sparql_txt)
        sparql.setReturnFormat(JSON)
        results = sparql.query().convert()
        print(results)
    except:
        print('Your database is not installed properly !!!')
 
test()
  1. http://localhost:8890/conductor/ 中,登入账号(账号是dba,密码也是dba),依次点开这些栏目,可以看到最下面的 http://freebase.com。

在这里插入图片描述

输入以下代码:

PREFIX ns: <http://rdf.freebase.com/ns/>
SELECT distinct ?name3
WHERE{
ns:m.0k2kfpc ns:award.award_nominated_work.award_nominations ?e1.
?e1 ns:award.award_nomination.award_nominee ns:m.02pbp9.
ns:m.02pbp9 ns:people.person.spouse_s ?e2.
?e2 ns:people.marriage.spouse ?e3.
?e2 ns:people.marriage.from ?e4.
?e3 ns:type.object.name ?name3
MINUS{?e2 ns:type.object.name ?name2}
}

在这里插入图片描述
结果如下,说明导入成功

在这里插入图片描述

参考文章

  1. Freebase 知识图谱数据导入 Virtuoso 数据库
  2. Freebase 知识图谱数据导入 Virtuoso 数据库引擎
  3. Linux 服务器上安装 Virtuoso 数据库 并导入数据(超详细)

原文地址:https://blog.csdn.net/weixin_56462041/article/details/145225318

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!