命令用法
CREATE创建节点、关系或属性
MATCH检索节点、关系或属性
RETURN返回查询结果
WHERE提供过滤条件
DELETE删除节点或关系
REMOVE删除节点或关系的属性
ORDER BY排序
SET添加或更新标签
  • 命令使用对大小写不敏感;
  • 命令原称为Clauses,直译为子句/从句/条款,介于Clauses下会有其子一级语句,若称Clauses为子句,则子一级语句会被称为子子句,故将Clauses译为命令,其子一级语句称子句;
  • 本节的以下具体内容包括命令与子句的使用;

CREATE

创建节点

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

或创建关系

CREATE  
	(<node1-label-name-OR-node-name>)
	-[<relationship-label-name>:<relationship-name>{<define-properties-list>}]->
	(<node2-label-name-OR-node-name>)

解释

名称含义
node-name指代用节点名
此处的节点名相当于操作节点的代称,作用域仅在本次查询语句中
用于在本语句的其他位置指代此处的节点,下同
label-name节点标签/类型
Property1-name属性名
Property1-Value属性值
node1-label-name-OR-node-name节点标签名或节点名
为节点标签名时,选中该标签的所有节点
为节点名时,选择对应节点(组),一般由MATCH匹配得到
node2-label-name-OR-node-name同上
relationship-label-name关系类型
relationship-name关系名
<define-properties-list关系属性集

实例

CREATE(
	n:student
	{
		name:'Jarvis',
		age:18,
		sex:unknown
	}
)

// 增加新的
merge (c:Company {Name:'阿里云'}) 
create (:Person {Name: '张三'})-[:STAFF]-> (c)

MATCH

单个匹配,不限制节点或关系,不限制返回个数

相当于SQL的FROM

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

或多个匹配,可指定为节点或关系

MATCH 
(<node1-name>:<node-label1>)-[<relation-name>:<relation-label>]->(<node2-name>:<node-label2>)
名称含义
name指代用名称
label-name节点标签/类型
node1-name指代用节点名
node2-name同上
node-label1节点标签/类型
node-label2同上
relation-name指代用关系名称
relation-label关系类型

实例

MATCH(n:student)

match(n1)-[r:classmates]->(n2)

MATCH不能单独使用

RETURN

相当于SQL的Select

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

RETURN <node-name>

解释

名称含义
node-name指代用节点名
property1-name节点属性名

实例

RETURN n.name

RETURN不能单独使用

指定属性时,可以指定多个属性,按照节点组合后返回,返回类型为由节点id为主键构成的表

不指定属性时,返回节点,返回由节点组成的图

MATCH &RETURN

实例

MATCH(n:student)
RETURN n

MATCH(n:student)
RETURN n.name,n.age

WITH

连接不同的查询语句部分,未被WITH指定的变量将不会在之后的查询语句中起效

UNWIND

将一个List转为一个结果集

将数组转换为行(这里的行可理解为table的row,以便于对每一行进行操作)

WITH [[1, 2], [3, 4], 5] AS nested
UNWIND nested AS x
UNWIND x AS y
RETURN y

返回结果

result
1
2
3
4
5

本例中去掉第二次UNWIND,结果会变为

result
[1,2]
[3,4]
5

WHERE

WHERE <condition> <boolean-operator> <condition>

DELETE

删除节点/关系

DELETE <node-name-list>

// 删除单个节点:

MATCH (n:Label {property: "value"}) DELETE n

//删除单个节点及其关联的所有关系:

MATCH (n {property: "value"})-[r]-() DELETE n, r


//删除所有节点和关系(在使用此命令前请三思,因为它会清除整个图数据库):

MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n, r


//删除所有节点和关系,但保留索引:
MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n, r
DROP CONSTRAINT ON (node) ASSERT node.property IS UNIQUE

//删除所有节点和关系,并删除所有数据库内容(清空数据库):
MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n, r
DROP DATABASE dbname

注意:删除操作是不可逆的,请在执行删除操作前确保已做好充分的备份。

REMOVE

删除节点或关系的标签/属性

REMOVE <property-name-list>

// 删除属性
MATCH (n:Label {key: 'value'})
REMOVE n.unwantedProperty

SET

修改成员变量的值

SET  <property-name-list>

// 增加属性
MATCH (n:Label {key: 'value'})
SET n.newProperty = 'newValue'

// 修改属性
MATCH (n:Label {key: 'value'})
SET n.existingProperty = 'updatedValue'

UNION

合并两个查询结果,被合并的内容的指代名称应相同,且对应列名称也相同

最终结果会过滤使得不出现重复的行

MATCH (cc:CreditCard)
RETURN cc.id as id,
       cc.number as number,
       cc.name as name,
   	   cc.valid_from as valid_from,
   	   cc.valid_to as valid_to
UNION
MATCH (dc:DebitCard)
RETURN dc.id as id,
       dc.number as number,
       dc.name as name,
       dc.valid_from as valid_from,
       dc.valid_to as valid_to

UNION ALL

合并两个查询结果,最终结果会保留重复的行

<MATCH Command1>
UNION ALL
<MATCH Command2>

LIMIT

子句,放在查询语句的最后限制返回的查询结果个数

被隐去的查询结果在总查询结果的后部/底部

从前面选择指定个数个查询结果并返回

MATCH(N)
RETURN N
LIMIT 20

SKIP

子句,放在查询语句的最后指定从何处开始返回查询结果

被隐去的查询结果在总查询结果的前部/顶部

从前面跳过指定个数个查询结果后,返回剩下的查询结果

MATCH(N)
RETURN N
SKIP 20

FOREACH

遍历

MATCH p=(start)-[*]->(finish)
WHERE start.name = 'A' AND finish.name = 'D'
FOREACH (n IN nodes(p) | SET n.marked = true)

以上查询语句将所有从A到D路径上的节点都设置一个marked属性,值为true

MERGE

匹配后,根据是否匹配成功决定是否创建节点/关系

先进行匹配,若匹配成功,则不创建;若未匹配成功,则创建该节点/关系

匹配时,不必指出所有属性,如一个已经存在的节点有两个属性,MERGE语句仅尝试匹配一个属性,则也会匹配成功

匹配多个属性时,多个属性需同时匹配成功,结果才会匹配成功

MERGE (michael:Person {name: 'Michael Douglas'})
RETURN michael.name, michael.bornIn

// 假设我们有两个节点(a:Person {name: 'Alice'})和(b:Person {name: 'Bob'}),我们想要添加一个关系KNOWS表示他们相识:
MERGE (a:Person {name: 'Alice'})
MERGE (b:Person {name: 'Bob'})
MERGE (a)-[r:KNOWS]-(b)
RETURN r;

如果不指定节点/关系的属性,则相当于此处指代的对象无属性,属性列表Property List为空,即为null,与null的匹配结果均为null,即匹配均会失败

ON CREATE

MERGE的子句,指定如果未匹配成功时,创建节点/关系后执行的语句

MERGE (keanu:Person {name: 'Keanu Reeves'})
ON CREATE
  SET keanu.created = timestamp()//
RETURN keanu.name, keanu.created

ON MATCH

MERGE的子句,指定如果匹配成功时,匹配后执行的语句

MERGE (person:Person)
ON MATCH
  SET person.found = true
RETURN person.name, person.found

ON CREATE与ON MATCH可以同时写在一段MERGE查询语句中

CALL

指定一处子句段,CALL中的子句段不会作为最终查询结果返回,不能单独使用CALL

用于复合多个查询语句段

子句段的命名空间和作用域与整体查询语句部分相同

有点像SQL的exec,表示执行

CALL {
  MATCH (p:Person)
  RETURN p
  ORDER BY p.age ASC
  LIMIT 1
UNION
  MATCH (p:Person)
  RETURN p
  ORDER BY p.age DESC
  LIMIT 1
}
RETURN p.name, p.age
ORDER BY p.name

CALL PROCEDURE

CALL也用于使用处理过程(procedure)

CALL db.labels()
  • 无参数时,可略去"()"

YIELD子句

在处理过程调用结尾,指定处理过程返回的多个属性值中的某几个

CALL dbms.procedures() YIELD name, signature
WHERE name='dbms.listConfig'
RETURN signature
  • dbms.procedures()处理过程在当前版本(4.3)已不建议使用,将来会被删除,建议使用的是SHOW PROCEDURES指令
  • 使用
CALL db.labels() YIELD *

来返回处理过程返回的所有属性值

USE

指定查询语句段要使用的数据库

USE myDatabase
MATCH (n) RETURN n

LOAD CSV

加载CSV文件

  • 使用URL地址;
  • 需要使用AS子句指定引入的数据;
  • 可以是本地(file:///URL),也可以是HTTPS/HTTP/FTP地址;
  • 支持由gzip或Deflate压缩的文件,支持本地由ZIP压缩的CSV文件;
  • 支持HTTP重定向,但不支持改变传输协议的重定向;

目标CSV文件要求

  • 字符集应是UTF-8;
  • 文件结尾依据系统,unix下应为\n,Windows下应为\r\n;
  • 字段分隔符应是',' ;
  • 在LOAD CSV指令中使用FIELDTERMINATOR修改字段分隔符;
  • 字符串指代应使用双引号引起("");
  • 如果DBMS设置中设置dbms.import.csv.legacy_quote_escaping=true,则\作为转义字符;
  • 目标使用的CSV文件需要放在对应的数据库的import文件夹下使用;
LOAD CSV FROM 'file:///artists.csv' AS line
CREATE (:Artist {name: line[1], year: toInteger(line[2])})

表格中带有表头的情况下,可通过表头指定对应的列

LOAD CSV WITH HEADERS FROM 'file:///artists-with-headers.csv' AS line
CREATE (:Artist {name: line.Name, year: toInteger(line.Year)})

指定字段分隔符

LOAD CSV FROM 'file:///artists-fieldterminator.csv' AS line FIELDTERMINATOR ';'
CREATE (:Artist {name: line[1], year: toInteger(line[2])})

USING PERIODIC COMMIT

  • 表格数据过多时,指定使用的行数
  • 不指定个数时,默认每1000行commit一次;

直译为使用定期提交,下面的案例是指每500次定时提交一次

USING PERIODIC COMMIT 500 LOAD CSV FROM 'file:///artists.csv' AS line
CREATE (:Artist {name: line[1], year: toInteger(line[2])})
  • 默认下csv文件中非数字字段会被识别为String;
  • 默认下csv文件中的数字字段会被识别为对应的数字类型;



参考: https://www.cnblogs.com/MarisaMagic/p/17537963.html