Cypher查询语言也叫做CQL。
常用的命令如下:
CQL命令 | 作用 | 用法 |
---|---|---|
CREATE | 创建 | 创建节点,关系和属性 |
MATCH | 匹配 | 检索有关节点,关系和属性数据 |
RETURN | 返回 | 返回查询结果 |
WHERE | 哪里 | 提供条件过滤检索数据 |
DELETE | 删除 | 删除节点和关系 |
REMOVE | 移除 | 删除节点和关系的属性 |
ORDER BY | 以…排序 | 排序检索数据 |
SET | 组 | 添加或更新标签 |
CQL常用的函数如下所示:
定制列表功能 | 用法 | |
---|---|---|
String | 字符串 | 它们用于使用String字面量 |
Aggregation | 聚合 | 它们用于对CQL查询结果执行一些聚合操作 |
Relationship | 关系 | 它们用于获取关系的细节,若startnode,endnode等 |
node-name是节点的名称,label-name是节点标签名称。
CREATE (:)
Propertyn-name是创建节点属性的名称,Propertyn-Value是创建节点属性的值。
CREATE (
:
{
:
........
:
}
)
MATCH命令用于从数据库获取有关节点、关系和属性的数据。
MATCH
(
:
)
MATCH命令通常与RETURN命令一起使用。
RETURN命令用于检索节点和关联关系的属性。
RETURN
.,
........
.
CREATE (t: test {name:"xzw", sex:"m", loc: "QD"})
MATCH (t: test)
RETURN t.name,t.sex
基于方向性,Neo4j关系被分为两种主要类型:单向关系和双向关系。
relationship-name是关系的名称,relationship-label-name是关系的标签名称。上述语法中的return子句不是必须的。
CREATE
(:)-
[:]->
(:)
RETURN
关系样例:
CREATE (f1:Favorite1)-
[like:LIKES]->
(f2:Favorite2)
RETURN like
CREATE
(:{})-
[:{}]
->(:{})
RETURN
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
布尔运算符 | 描述 |
---|---|
AND | 它是一个支持AND操作的Neo4j CQL关键字 |
OR | 它是一个Neo4j CQL关键字来支持OR操作 |
NOT | 它是一个Neo4j CQL关键字来支持NOT操作 |
XOR | 它是一个支持XOR操作的Neo4j CQL关键字 |
布尔运算符 | 描述 |
---|---|
= | 它是Neo4j CQL“等于”运算符 |
<> | 它是一个Neo4j CQL“不等于”运算符 |
< | 它是一个Neo4j CQL“小于”运算符 |
> | 它是一个Neo4j CQL“大于”运算符 |
<= | 它是一个Neo4j CQL“不于或等于”运算符 |
>= | 它是一个Neo4j CQL“大于或等于”运算符 |
MATCH (:),(:)
WHERE
CREATE ()-[:
{}]->()
样例:
MATCH (c:Customer),(f:Fav)
WHERE c.id = "1" AND f.id= "1"
CREATE (c)-[r:Relat{location:"QD"}]->(f)
RETURN r
删除节点及相关节点和关系。
DELETE
样例:
MATCH (p:People) DELETE p
DELETE ,,
可以通过以下命令,删除数据库中的所有节点和关系:
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r
删除现有节点或关系的属性或标签。值得注意的是DELETE和REMOVE两个命令都应该与MATCH命令一起使用。
REMOVE /
其中,是一个属性列表,其用法如下:
.,
.,
....
.
它是一个标签列表,其用法如下:
:,
....
:
SET命令用来向现有节点或者关系添加或更新属性值
SET
其中,是一个属性列表,其语法如下:
.,
.,
....
.
Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,对MATCH查询返回的结果进行排序。默认情况下,它按升序对行进行排序。
ORDER BY [DESC]
其中,是属性列表,其语法如下:
.,
.,
....
.
它将两组结果中的公共行组合并返回到一组结果中, 它不从两个节点返回重复的行。跟SQL类似,UNION ALL是返回所有的数据。
UNION
LIMIT命令来过滤或限制查询返回的行数,它修剪CQL查询结果集底部的结果。
LIMIT
-- 如果我们要修整CQL查询结果集顶部的结果,那么我们应该使用SKIP命令。--
SKIP
MERGE命令是CREATE命令和MATCH命令的组合。它在图中搜索给定模式,如果存在,则返回结果,如果它不存在于图中,则它创建新的节点/关系并返回结果。
MERGE (:
{
:
.....
:
})
Neo4j CQL将空值视为对节点或关系的属性的缺失值或未定义值。当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有NULL属性值的新节点。
与SQL一样,Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合。
IN[]
与SQL一样,Neo4J CQL提供了一组String函数,用于在CQL查询中获取所需的结果。常用的字符串函数列表如下:
功能 | 描述 |
---|---|
UPPER | 它用于将所有字母更改为大写字母 |
LOWER | 它用于将所有字母改为小写字母 |
SUBSTRING | 它用于获取给的String的子字符串 |
REPLACE | 它用于替换一个字符串的子字符串 |
将字母转换为大写,语法为:
UPPER ()
其中,可以是来自Neo4J数据库的节点或关系的属性名称。
将字母转换为小写字母,语法为:
LOWER ()
字符串截取函数,截取范围为左闭右开,语法如下:
SUBSTRING(, ,)
Neo4j CQL提供了一些在RETURN子句中使用的聚合函数,它类似于SQL中的GROUP BY子句。
聚集功能 | 描述 |
---|---|
COUNT | 它返回由MATCH命令返回的行数 |
MAX | 它从MATCH命令返回的一组行返回最大值 |
MIN | 它返回由MATCH命令返回的一组行的最小值 |
SUM | 它返回由MATCH命令返回的所有行的求和值 |
AVG | 它返回由MATCH命令返回的所有行的平均值 |
它从MATCH子句获取结果,并计算结果中出现的行数,并返回该计数值。其语法如下:
COUNT()
最大值函数,语法为:
MAX()
最小值函数,语法为:
MIN()
平均值函数,语法为:
AVG()
求和函数,语法为:
SUM()
Neo4j CQL提供了一组关系函数,以在获取开始节点,结束节点等细节时知道关系的细节。
功能 | 描述 |
---|---|
STARTNODE | 它用于知道关系的开始节点 |
ENDNODE | 它用于知道关系的结束节点 |
ID | 它用于知道关系的ID |
TYPE | 它用于知道字符串表示中的一个关系的TYPE |
确保已经在Neo4j数据库中创建了适当的节点和关系类型。
准备好CSV文件。将需要导入的csv文件放到import目录下:
导入实体:
name.csv
charatername
azula
aang
zuko
...
##导入实体
LOAD CSV WITH HEADERS FROM "file:///name.csv" AS row merge (d:name{name:row.charatername})
nation.csv
nationname
firenation
watertribe
...
##导入实体
LOAD CSV WITH HEADERS FROM "file:///nation.csv" AS row merge (d:nation{name:row.nationname})
导入关系:relation.csv
name | relation | nation |
---|---|---|
azula | include | firenation |
zuko | include | firenation |
katara | include | watertribe |
##导入关系第一种方法:
LOAD CSV WITH HEADERS FROM "file:///relation.csv" AS row
match (from:name{name:row.charatername}),(to:nation{name:row.nationname})
merge (from)-[r:relation{property:row.relation}]->(to)
运行Cypher查询以导入数据
CSV 文件首行是字段名,对于 neo4j 来说,其实是属性对应的列,假设我们有如下 CSV 实体数据文件:
Id,Name,Location,Email,BusinessType
1,Neo4j,San Mateo,[email protected],P
2,AAA,,[email protected],
3,BBB,Chicago,,G
由于 CSV 文件首行是字段名,则要加上 WITH HEADERS,并通过 MERGE 定义真实要设置的属性名和属性值,示例如下:
// 跳过 NULL 值
LOAD CSV WITH HEADERS FROM 'file:///companies.csv' AS row
WITH row WHERE row.Id IS NOT NULL
MERGE (c:Company {companyId: row.Id});
// clear data
MATCH (n:Company) DELETE n;
// 为 NULL 值设置默认值
LOAD CSV WITH HEADERS FROM 'file:///companies.csv' AS row
MERGE (c:Company {companyId: row.Id, hqLocation: coalesce(row.Location, "Unknown")})
// clear data
MATCH (n:Company) DELETE n;
// 设置空字符串为 NULL 值
LOAD CSV WITH HEADERS FROM 'file:///companies.csv' AS row
MERGE (c:Company {companyId: row.Id})
SET c.emailAddress = CASE trim(row.Email) WHEN "" THEN null ELSE row.Email END
如果 CSV 中有一个字段是要拆分的 item 列表,则可以使用 Cypher 的 split()
函数来分隔单元格中的数组。
条件转换可以通过 CASE
:
// clear data
MATCH (n:Company) DELETE n;
//set businessType property based on shortened value in CSV
LOAD CSV WITH HEADERS FROM 'file:///companies.csv' AS row
WITH row WHERE row.Id IS NOT NULL
WITH row,
(CASE row.BusinessType
WHEN 'P' THEN 'Public'
WHEN 'R' THEN 'Private'
WHEN 'G' THEN 'Government'
ELSE 'Other' END) AS type
MERGE (c:Company {companyId: row.Id, hqLocation: coalesce(row.Location, "Unknown")})
SET c.emailAddress = CASE trim(row.Email) WHEN "" THEN null ELSE row.Email END
SET c.businessType = type
RETURN *