Cypher语句查询neo4j数据库教程

文章目录

Cypher介绍

NodeMatcherRelationshipMatcher能够表达的匹配条件相对简单,更加复杂的查询还是需要用Cypher语句来表达。

Py2neo本身支持执行Cypher语句的执行,可以将复杂的查询写成Cypher语句,通过graph.run方法查询,返回的结果可以转化为pandas.DataFrame或者pandas.Series对象,从而和其他数据分析工具无缝衔接。

执行Cypher语句查询
  1. 查询某类所有节点
python 复制代码
cypher_ = "MATCH (n:person) RETURN n.name as name"

df = graph.run(cypher_).to_data_frame() # pd.DataFrame
df
python 复制代码
	name
0	周杰伦
1	蔡依林
2	方文山
3	洪荣宏
4	杨瑞代
5	黄淩嘉
6	徐若瑄
7	许世昌
8	梁心颐
9	宋健彰
10	张惠妹
11	李玟
12	天台 声带
13	黄俊郎
14	陈镇川
15	古小力
16	袁咏琳
17	刘畊宏
18	弹头
19	李心艾
20	黄婕熙
21	罗宇轩
22	李汪哲
23	邱凯伟
24	杨常青
25	曾郁婷
26	毛毛
27	唐从圣
28	费玉清
29	黄凌嘉
30	陈奕迅
31	魏如昀
32	南拳妈妈
33	宇豪
34	许茹芸
35	齐秦
36	吴宗宪
37	温岚
38	潘儿

查询所有专辑

python 复制代码
cypher_ = "MATCH (n:album) RETURN n.name as name"

df = graph.run(cypher_).to_data_frame() # pd.DataFrame
df
python 复制代码
	name
0	惊叹号
1	周杰伦的床边故事
2	恋花
3	跨时代
4	12新作
5	叶惠美
6	范特西
7	八度空间
8	依然范特西
9	最伟大的作品
10	看我72变
11	我很忙
12	天台爱情
13	Promise
14	魔杰座
15	Jay
16	寻找周杰伦
17	十一月的萧邦
18	11月的萧邦
19	七里香
20	城堡
21	袁咏琳 Cindy
22	哎呦,不错哦
23	浪花兄弟
24	Lucky Number
25	回想曲青青校树
26	范特西PLUS
27	认了吧
28	乐酷·概念合辑
29	南拳妈妈的夏天
30	真爱无敌
31	哎哟,不错哦
32	有点野
33	给你的情书
34	2007世界巡回演唱会
35	温式效应
  1. 查询某个节点的路径为2的所有路径
python 复制代码
cypher_ = "MATCH P=(a)-[*2]-(b)\
WHERE a.name='蔡依林'\
RETURN P"

relationship = graph.run(cypher_)
for rel in relationship:
    print(rel)
python 复制代码
Path(Node('person', name='蔡依林'), 歌手(Node('song', name='Dare for more'), Node('person', name='蔡依林')), 歌手(Node('song', name='Dare for more'), Node('person', name='周杰伦')))
Path(Node('person', name='蔡依林'), 歌手(Node('song', name='布拉格广场'), Node('person', name='蔡依林')), 歌手(Node('song', name='布拉格广场'), Node('person', name='周杰伦')))
Path(Node('person', name='蔡依林'), 歌手(Node('song', name='布拉格广场'), Node('person', name='蔡依林')), 所属专辑(Node('song', name='布拉格广场'), Node('album', name='看我72变')))
Path(Node('person', name='蔡依林'), 歌手(Node('album', name='看我72变'), Node('person', name='蔡依林')), 所属专辑(Node('song', name='布拉格广场'), Node('album', name='看我72变')))
Path(Node('person', name='蔡依林'), 歌手(Node('album', name='看我72变'), Node('person', name='蔡依林')), 歌手(Node('album', name='看我72变'), Node('person', name='周杰伦')))
Path(Node('person', name='蔡依林'), 歌手(Node('album', name='看我72变'), Node('person', name='蔡依林')), 所属专辑(Node('song', name='骑士精神'), Node('album', name='看我72变')))
Path(Node('person', name='蔡依林'), 歌手(Node('song', name='海盗'), Node('person', name='蔡依林')), 作词(Node('song', name='海盗'), Node('person', name='陈镇川')))
Path(Node('person', name='蔡依林'), 歌手(Node('song', name='海盗'), Node('person', name='蔡依林')), 所属专辑(Node('song', name='海盗'), Node('album', name='城堡')))
Path(Node('person', name='蔡依林'), 歌手(Node('person', name='蔡依林'), Node('album', name='城堡')), 所属专辑(Node('song', name='海盗'), Node('album', name='城堡')))
Path(Node('person', name='蔡依林'), 歌手(Node('person', name='蔡依林'), Node('album', name='城堡')), 作词(Node('person', name='陈镇川'), Node('album', name='城堡')))
Path(Node('person', name='蔡依林'), 歌手(Node('song', name='你怎么连话都说不清楚'), Node('person', name='蔡依林')), 作词(Node('song', name='你怎么连话都说不清楚'), Node('person', name='周杰伦')))
Path(Node('person', name='蔡依林'), 歌手(Node('song', name='你怎么连话都说不清楚'), Node('person', name='蔡依林')), 作词(Node('song', name='你怎么连话都说不清楚'), Node('person', name='毛毛')))
Path(Node('person', name='蔡依林'), 歌手(Node('song', name='你怎么连话都说不清楚'), Node('person', name='蔡依林')), 所属专辑(Node('song', name='你怎么连话都说不清楚'), Node('album', name='Lucky Number')))
Path(Node('person', name='蔡依林'), 作词(Node('person', name='蔡依林'), Node('person', name='毛毛')), 作词(Node('song', name='你怎么连话都说不清楚'), Node('person', name='毛毛')))
Path(Node('person', name='蔡依林'), 作词(Node('person', name='蔡依林'), Node('person', name='毛毛')), 作词(Node('person', name='周杰伦'), Node('person', name='毛毛')))
Path(Node('person', name='蔡依林'), 歌手(Node('song', name='骑士精神'), Node('person', name='蔡依林')), 所属专辑(Node('song', name='骑士精神'), Node('album', name='看我72变')))
python 复制代码
(蔡依林)<-[:歌手 {}]-(Dare for more)-[:歌手 {}]->(周杰伦)
(蔡依林)<-[:歌手 {}]-(布拉格广场)-[:歌手 {}]->(周杰伦)
(蔡依林)<-[:歌手 {}]-(布拉格广场)-[:所属专辑 {}]->(看我72变)
(蔡依林)<-[:歌手 {}]-(看我72变)<-[:所属专辑 {}]-(布拉格广场)
(蔡依林)<-[:歌手 {}]-(看我72变)-[:歌手 {}]->(周杰伦)
(蔡依林)<-[:歌手 {}]-(看我72变)<-[:所属专辑 {}]-(骑士精神)
(蔡依林)<-[:歌手 {}]-(海盗)-[:作词 {}]->(陈镇川)
(蔡依林)<-[:歌手 {}]-(海盗)-[:所属专辑 {}]->(城堡)
(蔡依林)-[:歌手 {}]->(城堡)<-[:所属专辑 {}]-(海盗)
(蔡依林)-[:歌手 {}]->(城堡)<-[:作词 {}]-(陈镇川)
(蔡依林)<-[:歌手 {}]-(你怎么连话都说不清楚)-[:作词 {}]->(周杰伦)
(蔡依林)<-[:歌手 {}]-(你怎么连话都说不清楚)-[:作词 {}]->(毛毛)
(蔡依林)<-[:歌手 {}]-(你怎么连话都说不清楚)-[:所属专辑 {}]->(Lucky Number)
(蔡依林)-[:作词 {}]->(毛毛)<-[:作词 {}]-(你怎么连话都说不清楚)
(蔡依林)-[:作词 {}]->(毛毛)<-[:作词 {}]-(周杰伦)
(蔡依林)<-[:歌手 {}]-(骑士精神)-[:所属专辑 {}]->(看我72变)
  1. 查询周杰伦的所有专辑
python 复制代码
cypher_ = "MATCH (n:album)-[r]->(m:person) \
where m.name = '周杰伦'\
RETURN type(r) AS type,n.name AS name"

album_person = graph.run(cypher_)
for ap in album_person:
    print(ap)
python 复制代码
'歌手'	'七里香'
'歌手'	'浪花兄弟'
'歌手'	'恋花'
'歌手'	'跨时代'
'歌手'	'12新作'
'歌手'	'周杰伦的床边故事'
'歌手'	'叶惠美'
'歌手'	'范特西'
'歌手'	'八度空间'
'歌手'	'依然范特西'
'歌手'	'最伟大的作品'
'歌手'	'看我72变'
'歌手'	'我很忙'
  1. 查询具体两个人的路径在4以内的关系
python 复制代码
cypher_ = "MATCH path=(m:person)-[:作词 *1..4]->(n:person) \
WHERE m.name='周杰伦' AND n.name='徐若瑄' \
RETURN path"

s = graph.run(cypher_)

for l in s:
    print(l.values()[0])
python 复制代码
(周杰伦)-[:作词 {}]->(徐若瑄)
(周杰伦)-[:作词 {}]->(方文山)-[:作词 {}]->(周杰伦)-[:作词 {}]->(徐若瑄)

手动写出path路径的关系网
Path是一个比较复杂的结构,Path中的节点和关系分别用nodesrelationships表示,并且是按照路径上节点和关系的顺序分别存放的。

python 复制代码
cypher_ = "MATCH path=(m:person)-[:作词 *1..4]->(n:person) \
WHERE m.name='周杰伦' AND n.name='徐若瑄' \
RETURN path"
s = graph.run(cypher_)

for path in s:
    # 直接打印path
    print(path)
    # 获取路径中的节点和关系
    nodes = path.nodes
    relationships = path.relationships   
    # 自己组织路径文本
    path_text = ""
    for n,r in zip(nodes, relationships):
        # 每次加入一个节点和一个关系的类型
        path_text += "{} - {} - ".format(n['name'], type(r).__name__)
    # 别忘了最后一个节点
    path_text += nodes[-1]['name'] + '\n'
    print(path_text)
总结

使用Py2neo查询Neo4j中的节点、关系和路径时,条件简单的查询可以通NodeMatcherRelationshipMatcher来实现。而较为复杂的查询,可以写成Cypher语句来查询,查询结果可以转化为pandasDataFrame或者Series数据类型,与其他数据分析工具结合。

相关推荐
明矾java7 分钟前
Mysql-SQL执行流程解析
数据库·sql·mysql
蓬莱道人23 分钟前
BenchmarkSQL使用教程
数据库
ordinary9038 分钟前
指令-v-for的key
前端·javascript·vue.js
p@nd@39 分钟前
Oracle筑基篇-调度算法-LRU的引入
数据库·oracle·操作系统·lru
来一杯龙舌兰1 小时前
【MongoDB】使用 MongoDB 存储日志、审批、MQ等数据的案例及优点
数据库·mongodb
技术路上的苦行僧1 小时前
分布式专题(8)之MongoDB存储原理&多文档事务详解
数据库·分布式·mongodb
前端Hardy1 小时前
HTML&CSS:酷炫的3D开关控件
前端·javascript·css·3d·html
孤独的履行者1 小时前
入门靶机:DC-1的渗透测试
数据库·python·网络安全
wy02_1 小时前
MySQL-MVCC(多版本并发控制)
数据库·mysql
小马超会养兔子1 小时前
如何写一个数字老虎机滚轮
开发语言·前端·javascript·vue