本节描述用于查询属性图的子语言,属性图的定义方式见Section 5.8。
请看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和一个列列表组成。
图查询功能的核心是图模式,它出现在关键字MATCH之后。从形式上说,图模式由一个或多个路径模式组成。路径是图元素的序列,以顶点开始并以顶点结束,在顶点与边之间交替出现。路径模式是一种匹配路径的语法表达式。
因此,路径模式会匹配一串顶点和边。最简单的路径模式是
()
它匹配单个顶点。下一个最简单的模式是
()-[]->()
它匹配一个顶点、后跟一条边、再后跟一个顶点。字符()是顶点模式,而字符-[]->是边模式。
这些字符也可以用空白分隔,例如:
( ) - [ ] - > ( )
记住这些符号的一种办法是:在属性图的可视化表示中,顶点通常画成圆形(就像()),边则带有矩形标签(就像[])。
上面的模式会匹配任意顶点,或者任意两个由任意边连接的顶点,这并不算特别有趣。通常,我们希望搜索具有某些特征的元素(顶点和边)。这些特征写在圆括号或方括号之间(这也称为元素模式填充项)。通常,我们会搜索带有某个标签的元素。这写作IS 。例如,这会匹配所有带有labelnameperson标签的顶点:
(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')