定长模式
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
| 出发时间 |
|---|
|
|
|
行:3 |