Freebase 知识图谱数据导入 Virtuoso 数据库引擎

数据预处理

软件下载

导入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tar xvpfz virtuoso-opensource.x86_64-generic_glibc25-linux-gnu.tar.gz
cd virtuoso-opensource/database/
mv virtuoso.ini.sample virtuoso.ini

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

# 1、解压数据导入
SQL>
ld_dir('.', 'FilterFreebase', 'http://freebase.com'); # 解压过滤数据在database目录下面
rdf_loader_run(); # 加载数据,大约6天的时间【窗口不能关闭】,最终virtuoso.db大约46G

# 2、压缩包数据导入
SQL>
DB.DBA.TTLP_MT (gz_file_open ('freebase-filter.gz'), '', 'http://freebase.com', 128); # 数据在database目录下面
# 大约4天的时间【窗口不能关闭】,最终virtuoso.db大约55G

查看状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 新建窗口,查看状态-查看数据集加载情况
# ll_state字段有三个值:0表示数据集还没有加载;1表示数据集正在加载;2表示数据集已经加载完成。
SQL>
select * from DB.DBA.load_list;


# 查看三元组数量
SPARQL SELECT COUNT(*) { ?s ?p ?o };

# 导入结束后,需要清理一下load_list,否则下次装载其它文件时,load_list里面的文件还会导入
delete from db.dba.load_list;

# 删除数据库【谨慎】
SQL> SPARQL CLEAR GRAPH <http://freebase.com>;

关闭服务

1
2
3
4
5
6
7
8
9
10
SQL>
shutdown(); # 停止服务

top
kill -9 进程id

# 查看1111端口占用情况
lsof -i:1111

# kill 对应的进程

访问数据

  • 浏览器:http://localhost:8890/sparql
  • Python
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    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
{'head': {'link': [], 'vars': ['name3']}, 'results': {'distinct': False, 'ordered': True, 'bindings': [{'name3': {'type': 'literal', 'xml:lang': 'en', 'value': 'Jeffrey Probst'}}, {'name3': {'type': 'literal', 'xml:lang': 'en', 'value': 'Shelly Wright'}}, {'name3': {'type': 'literal', 'xml:lang': 'en', 'value': 'Lisa Ann Russell'}}]}}

格式化

1
2
3
4
5
6
7
8
9
10
11
12
{'head': {'link': [], 'vars': ['name3']},
'results': {'bindings': [{'name3': {'type': 'literal',
'value': 'Jeffrey Probst',
'xml:lang': 'en'}},
{'name3': {'type': 'literal',
'value': 'Shelly Wright',
'xml:lang': 'en'}},
{'name3': {'type': 'literal',
'value': 'Lisa Ann Russell',
'xml:lang': 'en'}}],
'distinct': False,
'ordered': True}}

参考文章

坚持原创技术分享,您的支持将鼓励我继续创作!
0%