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数据类型,与其他数据分析工具结合。

相关推荐
yqcoder几秒前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
聂 可 以38 分钟前
Windows环境安装MongoDB
数据库·mongodb
web前端神器39 分钟前
mongodb多表查询,五个表查询
数据库·mongodb
门牙咬脆骨42 分钟前
【Redis】redis缓存击穿,缓存雪崩,缓存穿透
数据库·redis·缓存
门牙咬脆骨44 分钟前
【Redis】GEO数据结构
数据库·redis·缓存
会发光的猪。44 分钟前
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
前端·javascript·vue.js
天下代码客1 小时前
【vue】vue中.sync修饰符如何使用--详细代码对比
前端·javascript·vue.js
wusong9991 小时前
mongoDB回顾笔记(一)
数据库·笔记·mongodb
代码小鑫1 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计
changuncle1 小时前
MongoDB数据备份与恢复(内含工具下载、数据处理以及常见问题解决方法)
数据库·mongodb