悦数图数据库开发版 GQL 常见问题¶
本文解答在悦数图数据库开发版中使用 GQL 时常见的问题。
图和查询¶
图上的算法必须基于临时图运行吗?¶
不一定,取决于算法或过程内部执行的操作:
- 普通 GQL 查询和部分过程可以在持久化图上运行。例如,内置过程
algo.subgraph要求传入持久化图的名称。 - 匹配计算只能在临时图上运行。因此,如果自定义过程包含
MATCH ... PER PATH或MATCH ... PER NODE等匹配计算语句,就必须在临时图上调用该过程。 - 点绑定聚合值变量和活动集变量也只能用于调用过程时使用的同一个临时图。
简单来说,过程只是封装语句的容器,是否必须使用临时图由过程中的语句决定。更多信息,请参见匹配计算、过程和 algo.subgraph。
什么是跨图查询?¶
跨图查询是指在同一个 GQL 请求中访问多个图,并组合各个图产生的表数据或标量值。通常使用多个USE子句切换图,并通过NEXT、UNION或变量传递结果。
例如,下面的查询分别读取graph_a和graph_b,再合并结果:
USE graph_a
MATCH (v:player)
RETURN v.name AS name
UNION ALL
USE graph_b
MATCH (v:player)
RETURN v.name AS name
也可以在VALUE {}或EXISTS {}子查询中使用USE切换图。下面的查询返回graph_a中同时存在于graph_b的用户:
USE graph_a
MATCH (a:player)
WHERE EXISTS {
USE graph_b
MATCH (b:player)
WHERE b.id = a.id
RETURN b
}
RETURN a.id
如果需要从另一张图获取单个值,可以使用VALUE {}:
'''
USE graph_a
MATCH (a:player)
RETURN a.id,
VALUE {
USE graph_b
MATCH (b:player)
WHERE b.id = a.id
RETURN b.name
LIMIT 1
} AS name_in_graph_b
'''
子查询中必须通过USE指定要访问的图;如果省略USE,子查询会继续使用外层的工作图。VALUE {}必须返回单个值,EXISTS {}则根据子查询结果是否为空返回布尔值。
跨图查询不表示一条边可以跨越两个图。在由NEXT连接的线性查询中,如果前一条语句将图元素变量输出给下一条语句,切换图后不能使用同一个变量重新绑定另一张图中的图元素;UNION的各个分支具有独立的变量作用域,因此可以像上述示例一样复用变量名。需要关联两个图的数据时,建议只传递姓名、业务 ID 等属性值,并在不同图中使用不同的图元素变量。更多信息,请参见 USE 和子查询表达式。
为什么提示 Current working graph not found?¶
当前会话没有设置工作图,而查询中也没有通过USE指定图。
可以在查询开头添加USE <graph_name>,或者执行SESSION SET GRAPH <graph_name>为当前会话设置默认图。使用SHOW CURRENT_GRAPH可以查看当前工作图。更多信息,请参见 SESSION SET GRAPH 和 SHOW CURRENT_GRAPH。
v.id 和 element_id(v) 有什么区别?¶
v.id读取点v上名为id的业务属性,该值由用户定义,适合在查询结果和文档示例中使用。element_id(v)返回悦数图数据库开发版为图元素维护的内部 ID,主要用于明确需要获取内部标识的场景。
除演示element_id()等内部 ID 相关函数外,建议查询和示例优先返回业务属性。这样结果更容易理解,也不会依赖内部实现。更多信息,请参见图元素函数。
语句和变量¶
普通 MATCH 和匹配计算有什么区别?¶
普通MATCH用于查找符合模式的数据,在悦数图数据库开发版中既可以查询持久化图,也可以查询临时图,通常以RETURN返回结果。
匹配计算使用MATCH ... PER PATH或MATCH ... PER NODE,对临时图上的路径或点执行迭代计算。它只能在临时图上运行。更多信息,请参见MATCH和匹配计算。
为什么 NEXT 后无法使用前一条语句中的变量?¶
NEXT将前一条语句的输出表传给下一条语句,而不是传递前一条语句中定义的全部变量。因此,需要在NEXT前通过RETURN明确输出后续语句要使用的值。
更多信息,请参见 LET 和 NEXT。
过程和数据导入¶
为什么调用过程时提示需要最终输出?¶
调用命名过程的查询必须以RETURN或FINISH结束。YIELD只负责选择过程输出的列,不是整个查询的最终输出。
更多信息,请参见 CALL 调用过程。
为什么数据无法导入临时图?¶
常见原因包括:
- 从悦数图数据库开发版导入完整的图时,源图与临时图的图类型定义不一致。
- 从悦数图数据库开发版导入完整的图或指定的点/边时,源图和目标临时图运行在同一个 Graph 服务上。
- 从文件或表变量导入数据,或者仅从悦数图数据库开发版导入指定类型的点/边时,临时图的边类型没有声明
MULTIEDGE KEY()。 - 点类型的主键结构、边类型的拓扑结构或属性类型不满足目标图类型的定义。
- 未映射声明为
NOT NULL且没有默认值的属性,或者导入语句引用的列名和属性映射不正确。