gStore最新版本1.0之自定义图分析算子
在内核版本v1.0
中,开放了自定义图分析算子接口,可以通过接口函数获取图数据的结点数、边数、任意给定结点的邻居等,以此为基本单元进行实现;接下来将逐一进行介绍。
1、开放接口
在调用开发接口之前,需要启动ghttp服务,假设ghttp服务的监听端口为9000
请求URL: http://127.0.0.1:9000
参数传递:POST请求,httprequest
中的body
中的raw
,以JSON
结构传递
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
operation | 是 | string | 操作名称,固定值为**funcudb ** |
username | 是 | string | 用户名 |
password | 是 | string | 密码(明文或md5加密后的密文) |
encryption | 否 | string | 为空,则密码为明文,为1表示用md5加密 |
type | 是 | string | 1:新增,2:修改,3:删除,4:编译 |
funInfo | 是 | JSONObject | 算子函数 |
---- funName | 是 | string | 函数名称 |
---- funDesc | 否 | string | 描述 |
---- funArgs | 否 | string | 参数类型(1无K跳参数,2有K跳参数):新增、修改必填 |
---- funBody | 否 | string | 函数内容(以{} 包裹的内容):新增、修改必填 |
---- funSubs | 否 | string | 子函数(可用于fun_body中调用) |
---- funReturn | 否 | string | 返回类型(path :返回路径类结果,value :返回值类结果):新增、修改必填 |
返回值
参数 | 类型 | 说明 |
---|---|---|
StatusCode | int | 返回值代码值(具体请参考附表:返回值代码表) |
StatusMsg | string | 返回具体信息 |
2、函数介绍
2.1 函数定义
当我们创建算子函数时,将会自动生成如下函数定义声明,函数内容为算法的实现(即接口中funBody
参数部分),函数的返回值都必须转化为string类型
无K跳参数
#include "../../Query/PathQueryHandler.h"
using namespace std;
extern "C" string funName(std::vector<int> iri_set, bool directed, std::vector<int> pred_set, PathQueryHandler* queryUtil)
{
//TODO 算法的实现逻辑
}
有K跳参数
#include "../../Query/PathQueryHandler.h"
using namespace std;
extern "C" string funName(std::vector<int> iri_set, bool directed, int k, std::vector<int> pred_set, PathQueryHandler* queryUtil)
{
//TODO 算法的实现逻辑
}
参数说明:
iri_set
: 结点IRI集合directed
: 是否有向,布尔值(true-表示有向、false-表示无向,所有边视为双边)k
: 路径长度上限(查询K跳可达性)pred_set
: 谓词集合queryUtil
: CSR资源的操作接口,详见【3、PathQueryHandler接口函数】
2.2 返回值
在进行函数定义时,函数的返回结果可选择三种类型:路径
、值
、键值对
。
- **路径:**返回结果需要转换为
路径
格式,我们指定了以下统一的路径格式(在返回时会转化为json字符串形式)
[
{
"src": "<起始结点IRI>",
"dst": "<目标结点IRI>",
"edges": [ //边集合
{"fromNode": 出结点ID, "toNode": 入结点ID, "predIRI": "<构成边的谓词>"},
......
],
"nodes": [ //结点集合
{"nodeIndex": 结点ID, "nodeIRI": "<结点IRI>"},
......
]
}
]
备注:如果需要返回路径
结果,在自定义函数中,我们把找到的路径结点ID存入vector<int>
集合中,再调用
queryUtil->getPathString(std::vector<int> &path_set)
接口返回string格式的路径结果集。
- **值:**返回原始的结果,即直接输出自定义函数返回的字符串值
{
......
"value": "xxx" //function return value
......
}
- **键值对:**以key-value的形式返回结果,key为IRI结点ID, value为结果值(如PageRank算子的排名值)
[
{"dst": "<结点IRI>", "value": "值"},
......
{"dst": "<结点IRI>", "value": "值"}
]
3、PathQueryHandler接口函数
3.1 获取结点总数
int getVertNum();
- 描述:获取图中结点的总数
- 参数:无
- 返回值:图中结点总数
3.2 获取边总数
int getEdgeNum();
// 获取以集合中的谓词为标签的边的总数
int getSetEdgeNum(const std::vector<int> &pred_set);
-
描述:获取图中边的总数
-
参数:
pred_set
: 谓词集合 -
返回值:图中边总数
3.3 获取结点下标
// 获取结点在入边CSR的offset_list中对应的下标
int getInIndexByID(int vid, int pred);
// 获取结点在出边CSR的offset_list中对应的下标
int getOutIndexByID(int vid, int pred);
-
描述:已知结点ID、谓词编号,获取此结点在出边或入边CSR的
offset_list
(即存储结点在总的邻接列表adjacency_list
中下标的数组)中对应的下标。主要在获取结点邻居数的图访问接口中被调用。 -
参数:
vid
: 结点IDpred
: 谓词编号 -
返回值:
vid
在入或出边CSR的offset_list中对应的下标
3.4 获取结点邻居数
// 获取结点入边所关联的邻居数
int getInSize(int vid, int pred);
// 获取结点以集合中的谓词为标签的入边所关联的邻居数(不考虑去重)
int getSetInSize(int vid, const std::vector<int> &pred_set);
// 获取结点总的入边数(可选是否去重)
int getTotalInSize(int vid, bool distinct);
// 获取结点出边所关联的邻居数
int getOutSize(int vid, int pred);
// 获取结点以集合中的谓词为标签的出边所关联的邻居数(不考虑去重)
int getSetOutSize(int vid, const std::vector<int> &pred_set);
// 获取结点总的出边数(可选是否去重)
int getTotalOutSize(int vid, bool distinct);
-
描述:指定结点和某个谓词,仅返回以此谓词为标签的入边/出边所关联的邻居数。
-
参数:
vid
: 结点IDpred
: 谓词编号pred_set
: 谓词编号集合distinct
: 是否去重(true则要求去重) -
返回值:
vid
入或出边所关联的邻居数
3.5 获取结点邻居ID
// 获取结点入边邻居ID
int getInVertID(int vid, int pred, int pos);
int getInVertID(int vid, int pos);
// 获取结点出边邻居ID
int getOutVertID(int vid, int pred, int pos);
int getOutVertID(int vid, int pos);
-
描述:获取指定结点入或出边邻居ID,一般与获取邻居数的函数配合使用。
-
参数:
vid
: 结点IDpred
: 谓词编号pos
: 取第pos个邻居(邻居之间没有固定的排序标准) -
返回值:
vid
入或出边邻居ID
3.6 路径集合转字符串
string getPathString(std::vector<int> &path_set);
-
描述:路径集合转字符串,值之间用
,
分割 -
参数:
path_set
: 路径编号集合 -
返回值:以
,
分割的字符串
4、执行示例
当我们完成自定义图分析算子的创建、编译后,就可以通过SPARQL语句去执行算子函数,通过统一入口PFN
函数进行调用:
# 无K跳参数
SELECT (PFN(iri_set, directed, pred_set, fun_name) AS ?z) WHERE { };
# 有k跳参数
SELECT (PFN(iri_set, directed, k, pred_set, fun_name) AS ?z) WHERE { };
参数说明:
iri_set
: 参数和结点IRI集合,如:{<Francis>, <Bob>}
或{<Eve>, ?x}
directed
: 是否有向,布尔值(true-表示有向、false-表示无向,所有边视为双边)k
: 路径长度上限(查询K跳可达性)path_set
: 谓词集合(当参数设置为空{},则装载所有谓词),如:{<喜欢>,<关注>}
或{}
fun_name
: 自定义函数名称,如:shortestPath
5、可视化管理
除了通过开放接口对自定义图分析算子进行管理外,在最新版本的gstore-workbench中还提供了可视化的管理方式,更加简单和高效:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gUTZD3Zs-1661392337956)(D:\BaiduSyncdisk\weekly\2022-08-22gstore最新版本1.0之自定义图分析算子\5-1.png)]
th_set</font>: *谓词集合(当参数设置为空{},则装载所有谓词),如:*
{<喜欢>,<关注>}或
{}`
fun_name
: 自定义函数名称,如:shortestPath
5、可视化管理
除了通过开放接口对自定义图分析算子进行管理外,在最新版本的gstore-workbench中还提供了可视化的管理方式,更加简单和高效: