介绍
以下文章,我将从PostgreSQL的角度让您更多地了解Apache Age Age后端的情况,并为您提供有关使用Apache Age在Postgresql上的图形创建的简短介绍。
先决条件
- PostgreSQL
- Apache Age li>
如果您没有他们访问我的博客,您将学习如何安装它们
开始
主要是Apache Age中的所有内容都是用C编写并加载到PostgreSQL的函数,作为任何PL/SQL函数
so, create_graph 是一个函数,它在age-1.3.0.sql中定义(例如,根据使用的版本而变化)
看起来如何
CREATE FUNCTION ag_catalog.create_graph(graph_name name)
RETURNS void
LANGUAGE c
AS 'MODULE_PATHNAME';
如何实施?
PG_FUNCTION_INFO_V1(create_graph);
/* function that is evoked for creating a graph */
Datum create_graph(PG_FUNCTION_ARGS)
{
char *graph;
Name graph_name;
char *graph_name_str;
Oid nsp_id;
//if no argument is passed with the function, graph name cannot be null
if (PG_ARGISNULL(0))
{
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("graph name can not be NULL")));
}
//gets graph name as function argument
graph_name = PG_GETARG_NAME(0);
graph_name_str = NameStr(*graph_name);
//checking if the name of the graph falls under the pre-decided graph naming conventions(regex)
if (!is_valid_graph_name(graph_name_str))
{
ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("graph name is invalid")));
}
//graph name must be unique, a graph with the same name should not exist
if (graph_exists(graph_name_str))
{
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_SCHEMA),
errmsg("graph \"%s\" already exists", graph_name_str)));
}
nsp_id = create_schema_for_graph(graph_name);
//inserts the graph info into the relation which has all the other existing graphs info
insert_graph(graph_name, nsp_id);
//Increment the Command counter before create the generic labels.
CommandCounterIncrement();
//Create the default label tables
graph = graph_name->data;
create_label(graph, AG_DEFAULT_LABEL_VERTEX, LABEL_TYPE_VERTEX, NIL);
create_label(graph, AG_DEFAULT_LABEL_EDGE, LABEL_TYPE_EDGE, NIL);
ereport(NOTICE,
(errmsg("graph \"%s\" has been created", NameStr(*graph_name))));
//according to postgres specification of c-language functions if function returns void this is the syntax
PG_RETURN_VOID();
}
最有趣的部分是什么
- 为该图创建一个名称空间(架构)
/*
* This is the same with running the following SQL statement.
*
* CREATE SCHEMA `graph_name`
* CREATE SEQUENCE `LABEL_ID_SEQ_NAME`
* AS integer
* MAXVALUE `LABEL_ID_MAX`
* CYCLE
* The sequence will be used to assign a unique id to a label in the graph.
*
* schemaname doesn't have to be graph_name but the same name is used so
* that users can find the backed schema for a graph only by its name.
*
* ProcessUtilityContext of this command is PROCESS_UTILITY_SUBCOMMAND
* so the event trigger will not be fired.
*/
nsp_id = create_schema_for_graph(graph_name);
- 在图表上的AG_CATALOG上创建新条目
// INSERT INTO ag_catalog.ag_graph VALUES (graph_name, nsp_id)
// =
insert_graph(graph_name, nsp_id);
- 以下语句创建了一个表格,用于保留(顶点和边缘)的标签
graph = graph_name->data;
create_label(graph, AG_DEFAULT_LABEL_VERTEX, LABEL_TYPE_VERTEX, NIL);
create_label(graph, AG_DEFAULT_LABEL_EDGE, LABEL_TYPE_EDGE, NIL);
结论
- 创建名称空间(schema)
- 插入ag_catalog图表表
- 在创建名称空间内创建顶点标签表
- 创建边缘标签表格中的“创建名称空间”
在引擎盖下的下一个年龄陈述中与您见面
资源和参考
- 年龄github:https://github.com/apache/age
- AGE Website: https://age.apache.org/