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

相关推荐
LJ小番茄27 分钟前
Vue 常见的几种通信方式(总结)
前端·javascript·vue.js·html
huaqianzkh1 小时前
了解MySQL 高可用架构:主从备份
数据库·mysql·架构
向往风的男子2 小时前
【mysql】mysql之读写分离以及分库分表
数据库·mysql
阳光开朗_大男孩儿2 小时前
DBUS属性原理
linux·服务器·前端·数据库·qt
挠背小能手2 小时前
达梦数据库SCHEMA使用初探
数据库·oracle
楠神说软件测试3 小时前
接口自动化框架入门(requests+pytest)
运维·数据库·自动化
惟长堤一痕3 小时前
医学数据分析实训 项目一 医学数据采集
数据库
xuan哈哈哈3 小时前
web基础—dvwa靶场(八)SQL Injection(Blind)
数据库·web安全·网络安全
Lill_bin3 小时前
Lua编程语言简介与应用
开发语言·数据库·缓存·设计模式·性能优化·lua
pan_junbiao3 小时前
Vue组件:模板引用ref属性的使用
前端·javascript·vue.js