Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/faq/ Documentation version: v5.3.2 # 悦数图数据库开发版 GQL 常见问题 本文解答在悦数图数据库开发版中使用 GQL 时常见的问题。 ## 图和查询 ### 图上的算法必须基于临时图运行吗? 不一定,取决于算法或过程内部执行的操作: - 普通 GQL 查询和部分过程可以在持久化图上运行。例如,内置过程`algo.subgraph`要求传入持久化图的名称。 - 匹配计算只能在临时图上运行。因此,如果自定义过程包含`MATCH ... PER PATH`或`MATCH ... PER NODE`等匹配计算语句,就必须在临时图上调用该过程。 - [点绑定聚合值变量](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/agg/)和[活动集变量](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/active-set-variable/)也只能用于调用过程时使用的同一个临时图。 简单来说,过程只是封装语句的容器,是否必须使用临时图由过程中的语句决定。更多信息,请参见[匹配计算](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/match-compute/)、[过程](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/procedures/)和 [algo.subgraph](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/procedures/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](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/clauses/use-graph/) 和[子查询表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/subquery/)。 ### 为什么提示 Current working graph not found? 当前会话没有设置工作图,而查询中也没有通过`USE`指定图。 可以在查询开头添加`USE `,或者执行`SESSION SET GRAPH `为当前会话设置默认图。使用`SHOW CURRENT_GRAPH`可以查看当前工作图。更多信息,请参见 [SESSION SET GRAPH](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/sessions/set/) 和 [SHOW CURRENT_GRAPH](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-admin/show/show-current-graph/)。 ### v.id 和 element_id(v) 有什么区别? - `v.id`读取点`v`上名为`id`的业务属性,该值由用户定义,适合在查询结果和文档示例中使用。 - `element_id(v)`返回悦数图数据库开发版为图元素维护的内部 ID,主要用于明确需要获取内部标识的场景。 除演示`element_id()`等内部 ID 相关函数外,建议查询和示例优先返回业务属性。这样结果更容易理解,也不会依赖内部实现。更多信息,请参见[图元素函数](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/functions/graph/)。 ## 语句和变量 ### 普通 MATCH 和匹配计算有什么区别? 普通`MATCH`用于查找符合模式的数据,在悦数图数据库开发版中既可以查询持久化图,也可以查询临时图,通常以`RETURN`返回结果。 匹配计算使用`MATCH ... PER PATH`或`MATCH ... PER NODE`,对临时图上的路径或点执行迭代计算。它只能在临时图上运行。更多信息,请参见[`MATCH`](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/match/)和[匹配计算](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/match-compute/)。 ### 为什么 NEXT 后无法使用前一条语句中的变量? `NEXT`将前一条语句的输出表传给下一条语句,而不是传递前一条语句中定义的全部变量。因此,需要在`NEXT`前通过`RETURN`明确输出后续语句要使用的值。 更多信息,请参见 [LET 和 NEXT](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/let/)。 ## 过程和数据导入 ### 为什么调用过程时提示需要最终输出? 调用命名过程的查询必须以`RETURN`或`FINISH`结束。`YIELD`只负责选择过程输出的列,不是整个查询的最终输出。 更多信息,请参见 [CALL 调用过程](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/call/call-procedure/)。 ### 为什么数据无法导入临时图? 常见原因包括: - 从悦数图数据库开发版导入完整的图时,源图与临时图的图类型定义不一致。 - 从悦数图数据库开发版导入完整的图或指定的点/边时,源图和目标临时图运行在同一个 Graph 服务上。 - 从文件或表变量导入数据,或者仅从悦数图数据库开发版导入指定类型的点/边时,临时图的边类型没有声明`MULTIEDGE KEY()`。 - 点类型的主键结构、边类型的拓扑结构或属性类型不满足目标图类型的定义。 - 未映射声明为`NOT NULL`且没有默认值的属性,或者导入语句引用的列名和属性映射不正确。 建议先检查临时图的图类型,再逐项对照导入数据的列和属性。更多信息,请参见 [IMPORT](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/in-out/import/) 和[持久化图与临时图](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/versus/)。