定长模式

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 Hill 的 Station 停靠。

要返回所有在 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

© . This site is unofficial and not affiliated with Neo4j, Inc.