在内核版本v1.0中,开放了自定义图分析算子接口,可以通过接口函数获取图数据的结点数、边数、任意给定结点的邻居等,以此为基本单元进行实现;接下来将逐一进行介绍。
在调用开发接口之前,需要启动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 | 返回具体信息 |
当我们创建算子函数时,将会自动生成如下函数定义声明,函数内容为算法的实现(即接口中funBody参数部分),函数的返回值都必须转化为string类型
无K跳参数
#include "../../Query/PathQueryHandler.h"
using namespace std;
extern "C" string funName(std::vector iri_set, bool directed, std::vector pred_set, PathQueryHandler* queryUtil)
{
//TODO 算法的实现逻辑
}
有K跳参数
#include "../../Query/PathQueryHandler.h"
using namespace std;
extern "C" string funName(std::vector iri_set, bool directed, int k, std::vector pred_set, PathQueryHandler* queryUtil)
{
//TODO 算法的实现逻辑
}
参数说明:
iri_set: 结点IRI集合directed: 是否有向,布尔值(true-表示有向、false-表示无向,所有边视为双边)k: 路径长度上限(查询K跳可达性)pred_set: 谓词集合queryUtil: CSR资源的操作接口,详见【3、PathQueryHandler接口函数】 在进行函数定义时,函数的返回结果可选择三种类型:路径、值、键值对。
路径格式,我们指定了以下统一的路径格式(在返回时会转化为json字符串形式)[
{
"src": "<起始结点IRI>",
"dst": "<目标结点IRI>",
"edges": [ //边集合
{"fromNode": 出结点ID, "toNode": 入结点ID, "predIRI": "<构成边的谓词>"},
......
],
"nodes": [ //结点集合
{"nodeIndex": 结点ID, "nodeIRI": "<结点IRI>"},
......
]
}
]
备注:如果需要返回路径结果,在自定义函数中,我们把找到的路径结点ID存入vector集合中,再调用
queryUtil->getPathString(std::vector接口返回string格式的路径结果集。
{
......
"value": "xxx" //function return value
......
}
[
{"dst": "<结点IRI>", "value": "值"},
......
{"dst": "<结点IRI>", "value": "值"}
]
int getVertNum();
int getEdgeNum();
// 获取以集合中的谓词为标签的边的总数
int getSetEdgeNum(const std::vector &pred_set);
描述:获取图中边的总数
参数:
pred_set: 谓词集合
返回值:图中边总数
// 获取结点在入边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: 结点ID
pred: 谓词编号
返回值:vid在入或出边CSR的offset_list中对应的下标
// 获取结点入边所关联的邻居数
int getInSize(int vid, int pred);
// 获取结点以集合中的谓词为标签的入边所关联的邻居数(不考虑去重)
int getSetInSize(int vid, const std::vector &pred_set);
// 获取结点总的入边数(可选是否去重)
int getTotalInSize(int vid, bool distinct);
// 获取结点出边所关联的邻居数
int getOutSize(int vid, int pred);
// 获取结点以集合中的谓词为标签的出边所关联的邻居数(不考虑去重)
int getSetOutSize(int vid, const std::vector &pred_set);
// 获取结点总的出边数(可选是否去重)
int getTotalOutSize(int vid, bool distinct);
描述:指定结点和某个谓词,仅返回以此谓词为标签的入边/出边所关联的邻居数。
参数:
vid: 结点ID
pred: 谓词编号
pred_set: 谓词编号集合
distinct: 是否去重(true则要求去重)
返回值:vid入或出边所关联的邻居数
// 获取结点入边邻居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: 结点ID
pred: 谓词编号
pos: 取第pos个邻居(邻居之间没有固定的排序标准)
返回值:vid入或出边邻居ID
string getPathString(std::vector &path_set);
描述:路径集合转字符串,值之间用,分割
参数:
path_set: 路径编号集合
返回值:以,分割的字符串
当我们完成自定义图分析算子的创建、编译后,就可以通过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集合,如: {, } 或 {, ?x} directed: 是否有向,布尔值(true-表示有向、false-表示无向,所有边视为双边)k: 路径长度上限(查询K跳可达性)path_set: 谓词集合(当参数设置为空{},则装载所有谓词),如: {<喜欢>,<关注>}或{}fun_name: 自定义函数名称,如: shortestPath除了通过开放接口对自定义图分析算子进行管理外,在最新版本的gstore-workbench中还提供了可视化的管理方式,更加简单和高效:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gUTZD3Zs-1661392337956)(D:\BaiduSyncdisk\weekly\2022-08-22gstore最新版本1.0之自定义图分析算子\5-1.png)]
th_set: *谓词集合(当参数设置为空{},则装载所有谓词),如:* {<喜欢>,<关注>}或{}`
fun_name: 自定义函数名称,如: shortestPath除了通过开放接口对自定义图分析算子进行管理外,在最新版本的gstore-workbench中还提供了可视化的管理方式,更加简单和高效:

