定长模式

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

节点模式

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

MATCH ()

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

MATCH (n)

有了这个引用,就可以访问节点的属性

MATCH (n)
RETURN n.name

在节点模式中添加标签表达式意味着只返回标签匹配的节点。以下语句匹配所有带有 Stop 标签的节点

MATCH (n:Stop)

以下更复杂的标签表达式匹配所有既是 TrainStation 又是 BusStation 的节点,或者所有 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)

这些是无效的路径模式

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

路径模式匹配

本节包含一个将路径模式与属性图中的路径进行匹配的示例。

它使用以下图示

要重新创建该图,请在空的 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)

该图中包含许多火车 Stations(车站)和 Stops(停靠站)。Stop 代表火车的到达和离开,这些火车 CALLS_AT(停靠于)某个 Station。每个 Stop 都构成一系列 Stops 的一部分,它们通过类型为 NEXT 的关系连接,代表了火车服务运行的停靠点顺序。

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

要返回所有在 Denmark Hill 车站停靠的 Stops,请使用以下母题(motif,该术语用于描述图中寻找的模式)

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

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

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

"11:44:00Z"

"11:47:00Z"

"11:37:00Z"

行:3