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

相关推荐
脑袋大大的3 小时前
JavaScript 性能优化实战:减少 DOM 操作引发的重排与重绘
开发语言·javascript·性能优化
速易达网络5 小时前
RuoYi、Vue CLI 和 uni-app 结合构建跨端全家桶方案
javascript·vue.js·低代码
耶啵奶膘5 小时前
uniapp+firstUI——上传视频组件fui-upload-video
前端·javascript·uni-app
JoJo_Way5 小时前
LeetCode三数之和-js题解
javascript·算法·leetcode
视频砖家5 小时前
移动端Html5播放器按钮变小的问题解决方法
前端·javascript·viewport功能
隆里卡那唔7 小时前
在dify中通过http请求neo4j时为什么需要将localhost变为host.docker.internal
http·docker·neo4j
疯子的模样7 小时前
Docker 安装 Neo4j 保姆级教程
docker·容器·neo4j
计算机毕设定制辅导-无忧学长7 小时前
西门子 PLC 与 Modbus 集成:S7-1500 RTU/TCP 配置指南(一)
服务器·数据库·tcp/ip
程序员柳7 小时前
基于微信小程序的校园二手交易平台、微信小程序校园二手商城源代码+数据库+使用说明,layui+微信小程序+Spring Boot
数据库·微信小程序·layui