支持复杂算法和迭代计算
分布式执行引擎优化
执行摘要
GSQL 是 TigerGraph 图数据库的核心查询与分析语言,它结合了 SQL 的声明式特性和图灵完备的编程能力,专为高效处理复杂图数据而设计。 GSQL 支持从数据加载、图模式定义到高级图算法和特定场景应用的全链路操作,其强大的控制流、累加器和并行处理机制使其能够应对大规模图数据的深度分析需求。
核心优势
图灵完备的语言设计,支持复杂算法实现
性能表现
并行处理引擎,支持大规模图数据计算
应用场景
社交网络、推荐系统、欺诈检测等
1. GSQL 语言基础
1.1 语法结构与核心概念
GSQL 语言借鉴了 SQL 的语法风格,使其对于熟悉关系型数据库的用户易于上手,但其核心设计理念是面向图数据的查询与分析。 GSQL 是一种图灵完备的语言,这意味着它可以表达任何可计算的算法,这主要得益于其强大的控制流语句和累加器机制 [1]。
执行模型示例
CREATE QUERY exampleQuery() FOR GRAPH MyGraph {
SumAccum<INT> @@globalCount = 0;
Start = {Person.*};
Result = SELECT v FROM Start:v
WHERE v.age > 30
ACCUM @@globalCount += 1;
PRINT @@globalCount;
}
1.2 数据类型与变量声明
GSQL 提供了丰富的数据类型来满足图数据建模和计算的需求。 基本数据类型包括 INT、UINT、FLOAT、DOUBLE、BOOL、STRING 和 DATETIME [47]。
变量作用域
局部变量
在查询或代码块内部声明
INT x;
参数
查询定义的输入参数
(INT p1, STRING p2)
累加器
并行聚合变量
@@global, @vertex
1.3 控制流语句 (IF, WHILE, FOR循环)
1.4 函数与运算符
GSQL 提供了丰富的内置函数和运算符,用于数据处理、转换、计算和聚合。 这些函数和运算符覆盖了字符串处理、数学运算、日期时间计算、类型转换等多个方面。
累加器操作
累加器支持特定的聚合操作,如
SumAccum
使用
+=
运算符,
ListAccum
使用
+=
添加元素,
SetAccum
添加不重复元素。
2. 图模式设计
2.1 顶点类型 (Vertex Types) 定义
在 TigerGraph 中,图模式的设计始于顶点类型(Vertex Types)的定义。顶点代表图数据模型中的实体或对象,例如人、地点、事物等 [46]。
顶点定义语法
CREATE VERTEX Person (
PRIMARY_ID name STRING,
age INT,
gender STRING,
state STRING
) WITH primary_id_as_attribute="true"
2.2 边类型 (Edge Types) 定义
边类型(Edge Types)定义了图中顶点之间的连接关系。 在 TigerGraph 中,使用 CREATE DIRECTED EDGE 或 CREATE UNDIRECTED EDGE 语句来定义边类型 [46] [47]。
边定义示例
// 无向边
CREATE UNDIRECTED EDGE Friendship (
FROM Person,
TO Person,
connect_day DATETIME
)
// 有向边(带反向边)
CREATE DIRECTED EDGE Transfer (
FROM Account,
TO Account,
amount DOUBLE,
transfer_date DATETIME
) WITH REVERSE_EDGE="Reverse_Transfer"
2.3 图模式 (Graph Schema) 构建原则
图模式(Graph Schema)是 TigerGraph 数据库的核心,它定义了数据的组织结构,包括顶点类型、边类型以及它们之间的关系 [48]。TigerGraph 采用"模式优先"(schema-first)的方法 [51]。
图模式创建示例
// 定义顶点类型
CREATE VERTEX Person (PRIMARY_ID name STRING, age INT, gender STRING)
CREATE VERTEX Movie (PRIMARY_ID title STRING, release_year INT, genre STRING)
// 定义边类型
CREATE UNDIRECTED EDGE Friendship (FROM Person, TO Person, since DATETIME)
CREATE DIRECTED EDGE Rated (FROM Person, TO Movie, rating INT, date DATETIME)
// 创建图模式
CREATE GRAPH SocialNet (Person, Movie, Friendship, Rated)
3. 数据加载与更新
3.1 从外部源加载数据 (CSV, JSON)
3.2 数据加载作业 (LOADING JOB) 的创建与执行
创建数据加载作业 (LOADING JOB) 是 TigerGraph 数据导入流程中的核心环节。 这个作业定义了数据源中的数据结构如何映射到已定义的图模式上 [9]。
加载作业示例
USE GRAPH Social;
BEGIN
CREATE LOADING JOB load_social FOR GRAPH Social {
DEFINE FILENAME file1="/path/to/persons.csv";
DEFINE FILENAME file2="/path/to/friendships.csv";
LOAD file1 TO VERTEX Person VALUES ($0, $1, $2)
USING header="true", separator=",";
LOAD file2 TO EDGE Friendship VALUES ($0, $1, $3)
USING header="true", separator=",";
}
END
3.3 数据插入、更新与删除操作 (UPSERT, DELETE)
TigerGraph 提供了多种机制来对图数据进行修改,包括插入(INSERT)、更新(UPDATE)和删除(DELETE)操作。 这些操作可以通过 GSQL 查询语句或专门的加载作业来完成。
事务支持
TigerGraph 支持 ACID 事务,保证数据修改操作的原子性和一致性。复杂的更新操作可以嵌入到 GSQL 查询中,在分析过程中动态改变图数据。
4. 查询设计与优化
4.1 GSQL 查询基础 (SELECT, FROM, WHERE)
GSQL 查询的核心是 SELECT 语句,它用于从图中检索数据。 一个典型的 GSQL SELECT 查询包含多个主要部分,每个部分都有特定的功能和优化考量。
基础查询结构
CREATE QUERY exampleQuery() FOR GRAPH MyGraph {
SumAccum<INT> @friendCount = 0;
Start = {Person.*};
Result = SELECT p FROM Start:p -(Friendship)- :f
WHERE p.age > 30
ACCUM p.@friendCount += 1
POST-ACCUM (p)
HAVING p.@friendCount > 0
ORDER BY p.@friendCount DESC
LIMIT 100;
PRINT Result[Result.name, Result.@friendCount];
}
4.2 图遍历与模式匹配
4.3 累加器 (Accumulators) 的使用与优化
4.4 索引 (Indexing) 与查询性能优化
索引是提高数据库查询性能的常用手段,在图数据库中也不例外。 虽然 TigerGraph 自动为主键创建索引,但合理的索引策略对查询性能至关重要。
索引创建示例
// 为反向边遍历创建索引
CREATE INDEX PersonOwnAccountByCreateTime
ON PersonOwnAccount (account_id, create_time);
// 分析查询负载识别索引需求
// 避免创建重复或冗余索引 [11]
4.5 GSQL 查询编写最佳实践
编写高效的 GSQL 查询需要遵循一系列最佳实践,这些实践有助于充分利用 TigerGraph 的并行处理能力和优化查询执行计划。 TigerGraph 官方提供了关于图模式设计和查询编写的最佳实践指南 [49]。
5. 高级功能与应用
5.1 递归查询 (Recursive Queries)
递归查询是图数据库中一项重要的高级功能,它允许查询遍历图中任意深度的路径,直到满足特定条件。 GSQL 支持递归查询,这对于处理层级数据、寻找连通分量、执行图算法等场景非常有用 [69]。
递归查询示例
CREATE QUERY findAllReachable(VERTEX<Person> start) FOR GRAPH Social {
OrAccum @visited = false;
SetAccum<VERTEX> @@reachable;
SetAccum<VERTEX> @@current;
Start = {start};
@@current = Start;
WHILE @@current.size() > 0 DO
@@current = SELECT t FROM @@current:s-(Friendship)-Person:t
WHERE t.@visited == false
ACCUM t.@visited = true;
@@reachable += @@current;
END;
PRINT @@reachable;
}
注意:在某些版本中,查询直接调用自身的递归可能导致 TigerGraph 导出解决方案功能挂起,已在 3.7 及更高版本修复 [71]。
5.2 用户自定义函数 (UDFs) 的开发与集成
TigerGraph 允许用户通过 C++ 开发用户自定义函数(User-Defined Functions, UDFs),并将其集成到 GSQL 查询语言中,以扩展 GSQL 的内置功能 [61] [62]。
UDF 示例
// C++ 实现
#include <random>
namespace UDIMPL {
int random_range(int min, int max) {
std::random_device rd;
std::uniform_int_distribution<int> dist(min, max);
return dist(rd);
}
}
// GSQL 调用
CREATE QUERY useRandom() FOR GRAPH MyGraph {
INT rand_val = random_range(1, 100);
PRINT rand_val;
}
5.3 内置图算法的使用 (如 PageRank, 最短路径)
5.4 GSQL 在特定场景的应用 (社交网络分析, 推荐系统, 欺诈检测)
GSQL 凭借其强大的图处理能力和灵活的查询语言,在多个领域都有广泛的应用,特别是在需要深度关系分析的场景中。
5.5 GSQL 与 TigerGraph 生态系统集成
GSQL 作为 TigerGraph 的核心查询语言,与 TigerGraph 的整个生态系统紧密集成,提供了多种方式来访问和操作图数据。