Nebula Graph 如何快速导入OwnThink知识图谱数据

随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了了一张庞大而复杂的关系网,亟需一种支持海量复杂数据关系运算的数据库即图数据库。本系列文章是学习知识图谱以及图数据库相关的知识梳理与总结

本文会包含如下内容:

  • Nebula Graph 如何快速导入OwnThink知识图谱数据

本篇文章适合人群:架构师、技术专家、对知识图谱与图数据库感兴趣的高级工程师

  1. OwnThink知识图谱数据介绍

ownthink开源了史上最大规模的中文知识图谱,数据是以(实体、属性、值),(实体、关系、实体)混合的形式组织,数据格式采用csv格式,

详见:https://github.com/ownthink/KnowledgeGraphData),数据量为 1.4 亿条。

下载地址:

百度网盘(链接: https://pan.baidu.com/s/1LZjs9Dsta0yD9NH-1y0sAw 提取码: 3hpp )注:解压密码是:https://www.ownthink.com/

查看原始文件

ownthink_v2.csv 共有 140919781行,约1.4亿条,摘录部分数据为例,

这里的 (红色食品,是否含防腐剂,否) 是典型的 (实体, 属性, 值) 形式的三元组数据;

而 (姚明[中国篮球协会主席、中职联公司董事长],老婆,叶莉) 是典型的 (实体, 关系, 实体) 形式的三元组数据。

实体,属性,值
胶饴,描述,别名: 饴糖、畅糖、畅、软糖。
词条,描述,词条(拼音:cí tiáo)也叫词目,是辞书学用语,指收列的词语及其释文。
词条,标签,文化
红色食品,描述,红色食品是指食品为红色、橙红色或棕红色的食品。
红色食品,中文名,红色食品
红色食品,是否含防腐剂,否
红色食品,主要食用功效,预防感冒,缓解疲劳
红色食品,适宜人群,全部人群
红色食品,用途,增强表皮细胞再生和防止皮肤衰老
红色食品,标签,非科学
红色食品,标签,生活
大龙湫,描述,雁荡山景区分散,东起羊角洞,西至锯板岭;南起筋竹溪,北至六坪山。
大龙湫,中文名称,大龙湫
大龙湫,外文名称,big dragon autrum
大龙湫,地理位置,浙江省温州市雁荡山景区
姚明[中国篮球协会主席、中职联公司董事长],中文名,姚明
姚明[中国篮球协会主席、中职联公司董事长],外文名,Yao Ming
姚明[中国篮球协会主席、中职联公司董事长],别名,明王
姚明[中国篮球协会主席、中职联公司董事长],别名,移动长城
姚明[中国篮球协会主席、中职联公司董事长],别名,小巨人
姚明[中国篮球协会主席、中职联公司董事长],别名,大姚
姚明[中国篮球协会主席、中职联公司董事长],国籍,中国
姚明[中国篮球协会主席、中职联公司董事长],民族,汉族
姚明[中国篮球协会主席、中职联公司董事长],出生地,上海市徐汇区
姚明[中国篮球协会主席、中职联公司董事长],出生日期,1980年9月12日
姚明[中国篮球协会主席、中职联公司董事长],毕业院校,上海交通大学安泰经济与管理学院
姚明[中国篮球协会主席、中职联公司董事长],老婆,叶莉
  1. 如何快速导入OwnThink知识图谱数据

2.1. 数据准备

使用rdf-converter工具针对数据进行清洗,rdf-converter的地址: https://github.com/jievince/rdf-converter

工具用于清洗 Ownthink 的知识图谱 RDF 数据,将它变成属性图模型,结果为一个 vertex.csv 文件和 edge.csv 文件, 分别是清洗后的顶点数据和边数据。目前只对数据进行了简单去重

使用方式:./rdf-converter –path ownthink_v2.csv

2.2. 定义图schema

图数据库通常支持的数据模型为有向属性图(directed property graph)。图中的每个顶点(vertex)可以用标签(tag)来表示类型,顶点和顶点之间的关系用边(edge)连接起来。

每种 tag 和 edge 可以带有属性.

无论是 (实体, 属性, 值) 形式的三元组数据,还是 (实体, 关系, 实体) 形式的三元组数据,每条三元组数据均可以建模成两个点和一条边的形式。前者三元组中的 实体和值建模为两个点(起点、终点), 属性建模为一条边,后者三元组中的两个 实体也建模为两个点(起点、终点), 关系建模为一条边

CREATE SPACE IF NOT EXISTS ownthink(partition_num=30, replica_factor=1, vid_type=fixed_string(20));
CREATE TAG entity (name string);
CREATE EDGE relation (name string);

2.3. 编写importer导入配置文件

Nebula Importer 通过 YAML 配置文件来描述要导入的文件信息、Nebula Graph 的 server 信息等

如何编写导入配置文件,请参考:https://github.com/vesoft-inc/nebula-importer

注意:nebula-importer目前仅仅支持vid是string类型的导入

clientSettings.postStart可选。配置连接 Nebula Graph Server 之后,在插入数据之前执行的一些操作。

clientSettings.postStart.afterPeriod:定义执行上述命令之后到真正插入数据之前的间隔。

clientSettings.preStop可选。配置断开 Nebula Graph Server 连接之前执行的一些操作。

执行方式: 将此文件与数据文件放在同一目录下,然后执行: nebula-importer --config ownthink-importer.y:waml
version: v2
description: 导入ownthink知识图谱数据
removeTempFiles: false
clientSettings:
  retry: 3
  concurrency: 10 # number of graph clients
  channelBufferSize: 512
  space: ownthink
  connection:
    user: admin
    password: admin
    address: 172.25.21.22:9669
  postStart:  #连接 Nebula Graph Server 之后,在插入数据之前执行的一些操作
    commands: |
      UPDATE CONFIGS storage:wal_ttl=3600;
      UPDATE CONFIGS storage:rocksdb_column_family_options = { disable_auto_compactions = true };
      DROP SPACE IF EXISTS ownthink;
      CREATE SPACE IF NOT EXISTS ownthink(partition_num=30, replica_factor=1, vid_type=fixed_string(20));
      USE ownthink;
      CREATE TAG entity (name string);
      CREATE EDGE relation (name string);
    afterPeriod: 8s  #定义执行上述命令之后到真正插入数据之前的间隔
    preStop:  #配置断开 Nebula Graph Server 连接之前执行的一些操作
      commands: |
        UPDATE CONFIGS storage:wal_ttl=86400;
        UPDATE CONFIGS storage:rocksdb_column_family_options = { disable_auto_compactions = false };
logPath: ./err/error.log
files:
  - path: ./vertex.csv
    failDataPath: ./err/vertex.csv
    batchSize: 100
    type: csv
    csv:
      withHeader: false
      withLabel: false
    schema:
      type: vertex
      vertex:
        tags:
          - name: entity
            props:
              - name: name
                type: string
  - path: ./edge.csv
    failDataPath: ./err/edge.csv
    batchSize: 100
    type: csv
    csv:
      withHeader: false
      withLabel: false
    schema:
      type: edge
      edge:
        name: relation
        withRanking: false
        props:
          - name: name
            type: string

2.4. 导入

创建ownthink目录,目录下的文件如下:

edge.csv ownthink-importer.yaml ownthink_v2.csv ownthink_v2.zip rdf-converter vertex.csv

导入命令: nebula-importer –config ownthink-importer.yaml

全部导入耗时410秒,约7分钟

2021/04/08 16:35:55 --- START OF NEBULA IMPORTER ---
2021/04/08 16:35:55 [INFO] connection_pool.go:74: [nebula-clients] connection pool is initialized successfully
2021/04/08 16:35:55 [INFO] clientmgr.go:28: Create 10 Nebula Graph clients
2021/04/08 16:35:55 [INFO] reader.go:64: Start to read file(0): /data1/graphdb/nebula-importer/ownthink/vertex.csv, schema: < :VID(string),entity.name:string >
2021/04/08 16:35:55 [INFO] reader.go:64: Start to read file(1): /data1/graphdb/nebula-importer/ownthink/edge.csv, schema: < :SRC_VID(string),:DST_VID(string),relation.name:string >
2021/04/08 16:36:05 [INFO] statsmgr.go:61: Tick: Time(10.00s), Finished(1149600), Failed(0), Latency AVG(1433us), Batches Req AVG(1683us), Rows AVG(114959.32/s)
.....

2021/04/08 16:39:55 [INFO] statsmgr.go:61: Tick: Time(240.00s), Finished(141891200), Failed(0), Latency AVG(1397us), Batches Req AVG(1629us), Rows AVG(591213.20/s)
2021/04/08 16:39:58 [INFO] reader.go:180:
Total lines of file(/data1/graphdb/nebula-importer/ownthink/vertex.csv) is: 67509509, error lines: 0
2021/04/08 16:39:59 [INFO] statsmgr.go:61: Done(/data1/graphdb/nebula-importer/ownthink/vertex.csv): Time(244.62s),
Finished(144938909), Failed(0), Latency AVG(1395us), Batches Req AVG(1626us), Rows AVG(592494.56/s)
.....

2021/04/08 16:42:40 [INFO] statsmgr.go:61: Tick: Time(405.00s), Finished(205885309), Failed(0), Latency AVG(1410us), Batches Req AVG(1636us), Rows AVG(508358.72/s)
2021/04/08 16:42:44 [INFO] reader.go:180:
Total lines of file(/data1/graphdb/nebula-importer/ownthink/edge.csv) is: 139951301, error lines: 0
2021/04/08 16:42:44 [INFO] statsmgr.go:61: Done(/data1/graphdb/nebula-importer/ownthink/edge.csv): Time(409.50s),
Finished(207460810), Failed(0), Latency AVG(1411us), Batches Req AVG(1636us), Rows AVG(506614.51/s)
2021/04/08 16:42:45 Finish import data, consume time: 410.00s
2021/04/08 16:42:46 --- END OF NEBULA IMPORTER ---
  1. 图统计与遍历查询

3.1. 图统计

使用 nebula-console -addr xxx.xx.xx.xx -port 9669 -u admin -p admin 进入到console控制台

use ownthink

submit job stats

当统计完成后,查看统计信息如下,共有4533万个实体,1.289亿条边

Nebula Graph 如何快速导入OwnThink知识图谱数据

3.2. 图统计

查询和姚明相关的信息

yield hash(“姚明[中国篮球协会主席、中职联公司董事长]”)+”” as id |GO FROM $-.id OVER relation YIELD relation.name AS Name, $$.entity.name AS Value;

Nebula Graph 如何快速导入OwnThink知识图谱数据

查看姚明与叶莉的3跳之内的关系

$src=yield hash(“姚明[中国篮球协会主席、中职联公司董事长]”)+”” as id; $dest=yield hash(“叶莉”)+”” as id; FIND ALL PATH FROM $src.id TO $dest.id OVER relation UPTO 3 STEPS;

Nebula Graph 如何快速导入OwnThink知识图谱数据

如果想使用match语句,则需要创建索引: create tag index indexEntityTag on entity(),

注意:1. 性能较差,估计是vid的长字符串比较性能差的原因, 2. 不能在语句中使用变量,否则报错:[ERROR (-8)]: Storage Error: part: 28, error: E_RPC_FAILURE(-3)

match (v:entity)-[r:relation1]-(v2:entity) where id(v)==”-9152604120579160464″ and id(v2)==”-3789502047435786586″ return r;
match (v:entity)-[r:relation
1..2]-(v2:entity) where id(v)==”-9152604120579160464″ and id(v2)==”-3789502047435786586″ return r;

Nebula Graph 如何快速导入OwnThink知识图谱数据

其它查询

$src=yield hash(“王仕鹏”)+”” as id; go 1 to 2 steps from $src.id over relation yield relation.name,$$.entity.name;

Original: https://blog.csdn.net/penriver/article/details/115520152
Author: java编程艺术
Title: Nebula Graph 如何快速导入OwnThink知识图谱数据

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/556743/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球