• gStore最新版本1.0之自定义图分析算子


    gStore最新版本1.0之自定义图分析算子

    在内核版本v1.0中,开放了自定义图分析算子接口,可以通过接口函数获取图数据的结点数、边数、任意给定结点的邻居等,以此为基本单元进行实现;接下来将逐一进行介绍。

    1、开放接口

    在调用开发接口之前,需要启动ghttp服务,假设ghttp服务的监听端口为9000

    请求URL: http://127.0.0.1:9000

    参数传递:POST请求,httprequest 中的body中的raw,以JSON结构传递

    参数名必选类型说明
    operationstring操作名称,固定值为**funcudb**
    usernamestring用户名
    passwordstring密码(明文或md5加密后的密文)
    encryptionstring为空,则密码为明文,为1表示用md5加密
    typestring1:新增,2:修改,3:删除,4:编译
    funInfoJSONObject算子函数
    ---- funNamestring函数名称
    ---- funDescstring描述
    ---- funArgsstring参数类型(1无K跳参数,2有K跳参数):新增、修改必填
    ---- funBodystring函数内容(以{}包裹的内容):新增、修改必填
    ---- funSubsstring子函数(可用于fun_body中调用)
    ---- funReturnstring返回类型(path:返回路径类结果,value:返回值类结果):新增、修改必填

    返回值

    参数类型说明
    StatusCodeint返回值代码值(具体请参考附表:返回值代码表)
    StatusMsgstring返回具体信息

    2、函数介绍

    2.1 函数定义

    当我们创建算子函数时,将会自动生成如下函数定义声明,函数内容为算法的实现(即接口中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 算法的实现逻辑
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    有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 算法的实现逻辑
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    参数说明:

    • 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>"},
                ......
            ]
        }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    备注:如果需要返回路径结果,在自定义函数中,我们把找到的路径结点ID存入vector集合中,再调用

    queryUtil->getPathString(std::vector &path_set)接口返回string格式的路径结果集。

    • **值:**返回原始的结果,即直接输出自定义函数返回的字符串值
    {
        ......
    	"value": "xxx" //function return value
        ......
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • **键值对:**以key-value的形式返回结果,key为IRI结点ID, value为结果值(如PageRank算子的排名值)
    [
        {"dst": "<结点IRI>", "value": "值"},
        ......
        {"dst": "<结点IRI>", "value": "值"}
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、PathQueryHandler接口函数

    3.1 获取结点总数

    int getVertNum();
    
    • 1
    • 描述:获取图中结点的总数
    • 参数:无
    • 返回值:图中结点总数

    3.2 获取边总数

    int getEdgeNum();
    // 获取以集合中的谓词为标签的边的总数
    int getSetEdgeNum(const std::vector &pred_set);
    
    • 1
    • 2
    • 3
    • 描述:获取图中边的总数

    • 参数:

      pred_set: 谓词集合

    • 返回值:图中边总数

    3.3 获取结点下标

    // 获取结点在入边CSR的offset_list中对应的下标 
    int getInIndexByID(int vid, int pred);
    
    // 获取结点在出边CSR的offset_list中对应的下标 
    int getOutIndexByID(int vid, int pred);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 描述:已知结点ID、谓词编号,获取此结点在出边或入边CSRoffset_list(即存储结点在总的邻接列表adjacency_list中下标的数组)中对应的下标。主要在获取结点邻居数的图访问接口中被调用。

    • 参数:

      vid: 结点ID

      pred: 谓词编号

    • 返回值:vid在入或出边CSR的offset_list中对应的下标

    3.4 获取结点邻居数

    // 获取结点入边所关联的邻居数
    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 描述:指定结点和某个谓词,仅返回以此谓词为标签的入边/出边所关联的邻居数。

    • 参数:

      vid: 结点ID

      pred: 谓词编号

      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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 描述:获取指定结点入或出边邻居ID,一般与获取邻居数的函数配合使用。

    • 参数:

      vid: 结点ID

      pred: 谓词编号

      pos: 取第pos个邻居(邻居之间没有固定的排序标准)

    • 返回值:vid入或出边邻居ID

    3.6 路径集合转字符串

    string getPathString(std::vector &path_set);
    
    • 1
    • 描述:路径集合转字符串,值之间用,分割

    • 参数:

      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 { };
    
    • 1
    • 2
    • 3
    • 4
    • 5

    参数说明:

    • iri_set: 参数和结点IRI集合,如: {, }{, ?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: *谓词集合(当参数设置为空{},则装载所有谓词),如:* {<喜欢>,<关注>}{}`

    • fun_name: 自定义函数名称,如: shortestPath

    5、可视化管理

    除了通过开放接口对自定义图分析算子进行管理外,在最新版本的gstore-workbench中还提供了可视化的管理方式,更加简单和高效:
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Java多线程
    网安播报|MOVEit 被发现9.1 分高危漏洞,威胁全球 2700 多家组织
    AUTOSAR规范与ECU软件开发(实践篇)9.6 AUTOSAR安全机制的程序流监控
    logback(三)mybatis-plus结合logback将sql语句输出到日志文件
    vue实现带有横向和纵向双表头
    nvidia xavier部署fcos3d
    洗地机哪个品牌最耐用质量好?2023年最好用的洗地机
    【C++】动态内存管理
    SQL 增删改查
    报错:“[Thread-0] INFO CoreNLP - CoreNLP Server is shutting down.”
  • 原文地址:https://blog.csdn.net/weixin_48167662/article/details/126518428