MERGE:合并节点,若没有匹配到查询的模式就创建它
1.1:合并节点:
MERGE创建节点使用唯一性约束,使节点属性不发生重名的情况
MERGE = CREATE + MATCH
// 合并有多个属性的节点,若不存在则创建
MERGE (charlie {name:'Charlie Sheen', age:10}) RETURN charlie
1.2:MERGE与MATCH与CREATE搭配:
// 查询找到带有Person节点然后设置它们的found属性为TRUE
MERGE (person:Person)
ON MATCH SET person.found=TRUE
RETURN person.name, person.found
// 结合CREATE与MATCH,MEAGE先检查节点是否存在,不存在则创建,后设置属性
MERGE (keanu:Person{name:'Keanu Reeves'})
ON CREATE SET keanu.created = timestamp()
ON MATCH SET keanu.lastSeen = timestamp()
RETURN keanu.name, keanu.created, keanu.lastSeen
1.3:MEAGE匹配节点时可以不指定方向,MEAGE会为我们自定义方向
// 匹配具有KNOWS关系之间的两个节点
MATCH (charlie:Person{name:'Charlie Sheen'}), (oliver:Person{name:'Lilly'})
MEAGE (charlie)-[r:KNOWS]-(oliver)
RETURN charlie,r
CREATE UNIQUE:创建唯一性节点
// 节点关系中不存在LOVES,会创建唯一节点与root关联
MATCH (root{name:'root'})
CREATE UNIQUE (root)-[:LOVES]-(someone)
RETURN someone
// 当A节点已近与B节点有该关系,当前匹配会创建A指向C的唯一关系
MATCH (lft{name:'A'}),(rgt)
WHERE lft.name IN ['B','C']
CREATE UNIQUE (lft)-[r:KNOWS]->(rgt)
RETURN lft,rgt
// 含值模式创建
MATCH (root{name:'A'})
CREATE UNIQUE (root)-[:X]-(leaf{name:'D'})
RETURN leaf
SET:用于更新节点的标签以及节点与关系的属性
// 修改属性将属性值置空
MATCH (n:Person{name:'Tom'})
SET n.name = NULL
RETURN n
// 在节点与关系间拷贝属性
MATCH (at{name:'Andres'}),(pn{name:'Peter'})
SET at = pn
RETURN at, pn
// 添加属性
MATCH (peter{name:'Peter'})
SET peter += {hungry:TURE, position: 'East'}
// 添加标签
MATCH (n{name:'Stefan'})
SET n:German:Person
RETURN n
DELETE:删除节点与关系,路径等
删除前需要将带删除的元素或关系查询出来
// 删除关系
CREATE (n{name:'nodeA'})-[r:x]->(m{name:'nodeB'})
DELETE r
// 删除路径,注意这里删除路径与删除关系的区别
CREATE (n{name:'nodeA'})-[r:x]->(m{name:'nodeB'})
MATCH p=(a{name:'nodeA'})--(b{name:'nodeB'})
DELETE p
当删除一个带有关系的节点时,不能够直接删除,用DETACH DELETE
MATCH (n{name:'NodeA'})
DELETE DETACH n
// 删除属性
MATCH(n{name:'Tom'})
DELETE n.bronIn
// 删除标签
MATCH(n{name:'Tom'})
DELETE n:German
ORDER BY:排序,需要紧跟RETURN或者WITH语句使用
当结果集中的值含有null时,对于升序排列,null总是在结果集的末尾,而对于降序排列,null值总是会排在最前面
// 查找节点并按照名称降序排序
MATCH (n)
RETURN n
ORDER BY n.name DESC
LIMIT:限制结果集返回的模式
// 限制输出为五行
MATCH (n:Person)
RETURN n
ORDER BY n.num
LIMIT 5
SKIP:定义了从哪行开始返回,接受任意结果为整数的表达式
// 从第三页开始返回,每页返回10条
MATCH(n)
RETURN n
ORDER BY n.name
SKIP 3 LIMIT 10
WITH:
// 用匹配出的结果进行过滤
MATCH (david{name:'Tom Hanks'})--()--(otherPerson)
WITH otherPerson, count(*) AS foaf
WHERE foaf > 1
RETURN otherPerson
// 对匹配到的结果二次操作,用多条MATCH语句拼接查询
MATCH (n{name:'Tom Hanks'})--(m)
WITH m
ORDER BY m.name DESC LIMIT 1
MATCH (m)--(o)
RETURN o.name
FOREACH:用于循环遍历结果集列表
可以用FOREACH来更新列表与路径上的数据,FOREACH括号中的变量是与括号外部分离的,并且在FOREACH中可以对匹配到的元素执行CREATE,SET等操作。
// 遍历列表内的名字,创建用户与它们之间的朋友关系
MATCH (a{name:'root'})
FOREACH (name IN ['Mike', 'Carl', 'Bruce'] | CREATE (a)-[:FRIEND]->(:Person{name: name}))
聚类函数:
count:统计数量的函数
// 统计与Tom Hanks相关的关系以及关系数量
MATCH (n:Person{name:'Tom Hanks'})-[r]-(m)
RETURN type(r), count(*)
sum:和函数
MATCH (n:Person) RETURN sum(n.property)
avg:平均值函数
MATCH (n:Person) RETURN avg(n.property)
max,min:最大值与最小值
collect:收集匹配到的所有值,将它们放到一个list列表中
MATCH (n:Person)
RETURN collect(n.property)
DISTINCT:去除重复值的修饰符,所有的聚合函数都可以用这个关键字修饰,null会被忽略
MATCH (n) RETURN count(DISTINCT b.propertry)
UNWIND:将一个列表展开为一个行的序列
// 创建一个带有重复元素的行list,将它们转化为不重复的列元素集合
WITH [1,2,1,2] AS coll
UNWIND coll AS x
WITH DISTINCT x
RETURN collect(x) AS SET
UNION:联合
// 将两个查询的结果组合在一起,当不使用ALL时,则不会返回重复元素
MATCH (n:lable1)
RETURN n.name AS name
UNION ALL
MATCH (n.lable2)
RETURN n.title AS name
CALL:调用存储过程
// 调用过程,neo4j有很多内置过程,该语句返回label的数量与名称
CALL db.labels() YIELD label
RETURN count(label) AS numlabels,label
LOAD CSV:
- CSV文件的URL可以由FROM后面紧跟的任意表达式来指定
- 需要使用AS来为CSV数据指定一个变量
- CSV可以通过HTTP,HTTPS等网络协议来访问服务器上的资源
// 从本地文件中导入数据
LOAD CSV FROM 'file:///artists.csv' AS line
CREATE(:Artist{name:line[1], year:toInt(line[2])})
// 从服务器上导入数据
LOAD CSV FROM 'http://xxxxxxx/xx.csv' AS line
CREATE(:Artist{name:line[1], year:toInt(line[2])})
// 当CSV包含头文件,开始行包含列的名称,指定WITH HEADERS可以通过对应的列名来访问指定的字段
LOAD CSV WITH HEADERS FROM
'http://xxxxxxx/xx.csv' AS line
CREATE (:Artist{name:line.Name, year:toInt(line.Year)})
// 导入巨量数据,在COMMIT后加数字可以指定一次性写入多少数据,不写默认一次性写入1000条
USING PERIODIC COMMIT 500
LOAD CSV FROM 'http://xxxxxxx/xx.csv' AS line
CREATE(:Artist{name:line[1], year:toInt(line[2])})