跳转至
开发版采用单机部署,无需产品 License 文件。需要多机部署或大规模性能测试? 了解企业版

USE

USE子句用于声明查询的工作图。工作图是执行查询时使用的图或临时图。

如果一个查询涉及多个图或临时图,可多次使用USE子句声明不同的工作图。

如果一个查询主要涉及一个图或临时图,也可以使用 SESSION SET 语句将其设置为当前会话的图或临时图。此后,查询该图或临时图时无需在查询语句中将其声明为工作图。

USE子句指定的工作图仅在当前查询语句中生效,且会覆盖当前会话中设置的图或临时图。

将持久化图设置为工作图时,当前用户除了需要后续操作所要求的权限,还必须拥有父级 Schema 的USAGE。使用完整图路径不能绕过该检查。该要求不适用于临时图。更多信息,请参见 Schema 访问控制。

下面列举了可在USE子句后添加的语句和命令:

语法

use_clause
USE schema_reference / graph_name temp_graph_name

use_clause ::=
    'USE' ((schema_reference '/')? graph_name | temp_graph_name)

参数

schema_reference

所引用的 Schema 路径。此处即设置为工作图的图的 Schema 路径。

绝对路径或相对路径均可在语句中使用。若想将不在当前会话中的 Schema 中的图设置为工作图,则需指定对应 Schema 路径。关于为当前会话设置和查看 Schema 的更多信息,请参见 SESSION SET 语句和 SHOW CURRENT_SCHEMA 语句。

graph_name

设置为工作图的图的名称。

temp_graph_name

设置为工作图的临时图的名称。必须以井号(#)开头。

示例

在查询语句中将当前 Schema 中的图设置为工作图

'''
USE movie 
MATCH (n:Person WHERE n.id = 107224) 
RETURN n.name
'''

返回:

+-------------+
| n.name      |
+-------------+
| Olivia Hack |
+-------------+

在查询语句中将指定 Schema 中的图设置为工作图

'''
// 创建 Schema
CREATE SCHEMA IF NOT EXISTS /my_schema
''' 

'''
// 为当前会话设置 Schema
SESSION SET SCHEMA /my_schema
'''
''' 
// 指定工作图并执行查询
USE /default_schema/movie 
MATCH (n:Person WHERE n.id = 107224) 
RETURN n.name
'''

返回:

+-------------+
| n.name      |
+-------------+
| Olivia Hack |
+-------------+

在顺序查询中声明多个工作图

使用 NEXT 顺序执行多条语句时,可以在每条语句中通过USE声明不同的工作图:

'''
USE movie
MATCH (m:Movie)
RETURN m.id AS movie_id, m.name AS movie_name
NEXT
USE movie_2
MATCH (m2:Movie)
WHERE m2.id = movie_id
RETURN movie_id, movie_name, m2.name AS name_in_movie_2
'''

NEXT将前一条语句的输出表传递给下一条语句。跨图查询时,建议通过RETURN传递业务 ID、名称等属性值,并在下一张图中使用新的图元素变量。

在复合查询语句中声明多个工作图

若存在多个图,可以声明不同的工作图来查询不同图中的数据。

'''
USE movie MATCH (n:Movie WHERE n.id = 363) RETURN n.name AS movie_name 
UNION 
USE movie_2 MATCH (n:Movie WHERE n.id = 302) RETURN n.name AS movie_name
'''

上述语句执行以下操作:

  1. 将movie声明为工作图,然后查询 ID 为363的电影。
  2. 将movie_2声明为工作图,然后查询 ID 为302的电影。
  3. 使用UNION合并两个语句的结果。

返回:

+---------------+
| movie_name    |
+---------------+
| Head-On       |
| Swimming Pool |
+---------------+

UNION、INTERSECT或EXCEPT中的每条查询语句具有独立的变量作用域,因此可以在不同查询语句中复用变量名。更多信息,请参见复合查询。

在嵌套查询语句中多次声明一个工作图

'''
USE movie
MATCH (n@`User` WHERE n.id = 599)-[]->(m:Movie) RETURN n.id AS audience, m.name AS movie, VALUE {
    USE movie
    MATCH (c:Movie)<-[e:Watch]-() WHERE c.name =m.name RETURN avg(e.rate) AS average_rate GROUP BY ()
    } AS average_rate
ORDER BY average_rate DESC
LIMIT 10
''' 

上述语句执行以下操作:

  1. 将movie声明为工作图,然后查询 ID 为599的用户观看的电影。
  2. 在子查询中,再次将movie声明为工作图,然后计算该用户看过的每部电影的平均评分。
  3. 返回用户 ID、该用户观看的 10 部平均评分最高的电影名以及平均评分。

返回:

+----------+--------------------------------------+--------------------+
| audience | movie                                | average_rate       |
+----------+--------------------------------------+--------------------+
| 599      | Sunset Blvd.                         | 4.333333333333333  |
| 599      | Shichinin no samurai                 | 4.1875             |
| 599      | Sen To Chihiro No Kamikakushi        | 4.155172413793103  |
| 599      | Green Mile                           | 4.148648648648648  |
| 599      | City of God                          | 4.1466666666666665 |
| 599      | Lock, Stock & Two Smoking Barrels    | 4.052238805970149  |
| 599      | Wallace & Gromit: The Wrong Trousers | 4.035714285714286  |
| 599      | Nausicaä of the Valley of the Wind   | 4.0                |
| 599      | Run Lola Run                         | 4.0                |
| 599      | Princess Mononoke                    | 3.9583333333333335 |
+----------+--------------------------------------+--------------------+

在子查询中声明不同的工作图

子查询可以通过USE声明与外层查询不同的工作图。下面的查询返回movie中也存在于movie_2的电影:

'''
USE movie
MATCH (m:Movie)
WHERE EXISTS {
  USE movie_2
  MATCH (m2:Movie)
  WHERE m2.id = m.id
  RETURN m2
}
RETURN m.id, m.name
'''

如果子查询中省略USE,子查询会继续使用外层查询的工作图。跨图关联数据时,建议为不同图中的图元素使用不同变量,并通过业务 ID 等属性值进行比较。更多信息,请参见子查询表达式。

在数据操作语句中声明工作图

'''
USE movie
INSERT (:Movie{id:10000,name:"movie"}), 
       (IS Genre{id:11000,name:"genre"})
'''

上述语句声明movie为工作图,然后插入两个点,分别是电影和电影类别。