Linux服务器安装 Virtuoso 数据库并导入Freebase 知识图谱数据
Linux服务器安装 Virtuoso 数据库并导入Freebase 知识图谱数据
摘要
本文详细介绍了在Linux服务器上安装Virtuoso数据库并导入Freebase知识图谱数据的步骤。主要内容包括:
- 下载Freebase数据集:从Google提供的链接下载Freebase三元组数据,解压后约400G。
- 数据过滤:通过Python脚本过滤Freebase RDF数据,保留符合命名空间、英文文本和XML数据类型的三元组,过滤后数据约为125G。
- 下载并安装Virtuoso:从SourceForge下载Virtuoso数据库,解压并配置环境变量。
- 启动Virtuoso服务:修改配置文件以优化内存使用,启动Virtuoso服务并进入数据库。
- 导入数据:将过滤后的数据导入Virtuoso数据库,导入过程可能需要数小时,最终生成约42G的数据库文件。
- 验证导入结果:通过Python脚本或Virtuoso的Web界面验证数据是否成功导入。
本文还提供了参考文章链接,供进一步学习和 troubleshooting。
正文
下载Freebase数据集
Freebase 三元组:https://developers.google.com/freebase?hl=zh-cn
使用特定方法下载至服务器:
下载后解压大概400G
数据过滤
这段代码过滤的是 Freebase RDF 数据,具体包括:
- 符合 Freebase 命名空间的三元组。
- 包含英文文本的三元组。
- 包含 XML 数据类型的三元组。
- 跳过不符合规则的行(如空行、格式错误行、非英文文本行等)。
通过这种过滤,可以提取出高质量、符合特定格式的 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
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;
验证是否安装并导入成功
这时候可以有两种方式验证是否导入成功:
- 运行以下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()
- 在 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}
}
结果如下,说明导入成功
参考文章
原文地址:https://blog.csdn.net/weixin_56462041/article/details/145225318
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!