尽管GQL是对图进行操作,其结果在逻辑上仍可表示为由记录(行)组成的表。
中间结果表
中间结果表是一个概念模型,用来帮助了解查询是如何进行的。
以下是示例图和查询:

MATCH (u:User) WHERE u.age > 30
MATCH (u)->(c:Club)
FILTER c.since > 2010
RETURN u.name, c._id
语句 | 中间结果表 | ||||||||
---|---|---|---|---|---|---|---|---|---|
MATCH (u:User) WHERE u.age > 30 |
中间结果表包含一列(即一个变量)u ,有三个记录(三行)。
|
||||||||
MATCH (u)->(c:Club) |
该语句分别使用每一行u 进行查询,并在中间结果表添加新列c :
|
||||||||
FILTER c.since > 2010 |
该语句评估每一行的c 值,并舍弃不满足过滤条件的行。
|
||||||||
语句 | 输出表 | ||||||||
RETURN u.name, c._id |
RETURN 语句定义输出表。
|
此示例是一个线性查询,其中的语句按顺序执行。在复合查询中,每个线性查询都是独立执行的,并生成自己的输出表。然后使用指定的连接方法组合这些输出表。
行的顺序
在没有明确使用ORDER BY
的情况下,嬴图以随机顺序返回结果行,该顺序可能在:
- 每次运行查询时不同
- 数据库更新后的改变
- 在不同的嬴图版本之间有差异
查询中的笛卡尔乘积
当GQL查询的语句之间没有相同变量或其他联系时,会出现笛卡尔乘积。这种情况下,返回每个部分结果行的所有组合。
考虑以下示例:
MATCH (u:User)
MATCH (c:Club)
RETURN u.name, c._id
图中有4个User
点和3个Club
点。由于变量u
与c
之间毫无关联,查询会产生笛卡尔乘积,共产生4*3 = 12
个记录:
u.name |
c._id |
---|---|
Jody | C1 |
purplechalk | C1 |
mochaeach | C1 |
Brainy | C1 |
Jody | C3 |
purplechalk | C3 |
mochaeach | C3 |
Brainy | C3 |
Jody | C2 |
purplechalk | C2 |
mochaeach | C2 |
Brainy | C2 |
这是一个很小的例子,但在大数据集的实际场景中,笛卡尔乘积可能导致产生巨大的结果集,从而消耗大量内存和降解性能。因此,除非确有需要,要避免产生笛卡尔乘积。
结果可视化
虽然GQL查询结果能以表格形式返回,但图数据库的一个关键功能就是以图结构展示结果,使用户更容易查看和探索其数据中的关系。
当在嬴图产品中运行GQL查询时,例如嬴图Manager和GQL Playground,RESULT_TYPE_PATH
和RESULT_TYPE_NODE
类型的结果(了解结果类型)可展示为图,结果更直观,并且用户可以与之交互。
