加载图

您可以通过从关系表中加载顶点和边实现加载图。

前提条件

  • 使用高权限账号创建ganos_graph插件。

    说明
    • 该插件依赖AGE相关功能,请先安装并启用AGE插件后安装当前插件。

    • 如在安装插件时遇到ERROR: invalid extension name: "ganos_graph"类似错误,请联系我们

    CREATE EXTENSION IF NOT EXISTS ganos_graph;
  • 在加载数据之前需提前创建图和标签。

  • 顶点数据只能加载一次,多次加载可能出现id冲突。

加载图

从对应关系表中加载图包括加载顶点和加载边两个步骤,对此为您提供以下两个函数。

load_labels_from_table

用于从顶点关系表加载顶点。

语法

load_labels_from_table('<图名称>',
                      '<标签名称>',
                      '<表名称>',
                      '<节点唯一id字段名称>' default 'id')

其中,顶点关系表中除唯一id字段外,其他字段均加载为顶点属性。

load_edges_from_table

用于从边关系表加载边。

语法

load_edges_from_table('<图名称>',
                    '<标签名称>',
                    '<表名称>',
                    '<起始节点标签名称>',
                    '<终止节点标签名称>',
                    '<起始id字段名称>' default 'from_id',
                    '<终止id字段名称>' default 'to_id');

其中,请确保边关系表中包含起始id终止id说明边的连接关系。且边关系表中的起始id终止id与顶点关系表中的<节点唯一id字段名称>保持一致。边关系表中除起始id字段名称终止id字段名称外,其他字段均加载为顶点属性。

示例

以下为您提供一个简单的SQL示例,用于从关系表中加载一张简单的图。

  1. 基础数据准备。

    1. 创建对应关系表并插入测试数据。

      CREATE TABLE public.v_user_raw(id integer, type text, uid text, name text, age integer);
      INSERT INTO v_user_raw VALUES
      (1, 'A','U1', 'Alice', '33'),
      (2, 'B','U1', 'Bob', '21');
      
      CREATE TABLE public.v_product_raw(id integer, product_id text, price double precision);
      INSERT INTO v_product_raw VALUES
      (1, 'INAKLIDAS', '50'),
      (2, 'ENKUCLKSD', '80'),
      (3, 'IIUIHAKLS', '320'),
      (4, 'SDVDSUHEE', '340');
      
      CREATE TABLE public.e_own_raw(from_id integer, to_id integer, product_id text, buy_price text);
      INSERT INTO e_own_raw VALUES
      (1, 1, 'INAKLIDAS', '45'),
      (2, 1, 'ENKUCLKSD', '70'),
      (2, 3, 'INAKLIDAS', '50'),
      (1, 4, 'SDVDSUHEE', '330');
    2. 创建图和标签。

      SELECT create_graph('toys');
      SELECT create_vlabel('toys','v_user');
      SELECT create_vlabel('toys','v_product');
      SELECT create_elabel('toys','e_own');
  2. 从关系表中加载图。

    1. 加载顶点。

      SELECT load_labels_from_table('toys', 'v_user', 'v_user_raw', 'id');
      SELECT load_labels_from_table('toys', 'v_product', 'v_product_raw', 'id');

      可通过以下语句查看图中所有顶点:

      SELECT * FROM cypher('toys', $$
        MATCH (n)
        RETURN n
      $$) AS (n agtype);

      返回结果如下:

                                                                   n                                                              
      ----------------------------------------------------------------------------------------------------------------------------
       {"id": 844424930131969, "label": ["v_user"], "properties": {"age": 33, "uid": "U1", "name": "Alice", "type": "A"}}::vertex
       {"id": 844424930131970, "label": ["v_user"], "properties": {"age": 21, "uid": "U1", "name": "Bob", "type": "B"}}::vertex
       {"id": 1125899906842625, "label": ["v_product"], "properties": {"price": 50, "product_id": "INAKLIDAS"}}::vertex
       {"id": 1125899906842626, "label": ["v_product"], "properties": {"price": 80, "product_id": "ENKUCLKSD"}}::vertex
       {"id": 1125899906842627, "label": ["v_product"], "properties": {"price": 320, "product_id": "IIUIHAKLS"}}::vertex
       {"id": 1125899906842628, "label": ["v_product"], "properties": {"price": 340, "product_id": "SDVDSUHEE"}}::vertex
      (6 rows)
    2. 加载边。

      SELECT load_edges_from_table('toys', 'e_own', 'e_own_raw', 'v_user', 'v_product');

      可通过以下语句查看图中所有边:

      SELECT * FROM cypher('toys', $$
        MATCH ()-[e:e_own]->()
        RETURN e
      $$) AS (e agtype);

      返回结果如下:

                                                                                          e                                                                                     
      --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       {"id": 1407374883553281, "label": "e_own", "end_id": 1125899906842625, "start_id": 844424930131969, "properties": {"buy_price": "45", "product_id": "INAKLIDAS"}}::edge
       {"id": 1407374883553282, "label": "e_own", "end_id": 1125899906842625, "start_id": 844424930131970, "properties": {"buy_price": "70", "product_id": "ENKUCLKSD"}}::edge
       {"id": 1407374883553283, "label": "e_own", "end_id": 1125899906842627, "start_id": 844424930131970, "properties": {"buy_price": "50", "product_id": "INAKLIDAS"}}::edge
       {"id": 1407374883553284, "label": "e_own", "end_id": 1125899906842628, "start_id": 844424930131969, "properties": {"buy_price": "330", "product_id": "SDVDSUHEE"}}::edge
      (4 rows)