开发版本: 19 / devel
此文档适用于不受支持的 PostgreSQL 版本。
您可能需要查看当前版本的相同页面,或上面列出的其他受支持版本。

7.9. 图查询 #

本节描述用于查询属性图的子语言,属性图的定义方式见Section 5.8

7.9.1. 概述 #

请看Section 5.8中的这个示例:

-- get list of customers active today
SELECT customer_name FROM GRAPH_TABLE (myshop MATCH (c IS customers)-[IS customer_orders]->(o IS orders WHERE o.ordered_when = current_date) COLUMNS (c.name AS customer_name));

图查询部分发生在GRAPH_TABLE构造内部。就查询的其余部分而言,它的作用就像一个表函数,因为它会生成一个计算出的表作为输出。和其他FROM子句元素一样,可以为结果指定表别名和列别名,而且结果还可以与其他表连接、随后再过滤,等等,例如:

SELECT ... FROM GRAPH_TABLE (mygraph MATCH ... COLUMNS (...)) AS myresult (a, b, c) JOIN othertable USING (a) WHERE b > 0 ORDER BY c;

GRAPH_TABLE子句由图名、关键字MATCH、一个图模式表达式(见下文)、关键字COLUMNS和一个列列表组成。

7.9.2. 图模式 #

图查询功能的核心是图模式,它出现在关键字MATCH之后。从形式上说,图模式由一个或多个路径模式组成。路径是图元素的序列,以顶点开始并以顶点结束,在顶点与边之间交替出现。路径模式是一种匹配路径的语法表达式。

因此,路径模式会匹配一串顶点和边。最简单的路径模式是

()

它匹配单个顶点。下一个最简单的模式是

()-[]->()

它匹配一个顶点、后跟一条边、再后跟一个顶点。字符()是顶点模式,而字符-[]->是边模式。

这些字符也可以用空白分隔,例如:

( ) - [ ] - > ( )

Tip

记住这些符号的一种办法是:在属性图的可视化表示中,顶点通常画成圆形(就像()),边则带有矩形标签(就像[])。

上面的模式会匹配任意顶点,或者任意两个由任意边连接的顶点,这并不算特别有趣。通常,我们希望搜索具有某些特征的元素(顶点和边)。这些特征写在圆括号或方括号之间(这也称为元素模式填充项)。通常,我们会搜索带有某个标签的元素。这写作IS labelname。例如,这会匹配所有带有person标签的顶点:

(IS person)

下一个示例会匹配一个带有person标签的顶点,它连接到一个带有account标签的顶点,而连接它们的边带有has标签。

(IS person)-[IS has]->(IS account)

也可以匹配多个标签,使用“或”语义:

(IS person)-[IS has]->(IS account|creditcard)

请记住,边是有向的。在路径模式中也可以使用另一方向,例如:

(IS account)<-[IS has]-(IS person)

也可以同时匹配两个方向:

(IS person)-[IS is_friend_of]-(IS person)

这表示“或”:任一方向的边都会匹配。

在很多情况下,边模式不需要填充项。(所有过滤随后都会在顶点上进行。)对于这些情况,可以使用一种省略方括号的缩写边模式语法,例如:

(IS person)->(IS account)
(IS account)<-(IS person)
(IS person)-(IS person)

和往常一样,缩写语法可以让表达式更紧凑,但有时也更难理解。

此外,可以在路径模式表达式中定义图模式变量。它们会绑定到匹配到的元素上,并且可以用来引用这些元素上的属性值。最重要的用途是把它们用在COLUMNS子句中,以定义GRAPH_TABLE子句的表格结果。例如(假设属性图及其底层表都有适当定义):

GRAPH_TABLE (mygraph MATCH (p IS person)-[h IS has]->(a IS account)
             COLUMNS (p.name AS person_name, h.since AS has_account_since, a.num AS account_number)

可以在元素模式内部使用WHERE子句来过滤匹配:

(IS person)-[IS has]->(a IS account WHERE a.type = 'savings')