图算法

OushuDB内部包含图数据库的功能,支持以脚本、界面两种操作方式。以下前四章主要介绍图形化界面操作,第五章介绍GQL脚本方式操作。

在Lava左侧菜单OushuDB->查询控制台的页面中,展开左侧数据源的层级结构,展开到某一个模式(schema)级别,就会看到“表”、“函数”、“视图”等文件夹,其下方的“点类型”、“边类型”、“图”及树的最下方“图算法”,这几个文件夹是与图数据库部分相关的。

_images/WX20200825-161624.png

一、点类型

1.新建点类型

鼠标右键“点类型”文件夹点击“新建点类型”,会弹出如下窗口

_images/WX20200825-164605.png

填入点类型名称及点相关的属性。

其中“显示列”会在可视化的画布中,将此列数据显示在点的下方。

其中“主键”可设置多列,在下方的“主键顺序”处,可以用鼠标拖动以调整顺序。

2.查看点类型

_images/WX20200825-165022.png

在已经建好的点上点击右键,可以查看点类型信息。

_images/WX20200825-165108.png

需要注意的是,已经建好的点类型,只允许修改“显示列”,其他信息不可修改。

注:下图中的图标是一个开关按钮,可以收起、展开树形侧边栏。(与使用侧边栏的箭头图标有同样的效果)

_images/WX20200827-164752.png

3.删除点类型

在已经建好的点类型上点击右键,可以点选菜单删除此点。 需要注意的是,当删除点时,系统会检查这个点类型是否正在被“边类型”或者“图”所使用。如果正在被使用,则无法删除,需要先删除相应的“边类型”或者“图”。

二、边类型

1.新建边类型

鼠标右键“边类型”文件夹选择“新建边类型”,会弹出如下窗口

_images/WX20200825-165557.png

在此页面上填写边名称、选择来源点类型及目标点类型、添加必要的边属性。

2.查看边类型

在已经建好的边类型上点击右键,可以查看边类型信息

3.删除边类型

在已经建好的边类型上点击右键,可以点选菜单删除此边。 需要注意的是,当删除边时,系统会检查这个边类型是否正在被某张“图”所使用。如果正在被使用,则无法删除,需要先删除相应的“图”。

三、图

1.新建图

_images/WX20200827-153316.png

在“图”文件夹上右键,选择“新建图”。

在弹出页面上输入图名称、选择数据在库中存储的“格式”,可选“magmaap”、“orc”、“heap”。

右上角的”主键索引“意思是,可以选择是否根据点类型、边类型的主键建立相应的索引。 注:如果需要导的数据量比较大的话,建议这里先不开启,待导完数据后通过点和边的右键菜单开启,后文有详细说明。

一张新的图由若干个点及边构成。在此页面上,我们可以选择系统内已有的点类型和边类型,当然也可以点击+新建点和边。

其中边类型的名字是按”(点类型)-[边类型]-(点类型)”的规则显示,方便查找所需的边。

在选择点和边的过程中,右侧会实时的显示出这张图的可视化元数据关系,便于理解图的构成。

当新建一张图时,db会自动为这个图的点和边分别自动创建两张数据表,并以“skylon_vertex_graphName_vertexName”、“skylon_edge_graphName_edgeName”的规则命名数据表。我们可以利用SQL语句对这两张表进行增删改查等任意操作。如下图中红框所示,

_images/image-20200827153712178.png

也可以直接以 GraphName.VertexName 或者 GraphName.EdgeName 当做表名进行SQL操作。

2.导入数据

建立好一个空图后,我们需要往图中导入数据。系统提供 3 种方式进行数据导入:

1.直接在页面编辑点和边

_images/image-20200827154648792.png

在弹出窗口中可以添加、编辑或删除数据。

注:此处只可以编辑前1000条数据,大数据量不适合在此处编辑,可通过SQL直接编辑点或边对应的数据表。

_images/WX20200827-154830.png

2.上传csv文件批量导入数据

在编辑点数据页面,点击“导入数据”按钮,会弹出上传文件窗口。

_images/WX20200904-145357.png

点击浏览选取文件,再点击上传即可。注意文件中的数据列要与对应点或边的列 严格一致

_images/WX20200904-145455.png

3.通过脚本批量导数据至点和边对应的数据表中

在terminal命令行中,利用copy命令将csv文件导入到点、边对应的数据表中。

_images/WechatIMG750.png

也可以在查询控制台中的SQL编辑区,编辑任意可以导入数据的sql语句,将其他数据表的数据导入到点边的表里。

_images/WX20200827-155543.png

可以直接以 GraphName.VertexName 或者 GraphName.EdgeName 当做表名进行SQL操作。

例如*以下写法*:

select * from company_info.company --已经建了一张图,名字为 ‘company_info’

3.编辑索引

每张图的点和边都可以建立索引,以加快查询速度。

右键某张图下方的点或边,选择“编辑点/边索引”

_images/WX20200827-160220.png

如果之前在建图的时候,选择了弹窗右上角的”主键索引“,则在这里会看到已经建立好的相关索引。前面提到如果数据量较大时,在建立图的时候不建议选择建立”主键索引“,在这里需要强调的是,要 先导入点、边的数据后再建立索引 。否则先建立索引的话,再导数据,导入速度会相对慢一些。

_images/image-20201201155752736.png

其中“添加主键索引”的意思是,将“点类型”的主键索引建立在这个“点实例”的数据表上。一般来说,导完数据后,可以点击这个按钮。

点击“添加索引”按钮,可以新建普通索引。需要选择索引列及额外列。其中“额外列”的作用是,在查询的过程中如果利用了这个索引,那么配置到“额外列”中的数据也会比较快的查出来。

在添加边索引时,稍微有些不同,如上图添加索引列时,可以看到除了属性之外,还多了两个特殊的选项,分别是“from”和“to”。他们分别代表着这条边的起始点和目标点。在图数据库内部存储边的信息时,我们不仅存储边的属性,也存储了边的起始点及目标点,所以这两个列也可以用来建立索引。

已经选好的列,我们用蓝色色块表示。用鼠标可以拖动这些色块来调整顺序,以代表建立索引的顺序。需要强调的是,如果from在前to在后,则以from作为查询条件,可快速查到“to”。反之,就是以“to”作为查询条件,可以快速查到“from”。

如果在“是否唯一”中,打开选项,表示此索引相关的列,数据不可以重复。所以配置“索引列”时,第一个必须选择主键,页面上会自动选择好。

注:再次强调,建议导完数据以后再建立索引,这样导数据的速度相对会快一些。如果需要二次附加数据时,可以暂时删除已有索引,待导完数据后再重新建立索引。

4.搜索图

在左侧的树形结构中,某个“模式”下的“图”文件夹中,双击任意一张图的名字,即可打开右侧的画布。在这里我们可以用多种方式探索一张图。

_images/WX20200827-161636.png

1.点查询

其中,点查询可以通过选取不同类型的点,并添加筛选条件来筛取需要的点。

如下图,我们筛选到了一个名字叫“方良”的人。

_images/WX20200827-161856.png

2.边查询

边查询同样可以选取不同类型的边加上筛选条件。如下图我们将“展示数量”缩小到2个,结果返回两条边,在画布上边两端的点也会一同被显示出来。

_images/WX20200827-161946.png
  1. 画布工具

上方的工具条提供了一系列常用功能。

首先是模糊查找画布中节点功能,输入文字后回车,画布中包含此字符的节点会变红色,如下图。

_images/WX20200827-163238.png

下图中的图标代表已“弦图”布局画布中的图。

_images/WX20200827-162734.png

下图中的图标代表已“矩阵图”布局画布中的图。

_images/WX20200827-162808.png

下图中的图标代表已“随机方式”布局画布中的图。

_images/WX20200827-162833.png

下图中的json图标,表示显示画布中图的json数据。(再次点击此图标,可返回画布视图)

_images/WX20200827-162848.png

下图中的“自动布局”按钮,是一个非常用的布局按钮。当按下以后,系统会持续以点之间的互斥力计算布局位置,当我们观察到布局合适以后,再次点击此按钮即可停止计算布局。

_images/WX20200827-162908.png

下图中,点击”过滤画布“,会弹出此窗口。它的作用是当画布上查询好了一张图以后,可以通过点及边的条件,保留符合画布上条件的点和边,暂时隐藏其他点边。清空条件后,还原画布上原理的图。

_images/image-20201201150711480.png

点击下方的下载图标,可将画布中的图以图片形式下载。

_images/WX20200827-162928.png
  1. 节点配色工具

默认时,左上角的颜色图例是按照点的类型来分配不同的颜色。当需要以 某个点的属性 值范围来显示不同颜色时,可以利用“规则配色”工具。 如下图,

_images/WX20200827-163059.png

我们配置了一条规则,company点的status属性包含“注销”字样,并选择红色色块,确定以后就会得到下图所示,方便探索数据。也可以根据需要添加多条配色规则。

_images/WX20200827-163116.png

5.查看图的元数据

在树形侧边栏中,右键某张图,点击查看元数据,可以查看如下窗口。与创建时一致,但在此时不可以更改图。

_images/nDegreeRelation.png

6.编辑点/边属性

在画布中右键点或者边,点击“查看/编辑属性”,可以看到如下窗口。在该窗口点击小笔图标可以修改对应的属性值。

_images/editProperty.png

7.探索节点-邻节点

在画布中右键点,点击探索节点,可以看到如下窗口。可以选择想要查询的邻节点的点类型,并且指定点类型的属性值。同时可以指定两个点类型之间存在的关系以及关系的具体属性值。

_images/adjacentnode.png

8.探索节点-N度关系

点击探索节点窗口的N度关系选项卡,可以看到如下窗口。可以指定探索度数和方向,同时可以指定具体关系以及属性的值

_images/nDegreeRelation.png

四、算法

  1. 内置算法
    1. 内置算法共有以下七个:
      • 广度优先搜索
      • Louvain社区发现
      • 网页排名
      • 弱联通分量
      • 强连通分量
      • K核算法
      • 随机游走
    1. 可以在左侧树结构中的算法分支查看
_images/builtin_algos.png
  1. 自定义图算法

2.1 新建算法

    1. 右键【查询控制台】菜单-图算法,选择点击【新建图算法】
_images/1_create_algo.png
    1. 弹出新建图算法页面
    • 用户需输入算法名称,选择是否有算法参数,填写参数,选择算法结果输出形式
    • 如果为图形式,算法的结果可存储在数据库或者HDFS
    • 如果为普通文件,算法的结果只能存储在HDFS
    • 如果存储在HDFS,用户须提供gpadmin用户拥有读写权限的空文件夹路径,如果不存在或非空或权限不足将会报错
_images/2_create_algo_params.png
    1. 点击查看输出形式示例查看具体输出格式
_images/4_create_algo_tip.png
    1. 上传算法文件,点击保存,即可成功创建自定义算法
_images/3_create_algo_save.png
    1. 创建成功会有相应提示
_images/5_create_algo_success.png _images/6_create_algo_show.png
    1. 运行算法时,可以选择已经创建好的自定义算法,输入参数及其他配置信息,点击运行算法任务即可运行
_images/7_multiloan_run.png
    1. 算法运行成功
_images/8_multiloan_status.png _images/9_multiloan_result.png

2.2 更新图算法

    1. 在图算法出处选择一个自定义的图算法,右键可以选择【更新图算法】
_images/10_update_algo.png
    1. 弹出更新图算法的弹框,可以修改算法名称、算法参数、算法结果输出形式和算法文件。
_images/11_update_algo_params.png
    1. 修改后点击保存,页面右上角会提示更新成功
_images/12_update_algo_success.png

2.3 删除图算法

    1. 在图算法出处选择一个自定义的图算法,右键可以选择【删除图算法】
_images/13_delete_algo.png
    1. 点击【删除图算法】,自定义算法会直接被删除,提示算法删除成功
_images/14_delete_algo_success.png
  1. 运行图算法

3.1运行图算法

    1. 用户在图上右键选择【运行图算法】,进入图算法运行界面
_images/15_run_algo.png
    1. 选择图算法
_images/16_run_algo_panel.png _images/17_run_algo_select.png
    1. 选定算法后,用户可以选择执行机器、进行参数配置,点击【开始运行】
_images/18_run_algo_page_rank.png

3.2 算法结果 - 图形式

    1. 选择运行结果为数据库图表时,需要选择本数据源下的数据库及schema
_images/19_algo_res_database.png
    1. 程序会自动生成结果图名称,用户还可以自定义编辑,如果为空或名称重复则会提示
_images/20_algo_res_schema.png _images/21_algo_res_graph.png
    1. 图名长度不允许超过24
_images/22_algo_res_graph_len.png
    1. 最后需要选择图的格式
_images/23_algo_res_format.png

3.3 算法结果 - 普通文件形式

    1. 选择图存储在HDFS,需在运行界面输入HDFS地址,算法的结果将存储在该地址上
_images/24_algo_res_hdfs.png
    1. 如果用户填写的地址为空,则会有提示
_images/25_algo_res_hdfs_check.png

3.4 任务名称

  • 任务名称会自动生成,可编辑,-如果为空或重复则有提示
_images/26_task_name_empty.png _images/27_task_name_dup.png

3.5 开始运行

    1. 点击【开始运行】后,如果启动任务失败,则会当前栏提示
_images/28_start_run.png
    1. 如果启动成功,则会跳转到算法任务栏
_images/29_task_list.png

4.算法任务列表

4.1 以卡片形式展示

  • 只展示以当前graph为数据源的算法任务

4.2 卡片内容

算法任务内容包括:

  • 算法名称
  • 运行状态
  • 开始时间
  • 运行时长
  • 以及不同状态下展示的不同操作按钮
_images/31_task_running.png

4.3 运行时长

正在运行状态的算法任务的运行时长会不断更新

_images/30_task_list_runtime.png

4.4 运行状态及操作按钮

    1. 正在运行: 【撤销并删除】

点击按钮后会直接停止并删除该任务

_images/32_task_running_delete.png
    1. 运行失败: 【查看原因】、【删除】

点击【查看原因】弹出弹出框展示失败原因

_images/33_task_fail_reason.png

点击【删除】直接删除该任务

_images/34_task_fail_delete.png
    1. 运行成功: 【查看结果】及【删除】

点击【查看结果】

如果结果为存储在数据库中的图,则会弹出新的tab页,自动连接结果图

_images/35_task_result_graph.png

如果存储在hdfs,则弹出框展示用户输入的hdfs路径

点击【删除】

如果结果为存储在数据库中的图,则会弹出确认框,提示用户是否同时删除结果图

_images/36_task_success_delete.png

如果存储在HDFS,则会弹出结果路径,提示如需删除则需要用户自行删除

_images/37_task_hdfs_delete.png

4.5 搜索及翻页

    1. 列表头部有搜索栏,可以对任务名称进行搜索
_images/38_task_search.png _images/39_task_search_res.png
    1. 底部新增翻页功能,默认每页展示5个任务,可以进行选择每页展示5个任务或者10个或者20个任务
_images/40_task_list_pagenator.png _images/41_task_paginator_rows.png
  1. 内置算法说明

5.1 广度优先搜索

    1. 参数详解:
-T 按指定的度数停止搜索, 如未指定,则会遍历全图

-S 指定搜索起点,通过json描述,必选参数, 形式为 -S source_json
格式为 {"节点类型名称"":[主键集合]}。 即json中含有⼀个数组, 数组中每⼀项是⼀个主键数组。
例如: -S "{\"company\":[\"company_1\",\"北京偶数科技有限公司\"]}"

-q 指定搜索条件,通过json描述,必选参数, 形式为 -q query_json
例如 -q "{\"bool\":{\"must\":{\"prefix\":{\"name\":\"⼴东远景信息科技\"}}}}",
表示必须为顶点必须有一个name属性, 且该属性值以“⼴东远景信息科技”开头。
具体语法格式如下:
1. json必须包含 bool 属性, bool 属性对应⼀个 bool 匹配器, bool 匹配器提供三种匹
配⽅式, 每种匹配为一个子匹配器数组。
    1. must: 相当于 and, 每个⼦匹配器必须完全被满⾜, 否则匹配失败。
    2. must_not: 相当于 not, 若⼦匹配器有一个被满⾜, 则匹配失败
    3. should: 相当于 or, 任意⼀个⼦匹配器成功即可。 should 为空时默认匹配成功。
    4. 特殊情况: 三者都为空时(即都⽆⼦匹配器), 默认为任意匹配,即总是 匹配成功。
2. 匹配对象是顶点, 即通过顶点的属性进⾏筛选。⼦匹配器包括:字符串匹配器、数值匹配器以
及布尔匹配器。
    1. 字符串匹配器, 通过判断顶点属性中的某个字段是否拥有期望值来进行匹配。指定字段以
    及期望的值的类型必须是text。
    1. 精确匹配, {"term":{"targetField" : "expectedValue"}},指定的字段必须有
    指定的值。
    2. 精确匹配多个值中的一个,{"terms" :{"targetField" : ["expectedValue1",
    ...,"expectedValueN"]}},指定的字段必须有列表中的任意⼀个值。
    3. {"prefix":{"targetField": "expectedPrefix"}}, 前缀匹配,指定的字段的值必
    须有指定前缀。
    4. 模糊匹配,{"fuzzy":{"targetField": "expectedValue"}},如abc能够模糊匹配
    aba。
    5. 通配符匹配,{"wildcard":{ "targetField": "pattern"}} 。 ? 匹配任意⼀个字
    符,* 匹配任意个字符,也可匹配空。如 g?a*ph 可以匹配graph。
    6. 正则匹配,{"regex":{ "targetField": "pattern"}}。
    7. 字段匹配,{"exists":{"field" : "targetField"}},顶点属性中必须存在该字段,
    field ⽤来指示⽬标字段。
    2. 数值匹配器, 支持常用数学运算以及关系比较。
    1. 值类型,{"math":{"value" : number | "targetField"}}, math表示一个值
    或者是顶点属性中某个字段的值, 该值必须为4或8字节的整型或者是4或8字节的浮点数。
    2. 复合表达式,{"math":{"lhs" : math, "rhs" : math, op: "+-\*/"}, math
    支持表达式运算,表达式的两项分别用lhs和rhs表示, 它们都是一个math运算器。 op表示
    运算符,取值为+-\*/中的任意一个。
    3. 关系运算,{"relation": {"lhs":math, "rhs":math,"op":""}},
    参与比较的两项分别以math运算器表示,运算符op可选值为:>、>=、=、<=、<。
    3. 布尔匹配器: 允许嵌套布尔匹配器, 从⽽⽀持完整的逻辑运算。
    1. 参数示例
-T 300 -q "{\"bool\":{\"must\":{\"exists\":{\"field\":\"p_personid\"}}}}" -S "{\"person\":[933]}"
_images/42_bfs.png
    1. 运行结果

节点的skylon_community_id属性代表该点是在第几层遍历到的

_images/42_bfs_res.png

5.2 网页排名算法

结果图内每个点会以rank属性来表示该点的rank值

_images/46_pagerank_result.png

5.3 社区发现类算法

    1. 包含
    • Louvain社区发现
    • 强/弱连通分量
    • K核算法
    1. 结果

结果图中会根据每个点的skylon_community_id来标名该点所属的社区

_images/51_community_res.png

5.4 随机游走

    1. 运行算法
  • 此时需要填写结果表名而不是结果图名,
  • 表名也会查空和查重,长度不允许超过63
  • 同时也没有hdfs和数据库选项,不需要选择格式
_images/48_randomwalk.png
    1. 查看结果
  • 跳转到一个新的tab,连接的图是运行算法的数据源图
_images/49_randomwalk_res.png
  • 在查出的点上右键点击查看随机游走结果,此时会高亮展示该点的随机游走路径
_images/50_randomwalk_res.png

五、GQL脚本命令

创建VERTEX LABEL:

CREATE VERTEX person (code text, name text, age int, PRIMARY KEY(code));

CREATE VERTEX card (code text, PRIMARY KEY(code));

创建EDGE LABEL:

CREATE EDGE owns (from person, to card);

CREATE EDGE translate (from card, to card, id text, amount int, DISCRIMINATOR(id));

创建图:

创建图的时候可以指定不同存储类型的图,目前支持的类型有magmaap,orc,heap,创建的语法如下:

CREATE GRAPH graphname(vertex(person, card), edge(owns, translate))format 'magmaap';

CREATE GRAPH graphname(vertex(person, card), edge(owns, translate))format 'orc';

CREATE GRAPH graphname(vertex(person, card), edge(owns, translate))format 'heap';

创建图的时候默认是不创建主键的索引的,如果需要创建图的时候根据点和边的主键创建唯一索引,可以用如下语句:

CREATE GRAPH graphname(vertex(person, card), edge(owns, translate))format 'magmaap' with(primaryindex=false);

CREATE GRAPH graphname(vertex(person, card), edge(owns, translate))format 'heap' with(primaryindex=true);

注:orc格式的图不支持唯一索引

创建index

可以对图中任一类型的点或边创建索引,创建vertex index语法如下:

CREATE INDEX indexname ON graphname.person (age);

CREATE UNIQUE indexname INDEX ON graphname.person (code);

创建edge index时,可以任意选择edge的属性和源点、目标点的主键,源点和目标点的主键用 FROMTO 表示:

CREATE INDEX indexname ON graphname.translate (FROM, TO, id);

这样索引有三列,(src_person.code, dst_person.code, id)

也可以建立反转edge的index,如

CREATE INDEX indexname ON graphname.translate (TO, FROM, id);

该语句的索引列为 (dst_person.code, src_person.code, id)

注:创建UNIQUE INDEX时必须向左包含primary key/DISCRIMINATOR。如给person创建UNIQUE INDEX,则必须包含code,且code在最左边。

插入数据

INSERT INTO graphname.person VALUES('1234567', '小李', 24);

INSERT INTO graphname.person VALUES('2345678', '小王', 25);

INSERT INTO graphname.card VALUES('6666666');

INSERT INTO graphname.card VALUES('7777777');

INSERT INTO graphname.owns VALUES('1234567', '6666666');

INSERT INTO graphname.owns VALUES('2345678', '7777777');

INSERT INTO graphname.translate VALUES('6666666', '7777777','t123', 10000);

查询数据

单独查询vertex:

SELECT * FROM graphname.person;

单独查询edge:

SELECT * FROM graphname.translate

根据一条edge查询vertex的信息:

SELECT * FROM (SELECT * FROM graphname.translate WHERE id='t123')AS t1 INNER JOIN graphname.owns ON t1.src_code=graphname.owns.dst_code OR t1.dst_code=graphname.owns.dst_code INNER JOIN graphname.person ON graphname.owns.src_code=graphname.person.code;

删除graph

创建出的图、点、边、索引均可以drop

DROP GRAPH graphname;

DROP VERTEX person;

DROP VERTEX card;

DROP EDGE owns;

DROP EDGE translate;

DROP INDEX indexname;