精华 01 cypher基本用法
发布于 5 年前 作者 wxw13637906414 2961 次浏览 来自 分享

官网地址:https://neo4j.com/docs/cypher-refcard/3.4/

1.1节点与关系语法:

节点语法:

()

(n)

(:notice)

(n:notice)

(n:notice{title:“test”})

关系语法:

–>

-[r]->

-[:quote]->

-[r:quote]->

-[r:quote {type:“quote” }]->

箭头方向可以是–>,也可以是<–

1.2 创建语法

1.2.1 创建节点

语法格式:CREATE (< node-name >:< label-name >)

例1:创建一个政策节点

create(n:notice)

例2:创建一个带属性的政策节点

create(n:notice
{
	category:"财政预算",
	classify: "财政体制改革",
	created_date: "2018-12-06 03:14:42",
	id: "b0153084998163a8834b41a5c47bd914",
	industry: "商务服务",location: "重庆"
})

例3:创建多个节点并返回

create(n1:notice{id:"1"}),(n2:notice{id:"2"}) return n1,n2

例4:创建有多个标签的节点

create(n:notice:explain {id:"22"})

1.2.2 创建关系

例1:为已知的节点添加关系

match(a:notice),(b:notice) where a.id="22" and b.id="11" 
create (a)-[r:quote]->(b)
return r

1.2.3 创建路径

例 1:创建包含两个节点一个关系的完整路径

create(n:notice{id: "b0153084998163a8834b41a5c47bd914"})
-[r:quote{type:"quote"}]->
(p:report{id:"b0153084998163a8834b4abe342"})

1.2.4 MERGE语法

merge可以确保图数据库中存在某个模式,如果不存在,则创建。

例1:返回id为"b0153084998163a8834b4abe342"的政策(policy)节点,如果没有则创建一个

merge(n:policy{id:"b0153084998163a8834b4abe342"}) return n

例2:将所有notice节点的id属性复制并创建新policy节点

match(n:notice) merge(p:policy{id:n.id}) return p

例3:检查id为"b0153084998163a8834b4abe999"的notice是否存在,如果不存在则创建,并设置创建时间;如果存在则修改更新时间

merge(n:notice{id:"b0153084998163a8834b4abe999"})
on create set n.created_date=timestamp()
on match set n.update_date=timestamp()
return n

例4:查找notice节点(id=“b0153084998163a8834b4abe999”)与节点(id=“b0153084998163a8834b4abe342”)之间是否存在间接引用关系,如果没有则创建

match(n1:notice{id:"b0153084998163a8834b4abe999"}),(n2:notice{id:"b0153084998163a8834b4abe342"})
merge (n1)-[r1:quote]->(m)-[r2:quote]->(n2)
return m

1.3 删除语法

DELETE语法需要与match配合起来使用,删除节点时必须删除与之关联的关系(如果不知道节点是否有关系,可以用detach delete强行删除)。

语法格式:DELETE < node-name-list >

例1:删除指定属性的节点

match(n:notice {id:"11"} delete n

例2:删除指定节点和关系

match(n:notice{id:"11"})-[r]->(b) delete n,r

例3:删除节点和与之关联的所有关系

match(n:notice{id:"11"}) detach delete n

1.4 更新语法

1.4.1 set语法

与match配合使用,可修改节点或关系的标签和属性

例1:修改、添加、删除节点属性(属性设置为NULL时表示删除属性)

match(n:notice {id:"11"}) 
set n.category="test",n.alia="xxx通知",n.type=NULL

例2:复制一个节点的所有属性到另一个节点

match(n1:notice{id:"11"}),(n2:notice{id:"22"})
set n2=n1

例3:用map的方式一次为节点添加多个属性

match(n1:notice{id:"11"})
set n1 += {type:"notice", location:"广东"}

例4:为节点设置多个标签

match(n1:notice{id:"11"})
set n1:explain:file

1.4.2 remove语法

remove可以删除节点或关系的属性和标签

例1:删除节点多个属性

match(n1:notice{id:"11"})
remove n1.type,n1.location

例2:删除节点多个标签

match(n1:notice{id:"11"})
remove n1:explain:file

1.5 查询语法

1.5.1 match-where-return语法

例1:查询满足条件的节点信息

match(n:notice)
where n.category<>"其他" and n.classify="PPP与政府采购"
and n.industry in ["公共设施","科研技术"]
and (n.location STARTS WITH '广东' or n.location CONTAINS '南宁' or n.organization ENDS WITH '财政局')
and exists(n.created_date) and n.created_date IS NOT NULL
and "2019-12-05">n.created_date>="2018-12-05" 
or n.created_date = "2018-12-05\t\"19:50:03"
return n as zhengce

注:STARTS WITH, ENDS WITH, CONTAINS做字符串匹配时,是大小写敏感的

例2:字符串反向匹配,查找非广东的政策数据

match(n:notice)
where NOT n.location STARTS WITH '广东'

例3:查询标签为entity或者Movie的节点

MATCH(n) WHERE n:entity OR n:Movie return n

例4:查询关系type为quote或explain的路径

match(n)-[r:quote|:explain]→(m) return n,r,m

1.5.2 正则表达式

语法:~‘正则表达式’

例1:查询广东省的政策解读

match(n:explain) where n.location=~'广东.*' return n

例2:查询属性organization中以 斜杠 /开头的政策

match(n) where n.organization=~'\\/.*' return n

1.5.3 常用函数

1.5.3.1 字符串函数

UPPER(s):将字符串转为大写 LOWER(s):将字符串转为小写 SUBSTRING(s, startInx, endInx):截取字符串,包含startInx,不包含endInx REPLACE(s,source,target):替换字符串

1.5.3.2 标量函数

LENGTH( collection ) 返回集合的元素个数 TYPE( relationship ) 返回关系的类型 STARTNODE(relationship) 返回关系的开始节点 ENDNODE(relationship) 返回关系的结束节点 ID( property-container ) 返回节点或者关系的ID COALESCE( expression [, expression]* ) 返回expressions列表里第一个不为空的值 HEAD( collection) 返回一个集合 (collection) 里的第一个元素 LAST( collection) 返回一个集合 (collection) 里最后一个元素 LABELS(node) 返回一个节点的标签集合 PROPERTIES(node) 返回一个节点的属性集合 KEYS(node) 返回一个节点的属性键集合

例1:获取水稻关联的两层关系,返回所有关系的类型、开始节点和结束节点

match (n:industry)-[r*..2]-(m) where n.name="水稻" with last(r) as lr return type(lr),startnode(lr),endnode(lr)

例2:复制节点

match(n) where n.id in [“557ac547e2174ba4d87a1fb2c86a54d0”,“41afebb746784e7db842fa59ad54ecdd”] with n as p create(m:test) set m=properties§

1.5.3.3 集合函数

NODES( path ) 返回一个路径的所有节点 RELATIONSHIPS( path ) 返回一个路径的所有关系 EXTRACT( identifier in collection | expression ) 返回一个结果集合:对集合(collection)的所有元素执行expression的操作得到的结果 FILTER(identifier in collection WHERE predicate) 返回集合(collection)中所有满足断言(predicate)的元素组成的集合 ALL(identifier in collection WHERE predicate) 返回true,当集合(collection)中所有元素满足断言(predicate) ANY(identifier in collection WHERE predicate) 返回true,当集合(collection)中任意一个元素满足断言(predicate) NONE(identifier in collection WHERE predicate) 返回true,当集合(collection)中没有一个元素满足断言(predicate) SINGLE(identifier in collection WHERE predicate) 如果集合(collection)里的只有一个元素满足断言(predicate)则返回true TAIL( expression ) 返回集合中除了第一个之外的所有元素 RANGE( start, end [, step] ) 返回从start开始,end结束(闭区间)内步长为step(非0)的所有整数数字

例1:查询id为b275500bfc4c4119b36ed5d1f71d07c4的节点的最大两层关联关系的路径,且路径中的关系type要为child_product和has_measure

match p=(n:industry)-[r*..2]-(m) where n.id="b275500bfc4c4119b36ed5d1f71d07c4"  and all(r1 in RELATIONSHIPS(p) where type(r1) in ['child_product','has_measure']) return n,r,m

例2:查询水稻产业关联的2层关系,返回每个关系的开始、结束节点、关系类型

match (n:industry)-[r*..2]-(m) where n.name="水稻" with EXTRACT(r1 in r | type(r1)) as rtype,EXTRACT(r1 in r | startnode(r1).id) as snode,EXTRACT(r1 in r | endnode(r1).id) as enode return rtype,snode,enode

1.5.3.4 数学函数

ABS( expression ) 返回expression得到的数值的绝对值 ROUND( expression ) 取整函数:返回小于等于expression得到的数值的最大整数(还是返回离expression得到的数值最近的整数??) SQRT( expression ) 返回expression得到的数值的平方根 SIGN( expression ) 符号函数:如果expression得到的数值,为0则返回0;为负数则返回-1;为正数则返回1

1.5.3.4 聚合函数

所有聚合函数均可以使用 DISTINCT操作

COUNT( expression ) 返回expression得到的结果的个数,expression也可为"*" SUM( expression ) 返回expression得到结果相加的和 AVG( expression ) 返回expression得到结果的平均值 MAX( expression ) 返回expression得到结果的最大值 MIN( expression ) 返回expression得到结果的最小值 COLLECT( expression ) 把expression得到的结果以list的形式返回

例1:分别查询政(id=“9b116c59723cd7a704a6913f35b69cc9”)策的各种关系的数量

match(n:notice{id:"9b116c59723cd7a704a6913f35b69cc9"})-[r]->() return type(r),count(*)

1.5.4 分页与排序

order by prop:根据属性prop排序;skip n:从第n条数据开始;limit n:限制总条数为n

例1:查询政策,根据创建日期倒序返回第4到第10条的数据(包含第10条)

match(n:notice)
return n
order by n.created_date desc
skip 3
limit 7

1.5.5 case when语法

语法格式1:

CASE 表达式

WHEN 值1 THEN 结果1

[WHEN …]

[ELSE 默认值]

END

语法格式2:

CASE

WHEN 断言表达式1 THEN 结果1

[WHEN …]

[ELSE 默认值]

END

例1:查找各种类型的政策并以中文名显示

match(n)
return 
case n.type
when 'notice' then '通告'
when 'explain' then '解读'
when 'report' then '报告'
else '其他'
end

或者如下:

match(n)
return 
case 
when n.type='notice' then '通告'
when n.type='explain' then '解读'
when n.type='report' then '报告'
else '其他'
end

注:后一种写法比第一种灵活,第一种只能以 等于 作为判断条件,后一种可以用各种表达式判断

1.5.6 union与union all

二者都是将查询结果组合起来,union可以去重

例1:查询所有报告和解读

match(n:report) return n
union
match(n:explain) return n

1.6 空值的逻辑运算

空值null,在逻辑运算中遵循以下规则

a b a AND b a OR b a XOR b false false false false false false null false null null false true false true true true null null true null true true true true false null null null null null

空值在in表达式中,如果列表中有null,且没匹配到,则返回null

表达式 结果 2 in [1,null,3] null 2 in [1,2,null] true 2 in [1] false null in [1,2,3] null null in [1,null,3] null null in [] false

1 回复

nice! 本论坛是用 Markdown 作为排版格式。可以用Markdown编辑器 编写完后粘贴到本论坛。 推荐:mdeditor 在线编辑器: https://www.mdeditor.com/ 谢谢

回到顶部