图数据库是专门存储庞大的图形网络并从中检索信息的数据库。它可以将图中的数据高效存储为点(Vertex)和边(Edge),还可以将属性(Property)附加到点和边上。本文以示例数据集basketballplayer为例,通过nGQL操作和Python脚本两种方式构建图谱。数据[10]和代码[9]详见参考文献。

一.示例数据集介绍

1.数据集Schema

  点包括player(球员)和team(球队),边包括serve(球员->球队)和follow(球员->球员):

  下面是数据集的一个展示例子,如下所示:

2.vertex_player.csv

  球员player点数据包括player_id(球员id)、age(年龄)和name(名字):

player105 31 Danny Green
player109 34 Tiago Splitter
player111 38 David West
player118 30 Russell Westbrook
player143 23 Kristaps Porzingis
player104 32 Marco Belinelli
player107 32 Aron Baynes
player116 34 LeBron James
player120 29 James Harden
player125 41 Manu Ginobili

3.vertex_team.csv

  球队team点数据包括team_id(球对id)和name(名字):

team204 Spurs
team218 Raptors
team229 Heat
team202 Rockets
team208 Kings
team216 Cavaliers
team217 Celtics
team223 Knicks
team224 Pistons
team205 Thunders

4.edge_serve.csv

  serve边数据包括player_id(球员id)、team_id(球对id)、start_year(开始年)和end_year(结束年):

player100 team204 1997 2016
player101 team204 1999 2018
player101 team215 2018 2019
player102 team203 2006 2015
player102 team204 2015 2019
player103 team204 2017 2019
player103 team208 2013 2017
player103 team212 2006 2013
player103 team218 2013 2013
player104 team200 2007 2009

5.edge_follow.csv

  follow边数据包括player_id(球员id)、player_id(球员id)和degree(程度):

player100 player101 95
player100 player125 95
player101 player100 95
player101 player102 90
player101 player125 95
player102 player100 75
player102 player101 75
player103 player102 70
player104 player100 55
player104 player101 50

二.nGQL操作构建图谱

  创建图空间,包括名字和Vid Type,如下所示:

  查看图空间列表,如下所示:

  接下来通过命令创建Tag(点)和Edge type(边),如下所示:

// 创建Tag player,带有2个属性
CREATE TAG player(name string, age int);
// 创建Tag team,带有1个属性
CREATE TAG team(name string);
// 创建Edge type follow,带有1个属性
CREATE EDGE follow(degree int);
// 创建Edge type serve,带有2个属性
CREATE EDGE serve(start_year int, end_year int);

  创建完毕后,在控制台通过NGQL查看点和边信息,如下所示:

  接下来查看当前图空间中所有Tag和Edge type,如下所示:

SHOW TAGS; // 列出当前图空间中所有Tag
SHOW EDGES; // 列出当前图空间中所有Edge type
// 查看每种Tag和Edge type的结构是否正确
DESCRIBE TAG player;
DESCRIBE TAG team;
DESCRIBE EDGE follow;
DESCRIBE EDGE serve;


  查看图空间basketballplayer标签,如下所示:

  查看图空间basketballplayer边类型,如下所示:

  然后分别导入关联标签和关联边,这步骤是重点,主要是关联好列字段,如下所示:

说明:VID函数选择Hash,否则导入失败。

  通过任务列表查看导入信息,如下所示:


  特别说明:显示节点数值而非名字,推测可能和创建图空间时,与选择的Vid Type有关。这次选择的INT64,下次选择FIXED_STRING试试。

  通过NebulaGraph控制台,执行命令查看如下所示:

三.Python脚本构建图谱

  上述通过nGQL命令进行操作,当数据量大的时候,最好通过脚本进行处理,如下所示:

from nebula3.gclient.net import ConnectionPool
from nebula3.Config import Config
import numpy as np
import pandas as pd

config = Config() # 定义一个配置
config.max_connection_pool_size = 10 # 设置最大连接数
connection_pool = ConnectionPool() # 初始化连接池
# 如果给定的服务器是ok的,返回true,否则返回false
ok = connection_pool.init([('172.27.211.84', 9669)], config)

vertex_player_df = pd.read_csv("C:/Users/Administrator/Downloads/dataset/dataset/vertex_player.csv", header=None, names=['player_id', 'age', 'name'])
vertex_team_df = pd.read_csv("C:/Users/Administrator/Downloads/dataset/dataset/vertex_team.csv", header=None, names=['team_id', 'name'])
edge_follow_df = pd.read_csv("C:/Users/Administrator/Downloads/dataset/dataset/edge_follow.csv", header=None, names=['player_id1', 'player_id2', 'degree'])
edge_serve_df = pd.read_csv("C:/Users/Administrator/Downloads/dataset/dataset/edge_serve.csv", header=None, names=['player_id', 'team_id', 'start_year', 'end_year'])

# Session Pool,session将自动释放
with connection_pool.session_context('root', 'nebula') as session:
    # 创建basketballplayer_python空间
    session.execute('CREATE SPACE IF NOT EXISTS `basketballplayer_python_test` (vid_type = FIXED_STRING(32))')
    # result = session.execute('SHOW SPACES')
    # print(result)
    
    # 使用basketballplayer_python空间
    session.execute('USE basketballplayer_python')

    session.execute('CREATE TAG IF NOT EXISTS player(name string, age int)') # 创建player标签
    session.execute('CREATE TAG IF NOT EXISTS team(name string)') # 创建team标签
    session.execute('CREATE EDGE IF NOT EXISTS follow(degree int)') # 创建follow边
    session.execute('CREATE EDGE IF NOT EXISTS serve(start_year int, end_year int)') # 创建serve边

    # 从CSV文件中读取数据,插入到player标签中
    for index, row in vertex_player_df.iterrows():
        session.execute('INSERT VERTEX IF NOT EXISTS player(name, age) VALUES "{}":("{}", {})'.format(row['player_id'], row['name'], np.int64(row['age'])))
    # 从CSV文件中读取数据,插入到team标签中
    for index, row in vertex_team_df.iterrows():
        session.execute('INSERT VERTEX IF NOT EXISTS team(name) VALUES "{}":("{}")'.format(row['team_id'], row['name']))
    # 从CSV文件中读取数据,插入到follow边中
    for index, row in edge_follow_df.iterrows():
        session.execute('INSERT EDGE IF NOT EXISTS follow(degree) VALUES "{}"->"{}":({})'.format(row['player_id1'], row['player_id2'], np.int64(row['degree'])))
    # 从CSV文件中读取数据,插入到serve边中
    for index, row in edge_serve_df.iterrows():
        session.execute('INSERT EDGE IF NOT EXISTS serve(start_year, end_year) VALUES "{}"->"{}":({}, {})'.format(row['player_id'], row['team_id'], np.int64(row['start_year']), np.int64(row['end_year'])))

# 关闭连接池
connection_pool.close()

  通过NebulaGraph控制台,执行命令match (v:player) return v;。结果以表格形式展现,如下所示:

  结果以可视化形式展现,如下所示:

说明:由于代码简单,就不详细介绍了,可参考代码注释[9]。

参考文献:

[1]规划Schema:https://docs.nebula-graph.com.cn/3.3.0/nebula-studio/quick-start/st-ug-plan-schema/

[2]导入数据:https://docs.nebula-graph.com.cn/3.6.0/nebula-studio/quick-start/st-ug-import-data/

[3]控制台界面:https://docs.nebula-graph.com.cn/3.6.0/nebula-studio/quick-start/st-ug-console/

[4]操作图空间:https://docs.nebula-graph.com.cn/3.6.0/nebula-studio/manage-schema/st-ug-crud-space/

[5]操作Tag(点类型):https://docs.nebula-graph.com.cn/3.6.0/nebula-studio/manage-schema/st-ug-crud-tag/

[6]操作Edge type:https://docs.nebula-graph.com.cn/3.6.0/nebula-studio/manage-schema/st-ug-crud-edge-type/

[7]操作索引:https://docs.nebula-graph.com.cn/3.6.0/nebula-studio/manage-schema/st-ug-crud-index/

[8]查看Schema:https://docs.nebula-graph.com.cn/3.6.0/nebula-studio/manage-schema/st-ug-view-schema/

[9]本文源码:https://github.com/ai408/nlp-engineering/blob/main/20230917_NLP工程化公众号文章/NebulaGraph教程/basketballplayer.py

[10]本文数据:basketballplayer.zip: https://url39.ctfile.com/f/2501739-944592417-0f75d0?p=2096 (访问密码: 2096)

NebulaGraph实战:2-NebulaGraph手工和Python操作的更多相关文章

  1. Python接口测试实战3(上)- Python操作数据库

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  2. python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改、删除操作

    python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改.删除操作 项目目录: ├── flask_redis_news.py ├── forms.py ├ ...

  3. python操作三大主流数据库(10)python操作mongodb数据库④mongodb新闻项目实战

    python操作mongodb数据库④mongodb新闻项目实战 参考文档:http://flask-mongoengine.readthedocs.io/en/latest/ 目录: [root@n ...

  4. kafka实战教程(python操作kafka),kafka配置文件详解

    kafka实战教程(python操作kafka),kafka配置文件详解 应用往Kafka写数据的原因有很多:用户行为分析.日志存储.异步通信等.多样化的使用场景带来了多样化的需求:消息是否能丢失?是 ...

  5. Python操作数据库实战

    pymysql # -*- coding: utf-8 -*- """ @Datetime: 2018/12/26 @Author: Zhang Yafei " ...

  6. 基于Python的接口自动化实战-基础篇之pymysql模块操作数据库

    引言 在进行功能或者接口测试时常常需要通过连接数据库,操作和查看相关的数据表数据,用于构建测试数据.核对功能.验证数据一致性,接口的数据库操作是否正确等.因此,在进行接口自动化测试时,我们一样绕不开接 ...

  7. Python操作Excel

    一.系统性学习 对于操作Excel,需要Xlrd/xlwt这两个模块,下面推荐出系统性学习的网址: python操作Excel读写--使用xlrd 官方文档 Python 使用 Xlrd/xlwt 操 ...

  8. python操作数据库PostgreSQL

    1.简述 python可以操作多种数据库,诸如SQLite.MySql.PostgreSQL等,这里不对所有的数据库操作方法进行赘述,只针对目前项目中用到的PostgreSQL做一下简单介绍,主要包括 ...

  9. python操作oracle数据库-查询

    python操作oracle数据库-查询 参照文档 http://www.oracle.com/technetwork/cn/articles/dsl/mastering-oracle-python- ...

  10. 转载 Python 操作 MySQL 的正确姿势 - 琉璃块

    Python 操作 MySQL 的正确姿势 收录待用,修改转载已取得腾讯云授权 作者 |邵建永 编辑 | 顾乡 使用Python进行MySQL的库主要有三个,Python-MySQL(更熟悉的名字可能 ...

随机推荐

  1. Batch Normalization 批量归一化的运算过程

    Batch Normalization 批量归一化 具体的运算过程: 假设经过卷积计算过后得到的feature map的尺寸为 2*3*2*2. 其中2代表的是batch的大小,3代表的是通道chan ...

  2. DHorse v1.4.2 发布,基于 k8s 的发布平台

    版本说明 优化特性 在集群列表增加集群版本: 修改Jvm的GC指标名: 解决问题 解决shell脚本换行符的问题: 解决部署历史列表页,环境名展示错误的问题: 解决指标收集功能的异常: 升级指南 升级 ...

  3. 删除小程序scroll-view的滚动条

    小程序scroll-view滚动条很丑,想隐藏? 在有scroll-view滚动条页面的wxss里添加: ::-webkit-scrollbar { display: none; width: 0; ...

  4. MUH and Cube Walls 题解

    MUH and Cube Walls 前言 怎么题解区同质化这么严重,16 篇题解全是 差分 + KMP,就没有人写别的做法吗. (好吧其实是我一开始没想到差分才有了这么多奇怪做法) 题目大意 给定两 ...

  5. 两台实体机器4个虚拟机节点的Hadoop集群搭建(Ubuntu版)

    安装Ubuntu Linux元信息 两台机器,每台机器两台Ubuntu Ubuntu版本:ubuntu-22.04.3-desktop-amd64.iso 处理器数量2,每个处理器的核心数量2,总处理 ...

  6. dfs 序 O(nlogn)-O(1) 求 LCA

    学点分树,发现不会询问复杂度 \(O(1)\) 的 LCA.于是被迫递归式学习. 我们设 \(dfn_i\) 表示点 \(i\) 在 dfs 过程中第几个被访问到,把点按访问到的顺序排序得到的序列叫 ...

  7. 【2023年更新】git 常用口令

    1.已关联远程 fatal: remote origin already exists.   先输入$ git remote rm origin(删除关联的origin的远程库)   2.关联新远程 ...

  8. Langchain-Chatchat项目:4.2-P-Tuning v2使用的数据集

      本文主要介绍P-tuning-v2论文中的5种任务,分别为Glue任务.NER任务.QA任务.SRL任务.SuperGlue任务,重点介绍了下每种任务使用的数据集. 一.Glue任务   GLUE ...

  9. 带您了解 O2OA 流程中的人工活动处理方式

    这次咱们来介绍 O2OA (翱途) 开发平台流程引擎中的人工活动的处理方式和逻辑,O2OA (翱途) 主要采用拖拽可视化开发的方式完成流程的设计和配置,不需要过多的代码编写,业务人员可以直接进行修改操 ...

  10. 3.1 IDA Pro编写IDC脚本入门

    IDA Pro内置的IDC脚本语言是一种灵活的.C语言风格的脚本语言,旨在帮助逆向工程师更轻松地进行反汇编和静态分析.IDC脚本语言支持变量.表达式.循环.分支.函数等C语言中的常见语法结构,并且还提 ...