mariadb 在Apache-Age中如何将顶点或边指定为graphid

disbfnqx  于 2023-04-11  发布在  Apache
关注(0)|答案(2)|浏览(152)

我正在研究Apache-Age的内部结构或架构,我知道如何在Apache-Age中创建图形,顶点或边,但我不明白它是如何在内存中分配一个graphid的。
对于图形创建:

SELECT create_graph('graph_name');

对于顶点创建:

SELECT * 
FROM cypher('graph_name', $$
    CREATE (n)
$$) as (v agtype);

对于边创建:

SELECT * 
FROM cypher('graph_name', $$
    MATCH (a:label), (b:label)
    WHERE a.property = 'Node A' AND b.property = 'Node B'
    CREATE (a)-[e:RELTYPE]->(b)
    RETURN e
$$) as (e agtype);

现在,我很困惑,内存中发生了什么,比如图如何分配内存,然后顶点和边如何分配内存中的这些graphids。还分享了Apache-Age在存储内存中的图形数据库时使用的数据结构,以及其他属性如何被赋予graphid。

wi3ka0sx

wi3ka0sx1#

基于正在调用的密码查询(即第一个参数),将顶点分配给graphid,在后端检查并获取具有匹配图形名称的图形的对象ID并将其分配给它们。

您需要检查源代码以连接所有内容。
在您的查询中:

1-一个名为'graph_name'的图有一个唯一的对象ID,它被添加到图表表中,并存储在一个哈希表中,用于快速访问当前现有的表

SELECT create_graph('graph_name');

2-获取名为'graph_name'的图的对象ID,并创建一个顶点,将它们连接在一起并存储它

SELECT * 
FROM cypher('graph_name', $$
    CREATE (n)
$$) as (v agtype);

3-做类似的事情。
AGE使用了一个自定义数据类型,名为agtype,* 是AGE* 返回的唯一数据类型。AgtypeJson超集,是JsonB的一个custom实现。这里是使用的数据结构,也可以在github上的源代码中查看。

/*
 * agtype_value: In-memory representation of agtype.  This is a convenient
 * deserialized representation, that can easily support using the "val"
 * union across underlying types during manipulation.  The agtype on-disk
 * representation has various alignment considerations.
 */
struct agtype_value
{
    enum agtype_value_type type; /* Influences sort order */

    union
    {
        int64 int_value; /* Cypher 8 byte Integer */
        float8 float_value; /* Cypher 8 byte Float */
        Numeric numeric;
        bool boolean;
        struct
        {
            int len;
            char *val; /* Not necessarily null-terminated */
        } string; /* String primitive type */

        struct
        {
            int num_elems;
            agtype_value *elems;
            bool raw_scalar; /* Top-level "raw scalar" array? */
        } array; /* Array container type */

        struct
        {
            int num_pairs; /* 1 pair, 2 elements */
            agtype_pair *pairs;
        } object; /* Associative container type */

        struct
        {
            int len;
            agtype_container *data;
        } binary; /* Array or object, in on-disk format */
    } val;
};

参考文献:

lpwwtiir

lpwwtiir2#

graphid. c文件处理graphid操作,请在此链接上查看
https://github.com/apache/age/blob/master/src/backend/utils/adt/graphid.c
它有一个make_graphid函数,该函数执行一个操作,该操作将始终返回相同的graphid,给定相同的参数:

graphid make_graphid(const int32 label_id, const int64 entry_id)
{
    uint64 tmp;

    if (!label_id_is_valid(label_id))
    {
        ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                        errmsg("label_id must be %d .. %d",
                               LABEL_ID_MIN, LABEL_ID_MAX)));
    }
    if (!entry_id_is_valid(entry_id))
    {
        ereport(ERROR,
                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                 errmsg("entry_id must be " INT64_FORMAT " .. " INT64_FORMAT,
                        ENTRY_ID_MIN, ENTRY_ID_MAX)));
    }

    tmp = (((uint64)label_id) << ENTRY_ID_BITS) |
          (((uint64)entry_id) & ENTRY_ID_MASK);

    return (graphid)tmp;
}

相关问题