Neo4j 之Cypher 入门
文章目录
前言
本节向你介绍了图查询语言–Cypher。它旨在帮助你开始思考图和模式,将这些知识应用于简单的问题,并学习如何编写Cypher语句。
一、Cypher query language
Cypher是Neo4j的图查询语言,让你从图中检索数据。它就像图形的SQL,并受到SQL的启发,所以它让你专注于你想从图形中获得什么数据(而不是如何去获得它)。由于它与其他语言的相似性和直观性,它是迄今为止最容易学习的图形语言。
Cypher是独特的,因为它提供了一种匹配模式和关系的视觉方式。Cypher的灵感来自于ASCII艺术类型的语法,其中(nodes)-[:ARE_CONNECTED_TO]->(otherNodes)使用圆括号表示节点(nodes),而-[:ARROWS]->表示关系。当你写一个查询时,你通过你的数据画一个图形模式。
二、Getting started with Cypher
Cypher的结构,基于英文散文和整齐的图标,使查询既容易写又容易读。例如,看一下下面图片中的简单图表数据。你会如何用英语表示这个数据?
注意:答案如下:Sally likes Graphs. Sally is friends with John. Sally works for Neo4j.
Cypher语法建立在我们刚刚创建的这个英语结构之上。进一步你可以找到关于如何用Cypher写这个例子的信息。
在Cypher中表示节点
由于Cypher的灵感来自ASCII-Art的模式,我们需要一种可视化的方式来表示我们上述模式的每个组成部分。我们知道,属性图模型的主要组成部分是节点和关系。记住,节点是你图中的数据实体,你通常可以通过找到数据模型中的名词或对象来识别节点。在我们的例子中,Sally、John、Graphs和Neo4j是我们的节点。
为了在Cypher中描述节点,我们用圆括号包围节点,例如(节点)。注意小括号看起来与可视化表示法在我们的数据模型中用于节点的圆圈相似。
-
节点变量: 如果我们以后想引用这个节点,我们可以给它一个变量,比如( p )代表人,(t)代表事。在现实世界的查询中,我们可能会使用更长、更有表现力的变量名称,如(person)或(thing)。就像编程语言的变量一样,你可以给你的变量起一个你想要的名字,并在以后的查询中用同样的名字来引用它们。
-
如果该节点与你的返回结果无关,你可以使用空括号()指定一个匿名节点。这意味着你不能在以后的查询中返回这个节点。
节点标签
如果你还记得属性图的数据模型,你也可以通过指定一个节点标签将类似的节点组合在一起。标签有点像标签,允许你指定某些类型的实体来寻找或创建。在我们的例子中,人、技术和公司是标签。
举个例子:
() //anonymous node (no label or variable) can refer to any node in the database
(p:Person) //using variable p and label Person
(:Technology) //no variable, label Technology
(work:Company) //using variable work and label Company
在Cypher中表示关系
为了充分利用图数据库的力量,我们还需要表达我们节点之间的关系。关系在Cypher中是用两个节点之间的箭头–>或<–来表示的。
注意这个语法看起来就像可视化表示中连接我们节点的箭头和线条。额外的,如节点的连接方式(关系类型)和与关系有关的任何属性,可以放在箭头内的方括号中。
在我们的例子中,节点之间带有LIKES、IS_FRIENDS_WITH和Works_FOR的线条就是我们的关系。
无定向关系没有箭头,只有两个破折号–。这意味着关系可以在任何方向上被遍历。虽然必须向数据库插入一个方向,但它可以与无定向关系相匹配,Cypher忽略任何特定的方向并检索关系和连接的节点,不管物理方向是什么。这使查询变得灵活,不强迫用户知道存储在数据库中的关系的物理方向。
//data stored with this direction
CREATE (p:Person)-[:LIKES]->(t:Technology)
//query relationship backwards will not return results
MATCH (p:Person)<-[:LIKES]-(t:Technology)
//better to query with undirected relationship unless sure of direction
MATCH (p:Person)-[:LIKES]-(t:Technology)
关系类型
关系类型对关系进行分类并添加意义,类似于标签对节点的分组。在我们的属性图数据模型中,关系显示了节点是如何连接和相互关联的。你通常可以通过寻找动作或动词来识别数据模型中的关系。
你可以在节点之间指定任何你想要的关系类型,但我们建议使用动词和动作的良好命名惯例。糟糕的关系类型名称会使Cypher的阅读和书写都更加困难(记住,它应该听起来像英语!)。
例如,让我们看一下我们的示例图中的关系类型。
-
[:LIKES] - 当我们把节点放在关系的两边时是有意义的(Sally LIKES图)。
-
[:IS_FRIENDS_WITH] - 当我们把节点和它放在一起时才有意义(Sally IS_FRIENDS_WITH John)
-
[:WORKS_FOR] --与节点有意义(Sally WORKS_FOR Neo4j)。
关系变量
就像我们对节点所做的那样,如果我们想在以后的查询中引用一个关系,我们可以给它一个变量,如[r]或[rel]。我们也可以使用更长、更有表现力的变量名称,如[喜欢]或[知道]。如果你以后不需要引用这个关系,你可以用两个破折号来指定一个匿名关系–,–>,<–。
作为一个例子,你可以使用-[rel]->或-[rel:LIKES]->,然后在你的查询中调用rel变量来引用关系和它的细节。
节点和关系属性
我们已经谈到了如何为节点、关系和标签编写Cypher。我们的属性图数据模型的最后一块是属性。记住,属性是为我们的节点和关系提供额外细节的名-值对。
为了在Cypher中表示这些,我们可以在节点的括号中使用大括号,或者在关系的括号中使用大括号。然后将属性的名称和值放在大括号内。我们的示例图有一个节点属性(名称)和一个关系属性(自)。
-
节点属性: (p:Person {name: ‘Sally’})
-
关系属性。-[rel:IS_FRIENDS_WITH {since: 2018}]->
Cypher中的模式
节点和关系构成了图模式的构建块。这些构件可以组合起来表达简单或复杂的模式。模式是图的最强大的能力。在Cypher中,它们可以被写成一个连续的路径,也可以被分成更小的模式,并用逗号绑在一起。
为了在Cypher中显示一个模式,你需要结合你到目前为止所学的节点和关系语法。让我们用Sally喜欢的图的例子来说明。
在Cypher中,这个模式看起来就像下面的代码。
(p:Person {name: "Sally"})-[rel:LIKES]->(g:Technology {type: "Graphs"})