文章目录
Cypher介绍
NodeMatcher
和RelationshipMatcher
能够表达的匹配条件相对简单,更加复杂的查询还是需要用Cypher
语句来表达。
Py2neo
本身支持执行Cypher
语句的执行,可以将复杂的查询写成Cypher
语句,通过graph.run
方法查询,返回的结果可以转化为pandas.DataFrame
或者pandas.Series
对象,从而和其他数据分析工具无缝衔接。
执行Cypher语句查询
- 查询某类所有节点
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 温式效应
- 查询某个节点的路径为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变)
- 查询周杰伦的所有专辑
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变'
'歌手' '我很忙'
- 查询具体两个人的路径在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
中的节点和关系分别用nodes
和relationships
表示,并且是按照路径上节点和关系的顺序分别存放的。
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
中的节点、关系和路径时,条件简单的查询可以通NodeMatcher
和RelationshipMatcher
来实现。而较为复杂的查询,可以写成Cypher
语句来查询,查询结果可以转化为pandas
的DataFrame
或者Series
数据类型,与其他数据分析工具结合。