neo4j
命令 | 用法 |
---|---|
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文件中的数字字段会被识别为对应的数字类型;