固定长度模式
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')
有关更多详细信息,请参阅 节点模式 参考部分。
关系模式
最简单的关系模式是一对短划线
--
此模式匹配任何方向的关系,并且不根据任何关系类型或属性进行筛选。与节点模式不同,关系模式不能在没有两端节点模式的情况下用于 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
的一部分,这些 Stops
通过类型为 NEXT
的关系连接,表示火车服务的停靠点顺序。
该图显示了代表不同火车服务的三个 Stops
链。这些服务中的每一个都停靠在名为 Denmark Hill
的 Station
。
要返回所有停靠在 Station
Denmark Hill
的 Stops
,使用以下主题(术语主题用于描述在图中查找的模式)
在这种情况下,图中的三条路径与主题的结构匹配(加上锚定到 Station
Denmark Hill
的谓词)
为了返回停靠在 Station
的每个 Stop
的名称,在 Stop
节点模式中声明一个变量。然后,结果将包含上面显示的每个匹配的每个 Stop
的 departs 值的行
MATCH (s:Stop)-[:CALLS_AT]->(:Station {name: 'Denmark Hill'})
RETURN s.departs AS departureTime
出发时间 |
---|
|
|
|
行数:3 |