文章目录
tips:在TigerGraph中,可以使用图形化界面创建数据库,映射数据;此处介绍的是使用GSQL的方式
创建图数据库
创建顶点
CREATE VERTEX 顶点名(
PRIMAEY_ID 主键 STRING,
属性1 STRING
属性2 STRING
属性3 INT
);
数据类型
- INT:INT 是整数类型,用于存储有符号的整数值。它可以表示负数和正数,但不包括小数部分。
- UINT:UINT 是无符号整数类型,用于存储非负整数值。它只能表示非负数,不包括负数和小数部分。
- FLOAT:FLOAT 是单精度浮点数类型,用于存储带有小数点的数值。它提供较高的精度和范围,适用于大多数浮点数计算需求。
- DOUBLE:DOUBLE 是双精度浮点数类型,用于存储双精度浮点数值。它提供更高的精度和范围,相对于 FLOAT,适用于需要更高精度计算的场景。
- STRING:STRING 是字符串类型,用于存储文本数据。它可以包含任意长度的字符序列。
- VARCHAR:VARCHAR 是可变长度字符串类型,用于存储可变长度的文本数据。与 STRING 类型不同,VARCHAR 类型可以指定最大长度,节省存储空间。
创建边
无向边
CREATE UNDIRECTED EDGE 边名(
FROM 起始顶点,
To 结束顶点
);
有向边
CREATE DIRECTED EDGE 边名(
FROM 起始顶点,
To 结束顶点
);
反向边
如果声明CREATE DIRECTED EDGE
时同时声明了参数WITH REVERSE_EDGE=" rev_name "
,则会自动生成一个额外的有向型边" rev_name "。该边的起点与终点与原始创建边相反。之后,每当一个新的边生成,就会自动生成一个反向的边。反向的边拥有与原始边相同的属性。同时,当原始的边有变更时,对应反向的边也同时会变更。
在TigerGraph系统中,反向的边可以大幅增加图查询的效率,特别是需要回溯的查询。
创建图
CREATE GRAPH 图名(
-- 定义顶点类型
顶点1 (PRIMARY_ID 主键 STRING, 属性1 STRING, 属性2 INT, 属性3 STRING),
顶点2 (PRIMARY_ID 主键 STRING, 属性1 DOUBLE, 属性2 DATETIME),
顶点3 (PRIMARY_ID 主键 STRING, 属性1 STRING),
-- 定义边类型
边1 (FROM 起始顶点, TO 结束顶点),
边2 (FROM 起始顶点, TO 结束顶点),
-- 定义索引
索引名 ON 顶点(属性)
)
导入数据
-
添加csv数据文件
-
创建映射关系JOB
CREATE LOADING JOB job名 FOR GRAPH 图名{
DEFINE FILENAME 数据文件名;
LOAD 数据文件名 TO EDGE 边名 VALUES
-- 第7列,第2列
($7,$2,_,_,_,_,$0)
-- 以什么符号作为分隔符,是否有表头,行尾以什么字符结束
USING SEPARATOR=",",HEADER="FALSE",EOL="\n";
}
- 加载运行映射关系
RUN LOADING JOB job名 using f="文件路径"
编写查询
resultSet = SELECT vSet
-- FROM 后也可以是单独的点和边集
FROM startSet:s - (edgeTypes:e) -> targetTypes:t
-- 后续都可选
SAMPLE 随即采样
WHERE 条件过滤
ACCUM 基于边并行计算
POST-ACCUM基于点并行计算
HAVING 条件过滤
ORDER 排序
LIMIT 限制输出
tips:
ANY
表示图中的所有顶点,用于全局计算person.*
表示图中的所有 person 类型的顶点。PRINT
输出图结果
累加器Accumulators
定义累加器
-- 定义了一个名为 @@globalMax 的累加器,它的类型是 MaxAccum <INT>,是一种标量累加器,表示在累积过程中保留最大值。
MaxAccum <INT> @@globalMax;
-- 定义了一个名为 @tags 的累加器,它的类型是 SetAccum <String>,表示它是一个容器累加器,用于在查询过程中累积唯一的字符串值。
SetAccum <String> @ tags;
(1)Scaler Accumulator(标量累加器)
-
SumAccum #保留求和值
-
MinAccum / MaxAccum / AvgAccum #保留最小、最大、平均值
-
AndAccum / OrAccum #保留Bool值
-
BitwiseAndAccum / BitwiseOrAccum
-
CountAccum #用于计算累加项的数量
(2)Container Accumulators(容器累加器)
-
ListAccum > [ ]
-
SetAccum > ()
-
BagAccum > 无序容器
-
MapAccum > {}
-
ArrayAccum > 多维数组
-
HeapAccum > 堆排序
-
GroupByAccum > 复合累加器
ACCUM 面向边计算
#1. 定义全局变量
AvgAccum @@avgIncome;
MinAccum<DOUBLE> @@minIncome;
MaxAccum<DOUBLE> @@maxIncome;
#2. 写查询
-- 在执行这个查询语句时,将选择符合条件的 "Customer" 顶点,并根据边 "salary_by" 的收入属性累加计算平均收入、最低收入和最高收入。查询的结果存储在名为 "Result" 的变量中
Result = SELECT cust
FROM Customer:cust -(salary_by:e)-> Company:compWHERE cust.age BETWEEN 18 AND 50
ACCUM @@avgIncome += e.income,
@@minIncome += e.income,
@@maxIncome += e.income,
POST-ACCUM面向点集计算
SetAccum<EDGE> @@visRes;
SetAccum<VERTEX> @@invitedPersonNum;
invited_users = SELECT t
FROM users:s -(User_Refer_Users:e)- :t
WHERE t!= inputUser
-- 边集
ACCUM @@visRes += e
-- 点集
POST-ACCUM @@invitedPersonNum +=1;
流程控制语句
判断
IF condition THEN statements
[ELSE IF condition THEN statements]
[ELSE statements]
END
people = SELECT v FROM startingVertex -(friend:e)->:v
ACCUM CASE v.gender
WHEN 'Male' THEN @@males +=1
WHEN 'Female' THEN @@females +=1
ELSE @@unknown += 1
END;
循环
WHILE condition [LIMIT (name|integer)] DO
statements
END
FOREACH item IN RANGE[a,b].STEP(c) DO
@@total += @@masterList[list];
END;
集合操作
VSet1 = [1,2,3]
VSet2 = [3,4,5]
VSet3 = VSet1 `UNION` VSet2; [1,2,3,4,5] #并集(去重)
VSet4 = VSet1 `INTERSECT` VSet2; [3] #交集
VSet5 = VSet1 `MINUS` VSet2; [1,2] #相减