固定长度模式

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')

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

关系模式

最简单的关系模式是一对短划线

--

此模式匹配任何方向的关系,并且不根据任何关系类型或属性进行筛选。与节点模式不同,关系模式不能在没有两端节点模式的情况下用于 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)

该图包含许多火车 StationsStopsStop 表示火车到达和离开 CALLS_AT Station 的情况。每个 Stop 构成一系列 Stops 的一部分,这些 Stops 通过类型为 NEXT 的关系连接,表示火车服务的停靠点顺序。

该图显示了代表不同火车服务的三个 Stops 链。这些服务中的每一个都停靠在名为 Denmark HillStation

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

path pattern motif

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

path pattern solutions

为了返回停靠在 Station 的每个 Stop 的名称,在 Stop 节点模式中声明一个变量。然后,结果将包含上面显示的每个匹配的每个 Stop 的 departs 值的行

查询
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