USE¶
USE子句用于声明查询的工作图。工作图是执行查询时使用的图或临时图。
如果一个查询涉及多个图或临时图,可多次使用USE子句声明不同的工作图。
如果一个查询主要涉及一个图或临时图,也可以使用 SESSION SET 语句将其设置为当前会话的图或临时图。此后,查询该图或临时图时无需在查询语句中将其声明为工作图。
USE子句指定的工作图仅在当前查询语句中生效,且会覆盖当前会话中设置的图或临时图。
将持久化图设置为工作图时,当前用户除了需要后续操作所要求的权限,还必须拥有父级 Schema 的USAGE。使用完整图路径不能绕过该检查。该要求不适用于临时图。更多信息,请参见 Schema 访问控制。
下面列举了可在USE子句后添加的语句和命令:
- DDL 语句
- DML 语句
- DQL 语句
- SHOW 命令
语法¶
- use_clause
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
'''
上述语句执行以下操作:
- 将
movie声明为工作图,然后查询 ID 为363的电影。 - 将
movie_2声明为工作图,然后查询 ID 为302的电影。 - 使用
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
'''
上述语句执行以下操作:
- 将
movie声明为工作图,然后查询 ID 为599的用户观看的电影。 - 在子查询中,再次将
movie声明为工作图,然后计算该用户看过的每部电影的平均评分。 - 返回用户 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为工作图,然后插入两个点,分别是电影和电影类别。