一、简介

1.1 常用的命令和函数

Cypher查询语言也叫做CQL。

常用的命令如下:

CQL常用的函数如下所示:

二、常用的命令说明

2.1 CREATE命令

2.1.1 创建没有属性的节点

node-name是节点的名称,label-name是节点标签名称。

CREATE (<node-name>:<label-name>)

2.1.2 创建具有属性的节点

Propertyn-name是创建节点属性的名称,Propertyn-Value是创建节点属性的值。

CREATE (
   <node-name>:<label-name>
   { 	
      <Property1-name>:<Property1-Value>
      ........
      <Propertyn-name>:<Propertyn-Value>
   }
)

2.2 MATCH命令

MATCH命令用于从数据库获取有关节点、关系和属性的数据。

MATCH 
(
   <node-name>:<label-name>
)

MATCH命令通常与RETURN命令一起使用。

2.3 RETURN命令

RETURN命令用于检索节点和关联关系的属性。

RETURN 
   <node-name>.<property1-name>,
   ........
   <node-name>.<propertyn-name>

MATCH和RETURN命令的样例:

CREATE (t: test {name:"xzw", sex:"m", loc: "QD"})
MATCH (t: test)
RETURN t.name,t.sex

2.4 关系

基于方向性,Neo4j关系被分为两种主要类型:单向关系和双向关系。

2.4.1 创建没有属性的关系

relationship-name是关系的名称,relationship-label-name是关系的标签名称。上述语法中的return子句不是必须的。

CREATE  
   (<node1-label-name>:<node1-name>)-
   [<relationship-label-name>:<relationship-name>]->
   (<node1-label-name>:<node1-name>)
RETURN <relationship-label-name>

关系样例:

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.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>) 

样例:

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) DELETE p

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 <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查询返回的结果进行排序。默认情况下,它按升序对行进行排序。

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查询结果集底部的结果。

LIMIT <number>
-- 如果我们要修整CQL查询结果集顶部的结果,那么我们应该使用SKIP命令。--
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>]

三、常用的函数说明

3.1 字符串函数

与SQL一样,Neo4J CQL提供了一组String函数,用于在CQL查询中获取所需的结果。常用的字符串函数列表如下:

3.1.1 UPPER函数

将字母转换为大写,语法为:

UPPER (<input-string>)

其中,可以是来自Neo4J数据库的节点或关系的属性名称。

3.1.2 LOWER函数

将字母转换为小写字母,语法为:

LOWER (<input-string>)

3.1.3 SUBSTRING函数

字符串截取函数,截取范围为左闭右开,语法如下:

SUBSTRING(<input-string>,<startIndex> ,<endIndex>)

3.2 AGGREGATION聚合函数

Neo4j CQL提供了一些在RETURN子句中使用的聚合函数,它类似于SQL中的GROUP BY子句。

3.2.1 COUNT函数

它从MATCH子句获取结果,并计算结果中出现的行数,并返回该计数值。其语法如下:

COUNT(<value>)

3.2.2 MAX函数

最大值函数,语法为:

MAX(<property-name>)

3.2.3 MIN函数

最小值函数,语法为:

MIN(<property-name>)

3.2.4 AVG函数

平均值函数,语法为:

AVG(<property-name>)

3.2.5 SUM函数

求和函数,语法为:

SUM(<property-name>)

3.3 关系函数

Neo4j CQL提供了一组关系函数,以在获取开始节点,结束节点等细节时知道关系的细节。

四、cypher导入csv类型的数据

4.1 简略步骤

  1. 确保已经在Neo4j数据库中创建了适当的节点和关系类型。

  2. 准备好CSV文件。将需要导入的csv文件放到import目录下:

    1. 确保文件中的列与节点和关系类型属性相匹配。
    2. 如果导入的csv文件中有中文,需要先将格式转换成UTF-8格式,否则会乱码
    3. 用NotePad++,editplus等文本编辑器打开csv文件,然后另存为,选择UTF-8编码,就可以了。
  3. 导入实体:

    • 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})
      
  4. 导入关系:relation.csv

    ##导入关系第一种方法:
    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)
    
  5. 运行Cypher查询以导入数据

4.2 高级步骤

CSV 文件首行是字段名,对于 neo4j 来说,其实是属性对应的列,假设我们有如下 CSV 实体数据文件:

Id,Name,Location,Email,BusinessType
1,Neo4j,San Mateo,contact@neo4j.com,P
2,AAA,,info@aaa.com,
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 *
05-14 20:28