上一篇文章我们介绍的图数据库Neo4j,这篇文章我们来看一下它的查询语言——Cypher。Cypher是一种声明式图查询语言,表达高效查询和更新图数据库。关注专栏《知识图谱系列》了解更多相关知识~
目录
一、简介
1.1 常用的命令和函数
Cypher查询语言也叫做CQL,它常用的命令如下:
CQL常用的函数如下所示:
1.2 数据类型
CQL的数据类型跟Java语言类似,它们用于定义节点或关系的属性。
二、常用的命令
2.1 CREATE命令
2.1.1 创建没有属性的节点
语法如下:
CREATE (<node-name>:<label-name>)
其中,node-name是节点的名称,label-name是节点标签名称。
例如:
CREATE(person:Person)
2.1.2 创建具有属性的节点
语法如下:
CREATE (
<node-name>:<label-name>
{
<Property1-name>:<Property1-Value>
........
<Propertyn-name>:<Propertyn-Value>
}
)
其中,Propertyn-name是创建节点属性的名称,Propertyn-Value是创建节点属性的值。
例如:
CREATE (person:Person { name:"xzw",sex:"m",location:"QD" })
2.2 MATCH命令
MATCH命令用于从数据库获取有关节点、关系和属性的数据。语法如下:
MATCH
(
<node-name>:<label-name>
)
MATCH命令通常与RETURN命令一起使用。
2.3 RETURN命令
RETURN命令用于检索节点和关联关系的属性。语法如下:
RETURN
<node-name>.<property1-name>,
........
<node-name>.<propertyn-name>
例如:
CREATE (t: test {name:"xzw", sex:"m", loc: "QD"})
MATCH (t: test)
RETURN t.name,t.sex
2.4 关系
基于方向性,Neo4j关系被分为两种主要类型:单向关系和双向关系。
2.4.1 创建没有属性的关系
语法如下:
CREATE
(<node1-label-name>:<node1-name>)-
[<relationship-label-name>:<relationship-name>]->
(<node1-label-name>:<node1-name>)
RETURN <relationship-label-name>
其中,relationship-name是关系的名称,relationship-label-name是关系的标签名称。上述语法中的return子句不是必须的。
例如:
CREATE (f1:Favorite1)-[like:LIKES]->(f2:Favorite2)
RETURN like
2.4.2 创建有属性的关系
语法如下:
CREATE
(<node1-label-name>:<node1-name>{<define-properties-list>})-
[<relationship-label-name>:<relationship-name>{<define-properties-list>}]
->(<node1-label-name>:<node1-name>{<define-properties-list>})
RETURN <relationship-label-name>
例如:
CREATE (v1:Video1{title:"Action1",updated_by:"A",uploaded_date:"10/10/2020"})
-[movie:ACTION_MOVIES{rating:1}]->
(v2:Video2{title:"Action2",updated_by:"X",uploaded_date:"12/12/2020"})
MATCH (v1:Video1)-[movie:ACTION_MOVIES]->(v2:Video2)
RETURN movie
2.5 WHERE命令
像SQL一样,Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询的结果,语法如下:
1、简单语法:WHERE <condition>
2、复杂语法:WHERE <condition> <boolean-operator> <condition>
其中,condition的语法为:<property-name> <comparison-operator> <value>
其中,<comparison-operator>为CQL的比较运算符。
例如:
MATCH (p:People)
RETURN p.name,p.sex,p.location
MATCH (p:People)
WHERE p.name = 'xzw'
RETURN p
2.5.1 布尔运算符
2.5.2 比较运算符
2.5.3 使用WHERE子句创建关系
语法如下:
MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
WHERE <condition>
CREATE (<node1-label-name>)-[<relationship-label-name>:<relationship-name>
{<relationship-properties>}]->(<node2-label-name>)
例如:
CREATE (c:Customer {id:"1", name: "xzw", sex:"m"})
CREATE (f:Fav {id:"1", favor: "sleep"})
MATCH (c:Customer)
RETURN c.id,c.name,c.sex
MATCH (f:Fav)
RETURN f.id, f.favor
MATCH (c:Customer),(f:Fav)
WHERE c.id = "1" AND f.id= "1"
CREATE (c)-[r:Relat{location:"QD"}]->(f)
RETURN r
2.6 DELETE命令
删除节点及相关节点和关系。
2.6.1 删除节点
语法如下:
DELETE <node-name-list>
例如:
MATCH (p:People)
RETURN p.name
MATCH (p:People) DELETE p
MATCH (p:People)
RETURN p.name
2.6.2 删除节点和关系
语法如下:
DELETE <node1-name>,<node2-name>,<relationship-name>
为了节省篇幅,以下无特殊说明,不再给出示例,因为这些语法都比较简单,感兴趣的朋友可以自己测试一下。
这里值得注意的是,可以通过以下命令,删除数据库中的所有节点和关系:
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r
2.7 REMOVE命令
删除现有节点或关系的属性或标签。值得注意的是DELETE和REMOVE两个命令都应该与MATCH命令一起使用。REMOVE命令语法如下:
REMOVE <property-name-list>/<label-name-list>
其中,<property-name-list>是一个属性列表,其用法如下:
<node-name>.<property1-name>,
<node-name>.<property2-name>,
....
<node-name>.<propertyn-name>
<label-name-list>它是一个标签列表,其用法如下:
<node-name>:<label2-name>,
....
<node-name>:<labeln-name>
2.8 SET命令
SET命令用来向现有节点或者关系添加或更新属性值,其语法如下:
SET <property-name-list>
其中,<property-name-list>是一个属性列表,其语法如下:
<node-label-name>.<property1-name>,
<node-label-name>.<property2-name>,
....
<node-label-name>.<propertyn-name>
2.9 ORDER BY 命令
Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,对MATCH查询返回的结果进行排序。默认情况下,它按升序对行进行排序。 如果我们要按降序对它们进行排序,我们需要使用DESC子句。其语法如下:
ORDER BY <property-name-list> [DESC]
其中,<property-name-list>是属性列表,其语法如下:
<node-label-name>.<property1-name>,
<node-label-name>.<property2-name>,
....
<node-label-name>.<propertyn-name>
2.10 UNION命令
它将两组结果中的公共行组合并返回到一组结果中, 它不从两个节点返回重复的行。跟SQL类似,UNION ALL是返回所有的数据。语法如下:
<MATCH Command1>
UNION
<MATCH Command2>
2.11 LIMIT和SKIP命令
LIMIT命令来过滤或限制查询返回的行数,它修剪CQL查询结果集底部的结果。如果我们要修整CQL查询结果集顶部的结果,那么我们应该使用SKIP命令。他们的语法如下:
LIMIT <number>
SKIP <number>
2.12 MERGE命令
MERGE命令是CREATE命令和MATCH命令的组合。它在图中搜索给定模式,如果存在,则返回结果,如果它不存在于图中,则它创建新的节点/关系并返回结果。其语法如下:
MERGE (<node-name>:<label-name>
{
<Property1-name>:<Pro<rty1-Value>
.....
<Propertyn-name>:<Propertyn-Value>
})
2.13 NULL值
Neo4j CQL将空值视为对节点或关系的属性的缺失值或未定义值。当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有NULL属性值的新节点。
2.14 IN命令
与SQL一样,Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合。其语法如下:
IN[<Collection-of-values>]
本文到此已经接近尾声了,本文主要讲述了一些Neo4j CQL常用命令,下一篇会讲一下CQL常用的函数命令。你们在此过程中遇到了什么问题,欢迎留言,让我看看你们都遇到了什么问题~