您可以通过从关系表中加载顶点和边实现加载图。
前提条件
使用高权限账号创建
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示例,用于从关系表中加载一张简单的图。
基础数据准备。
创建对应关系表并插入测试数据。
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');
创建图和标签。
SELECT create_graph('toys'); SELECT create_vlabel('toys','v_user'); SELECT create_vlabel('toys','v_product'); SELECT create_elabel('toys','e_own');
从关系表中加载图。
加载顶点。
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)
加载边。
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)
该文章对您有帮助吗?