固定长度模式

Cypher® 中最基本的图模式匹配形式涉及固定长度模式的匹配。这包括节点模式、关系模式和路径模式。

节点模式

每个图模式都至少包含一个节点模式。最简单的图模式是一个单一的空节点模式

MATCH ()

空节点模式匹配属性图中的所有节点。为了获取对匹配节点的引用,需要在节点模式中声明一个变量

MATCH (n)

通过此引用,可以访问节点属性

MATCH (n)
RETURN n.name

向节点模式添加标签表达式意味着只返回标签匹配的节点。以下匹配具有 Stop 标签的节点

MATCH (n:Stop)

以下更复杂的标签表达式匹配所有同时是 TrainStationBusStation,或者 StationGroup 的节点

MATCH (n:(TrainStation&BusStation)|StationGroup)

属性名称和值的映射可用于根据与指定值的相等性来匹配节点属性。以下匹配其 mode 属性等于 Rail 的节点

MATCH (n { mode: 'Rail' })

更通用的谓词可以使用 WHERE 子句表达。以下匹配其名称属性以 Preston 开头的节点

MATCH (n:Station WHERE n.name STARTS WITH 'Preston')
RETURN n

有关更多详细信息,请参阅节点模式参考部分。

关系模式

最简单的关系模式是一对破折号

--

此模式匹配任何方向的关系,并且不根据任何关系类型或属性进行过滤。与节点模式不同,关系模式不能在没有两端节点模式的情况下在 MATCH 子句中使用。有关更多详细信息,请参阅路径模式

为了获取对模式匹配关系的引用,需要在模式中通过在破折号之间添加变量名并在方括号内声明一个关系变量

-[r]-

要匹配特定方向,分别在左侧或右侧添加 <>

-[r]->

要匹配关系类型,在冒号后添加类型名称

-[:CALLS_AT]->

与节点模式类似,可以添加属性名称和值的映射,以根据与指定值的相等性来过滤关系的属性

-[{ distance: 0.24, duration: 'PT4M' }]->

WHERE 子句可用于更通用的谓词

-[r WHERE time() + duration(r.duration) < time('22:00') ]->

有关更多详细信息,请参阅关系模式参考部分。

路径模式

任何有效路径都以节点开始和结束,并在每个节点之间(如果有多个节点)有关系。固定长度路径模式具有相同的限制,对于所有有效路径模式,以下条件都为真

  • 它们至少有一个节点模式。

  • 它们以节点模式开始和结束。

  • 它们在节点和关系之间交替。

这些都是有效的路径模式

()
(s)--(e)
(:Station)--()<--(m WHERE m.departs > time('12:00'))-->()-[:NEXT]->(n)

这些是无效的路径模式

-->
()-->
()-->-->()

路径模式匹配

本节包含将路径模式匹配到属性图中的路径的示例。

它使用以下图

path pattern example graph

要重新创建该图,请对空的 Neo4j 数据库运行以下查询

CREATE (pmr:Station {name: 'Peckham Rye'}),
  (dmk:Station {name: 'Denmark Hill'}),
  (vic:Station {name: 'London Victoria'}),
  (clp:Station {name: 'Clapham High Street'}),
  (eph:Station {name: 'Elephant & Castle'}),
  (vic)<-[:CALLS_AT]-(s1:Stop {departs: time('11:55')}),
  (dmk)<-[:CALLS_AT]-(s2:Stop {departs: time('11:44')})-[:NEXT]->(s1),
  (pmr)<-[:CALLS_AT]-(s3:Stop {departs: time('11:40')})-[:NEXT]->(s2),
  (clp)<-[:CALLS_AT]-(s4:Stop {departs: time('11:41')}),
  (dmk)<-[:CALLS_AT]-(s5:Stop {departs: time('11:37')})-[:NEXT]->(s4),
  (pmr)<-[:CALLS_AT]-(s6:Stop {departs: time('11:33')})-[:NEXT]->(s5),
  (eph)<-[:CALLS_AT]-(s7:Stop {departs: time('11:54')}),
  (dmk)<-[:CALLS_AT]-(s8:Stop {departs: time('11:47')})-[:NEXT]->(s7),
  (pmr)<-[:CALLS_AT]-(s9:Stop {departs: time('11:44')})-[:NEXT]->(s8)

该图包含多个列车 StationsStops。一个 Stop 表示列车 CALLS_AT 一个 Station 的到达和离开。每个 Stop 都是由类型为 NEXT 的关系连接的 Stops 序列的一部分,代表列车服务停靠点的顺序。

该图显示了代表不同列车服务的三条 Stops 链。每项服务都停靠在名为 Denmark HillStation

要返回所有停靠在 Denmark Hill 站的 Stops,使用以下主题(术语主题用于描述在图中查找的模式)

path pattern motif

在这种情况下,图中有三条路径匹配该主题的结构(加上锚定到 Station Denmark Hill 的谓词)

path pattern solutions

为了返回每个停靠在 StationStop 的名称,请在 Stop 节点模式中声明一个变量。然后结果将有一个行,其中包含上述每个匹配的 Stop 的出发值

查询
MATCH (s:Stop)-[:CALLS_AT]->(:Station {name: 'Denmark Hill'})
RETURN s.departs AS departureTime
表 1. 结果
出发时间

"11:44:00Z"

"11:47:00Z"

"11:37:00Z"

行数:3