查询、更新和管理

Neo
Neo
2022-03-11 / 0 评论 / 57 阅读

本节内容源自Cypher官方手册V4.4版,笔者对其进行学习、翻译、记录。

在介绍中,我们描述了使用 Cypher 执行图的只读查询的常见情况。但是,也可以使用 Cypher 对图执行更新,将数据导入到图中,并对图、数据库和整个 DBMS 执行管理操作。

所有这些不同的选项都将在后面的部分中更详细地描述,但值得首先总结几个关键点。

管理查询的结构

Cypher 管理查询不能与正常的读写查询结合使用。每个管理查询将对 system 执行更新操作或从 system 读取状态信息。一些管理命令对特定数据库进行更改,因此只有在连接到感兴趣的数据库时才能运行。其他人对整个 DBMS 的状态进行更改,并且只能针对特殊system数据库运行。

更新查询的结构

如果您从图中读取然后更新图,则您的查询隐含地包含两个部分—读取是第一部分,而写入是第二部分。

Cypher 查询部分可以在图上读取和匹配,也可以对其进行更新,不是同时进行。

如果您的查询只执行读取,Cypher 在您询问结果之前不会真正匹配模式。在更新查询中,语义是所有读取都将在执行任何写入之前完成。

查询部分是隐式的唯一模式是当您首先读取然后写入时—任何其他顺序,您必须明确查询部分。使用WITH语句分隔部分。 WITH就像一个事件视界—它是一个计划和该计划的完成执行之间的障碍。

当您想使用聚合数据进行过滤时,您必须将两个阅读查询部分链接在一起—第一个进行聚合,第二个过滤来自第一个的结果。

MATCH (n {name: 'John'})-[:FRIEND]-(friend)
WITH n, count(friend) AS friendsCount
WHERE friendsCount > 3
RETURN n, friendsCount

使用WITH,您可以指定聚合的发生方式,并且聚合必须在 Cypher 开始过滤之前完成。

这是一个更新图表的示例,将聚合数据写入图表:

MATCH (n {name: 'John'})-[:FRIEND]-(friend)
WITH n, count(friend) AS friendsCount
SET n.friendsCount = friendsCount
RETURN n.friendsCount

您可以将可用内存允许的尽可能多的查询部分链接在一起。

返回数据

任何查询都可以返回数据。如果查询只读取,它必须返回数据。如果读取查询不返回任何数据,则它没有任何作用,因此不是有效的 Cypher 查询。更新图表的查询不必返回任何内容,但它们是有效查询。

在查询的所有部分之后是最后一个RETURN子句。 RETURN不是任何查询部分的一部分—它是查询末尾的句点符号。该RETURN条款附带三个子条款:SKIP/LIMIT和ORDER BY.

如果您从刚刚删除它们的查询中返回节点或关系—请注意,您持有的指针不再有效。