RedisGraph Python 实现

redisGraph,作为redis的图形数据库刚推出不久,网上案例相对较少,作者及使用者都在探索阶段,关于怎么搭建redisGraph环境可参考官方文档:http://redisgraph.io/,运行在Linux环境中,主要往原来redis服务中加载一项: Module 'graph' loaded from /home/hadoop/redis-module-graph/src/redisgraph.so  标红为自己存放redisgraph.so文件地址。

启动通过redis的配置文件加载该模块。

Python需要导入redis,redisgraph这两个模块,可通过pip命令导入。

本文主要参考官方文档http://redisgraph.io/进行python化编写,同时也将源码中一些bug进行修改,翻译版原文中部分代码无法执行,会阻塞redis,严重会使redis服务停止,我也联系了redisGraph作者提交了该问题,GitHub

https://github.com/swilly22/redis-graph/issues/100,同时官方redisGraph安装包和Python版都在GitHub中点击打开链接

#!/usr/bin/env python  
# encoding: utf-8  
""" 
@version: v1.0 
@author: W_H_J 
@license: Apache Licence  
@contact: 415900617@qq.com 
@site:  linux - centos7
@software: PyCharm 
@file: redis_graph_movie.py 
@time: 2018/4/16 17:30 
@describe: 针对https://www.zybuluo.com/Rays/note/1079251的建表语句的更改,更加易读,同时排除部分bug
(原文:GRAPH.QUERY IMDB "MATCH (a:actor)-[act]->(m:movie {title:\"Straight Outta Compton\"})
RETURN m.title, SUM(a.age), MAX(a.age), MIN(a.age), AVG(a.age)" 该语句在Python语言执行时无返回结果,占用
资源,严重者导致redis服务奔溃,通过改写建表语句后,能正确返回结果)

Hexastore的结构由一系列三元组组成。其中,每个三元组包括如下三部分:

1.主语(Subject);
2.谓词(Predicate);
3.目标(Object)。
查询关系:S-[P]->O
该关系的六种可能排列如下:
SPO:Aldis_Hodge:act:Straight_Outta_Compton
SOP:Aldis_Hodge:Straight_Outta_Compton:act
POS:act:Straight_Outta_Compton:Aldis_Hodge
PSO:act:Aldis_Hodge:Straight_Outta_Compton
OPS:Straight_Outta_Compton:act:Aldis_Hodge
OSP:Straight_Outta_Compton:Aldis_Hodge:act
"""
import redis
from redisgraph import Node, Edge, Graph

pool = redis.ConnectionPool(host='192.168.87.129', port=6379, db=1, password='root')
r = redis.Redis(connection_pool=pool)
# 电影图--创建一个名为MOVIE的图
redis_graph = Graph('MOVIE', r)
# 节点1
node_A_1 = Node(label='actor', properties={'name': 'Aldis Hodge', 'birth_year': 1986, 'age': 20})
node_A_2 = Node(label='actor', properties={'name': 'OShea Jackson', 'birth_year': 1991, 'age': 21})
node_A_3 = Node(label='actor', properties={'name': 'Corey Hawkins', 'birth_year': 1988, 'age': 23})
node_A_4 = Node(label='actor', properties={'name': 'Neil Brown', 'birth_year': 1980, 'age': 30})
# 节点2
node_B_1 = Node(label='movie', properties={'title': 'MY Father', 'genre': 'Biography', 'votes': 127258, 'rating': 7.9, 'year': 2015})
node_B_2 = Node(label='movie', properties={'title': 'Never Go Back', 'genre': 'Action', 'votes': 15821, 'rating': 6.4, 'year': 2016})
# edge_1 = Edge(node_A_1, 'act', node_B_2, properties={'actor_class': 'Lead'})
edge_2 = Edge(node_A_2, 'act', node_B_2, properties={'actor_class': 'Costar'})
edge_3 = Edge(node_A_3, 'act', node_B_1, properties={'actor_class': 'Lead'})
edge_4 = Edge(node_A_4, 'act', node_B_1, properties={'actor_class': 'Costar'})
edge_5 = Edge(node_A_1, 'act', node_B_1, properties={'actor_class': 'Costar'})
edge_5 = Edge(node_A_2, 'act', node_B_1, properties={'actor_class': 'Costar'})
# 提交节点信息
redis_graph.add_node(node_A_1)
redis_graph.add_node(node_A_2)
redis_graph.add_node(node_A_3)
redis_graph.add_node(node_A_4)
redis_graph.add_node(node_B_1)
redis_graph.add_node(node_B_2)
redis_graph.add_edge(edge_1)
redis_graph.add_edge(edge_2)
redis_graph.add_edge(edge_3)
redis_graph.add_edge(edge_4)

# 提交建图信息
# redis_graph.commit()

# # 查询图信息
query = """
MATCH (a:actor)-[b:act{actor_class:"Lead"}]->(m:movie{title:"MY Father"})  RETURN a.name, a.age, a.birth_year,m.title
"""
# 查询出演过“never go back”的演员的年龄总和等
query1 = """
MATCH (a:actor)-[b:act]->(m:movie {title:"Never Go Back"})
RETURN m.title, SUM(a.age), MAX(a.age), MIN(a.age), AVG(a.age)
"""
# 查询出演过“never go back”的演员
query2 = """
MATCH (a:actor)-[b:act]->(m:movie)
WHERE m.title="Never Go Back"
RETURN a.name
"""
# 查询每个演员演了多少电影
query3 = """
MATCH (a:actor)-[b:act]->(m:movie) RETURN a.name, COUNT(m.title) AS movies_count ORDER BY
movies_count DESC
"""
# 查询找出所有20岁以上并与Corey Hawkins共同参演过影片的演员
# 原文语句,会阻塞redis,无结果,不运行.
'''
MATCH (aldis::actor {name:"Aldis Hodge"})-[act]->(m:movie)<-[act]-(a:actor) WHERE a.age > 30 RETURN m.title, a.name
'''
query4 = """
MATCH (a1:actor {name:"Corey Hawkins"})-[act]->(m:movie)<-[act]-(a:actor) 
WHERE a.age > 20 
RETURN m.title, a.name
"""
# 查询是主角的演员
query5 = """
MATCH (a:actor)-[b:act]->(m:movie)
WHERE b.actor_class='Lead'
RETURN a.name AS actor_name,m.title AS movie_name
"""
redis_graph.query(query).pretty_print()
redis_graph.query(query1).pretty_print()
redis_graph.query(query2).pretty_print()
redis_graph.query(query3).pretty_print()
redis_graph.query(query4).pretty_print()
redis_graph.query(query5).pretty_print()

.pretty_print()为最终结果打印,官方源码未提及,运行官方示例代码若想查看返回值,执行该方法时会出错。

若有新问题或其他新更新或idea,欢迎及时讨论留言。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值