RedisGraph Python 实现

原创 2018年04月16日 19:25:11

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,欢迎及时讨论留言。

python用类实现队列功能

python用类实现队列功能队列与栈类似,但是队列的入列和出列是最新进入的元素最先取出来,即先入先出。用python编写脚本,使用类的功能,面对对象编程,实现队列的功能。该脚本中的初始队列是空的。 ...
  • ass_assinator
  • ass_assinator
  • 2017年09月05日 22:55
  • 265

python classmethod,staticmethod实现

classmethod class my_classmethod(object): def __get__(self, obj, type=None): def wrapper...
  • u010066807
  • u010066807
  • 2016年05月10日 21:58
  • 839

Python链表的实现

单链表的实现 python实现链表依赖于类生成的实例,每个节点都是一个对象,组合在一起形成一个完整链表对于node类只需关注两点:data 和 pnext 对于linked_list需要关心的:h...
  • lvhuiyang
  • lvhuiyang
  • 2016年12月11日 11:30
  • 4968

Python 实现单向链表

Python 实现单向链表 什么是 链表 链表顾名思义就是~链 链表是一种动态数据结构,他的特点是用一组任意的存储单元存放数据元素。链表中每一个元素成为“结点”,每一个结点都是由数据域和...
  • qq490691606
  • qq490691606
  • 2015年11月20日 13:50
  • 5335

Python剑指offer之两个栈实现一个队列-两个队列实现一个栈

栈与队列之间的相互实现,是面试中的经典试题。 两个栈实现一个队列 入队:元素进栈A 出队:先判断栈B是否为空,为空则将栈A中的元素 pop 出来并 push 进栈B,再栈B出栈,如不为空则栈...
  • songyunli1111
  • songyunli1111
  • 2018年02月22日 16:19
  • 177

【机器学习算法-python实现】采样算法的简单实现

1.背景    采样算法是机器学习中比较常用,也比较容易实现的(出去分层采样)。常用的采样算法有以下几种(来自百度知道):   一、单纯随机抽样(simple random sampling) 将调...
  • gshengod
  • gshengod
  • 2014年07月14日 16:05
  • 6286

C++,java,Python的内部实现sort怎么实现的,有什么不同?

C++,java,Python的内部实现sort怎么实现的,有什么不同? C++内部的sort是由快排,直接插入和堆排序混合的,具体详情见STL源码剖析,当数据量比较大的时候先用的快排,当数据量小的...
  • liusarazhang
  • liusarazhang
  • 2016年10月12日 14:58
  • 806

python:模拟内置函数map的实现

python 的内置函数map可以对一个迭代器/序列中的每个元素进行操作,然后返回一个被操作后的迭代器对象。 * map函数默认是c实现的。map函数非常方便,类似于map的概念在Java8中也有使...
  • DucklikeJAVA
  • DucklikeJAVA
  • 2017年06月09日 22:04
  • 797

Python的两种主要实现

Python实际上是一门语言规范,只是定义了Python这门语言应该具备哪些语言要素,应当能完成什么样的任务。这种语言规范可以用不同的方式实现,可以用C实现,也可以用C++、Java、C#、JavaS...
  • yanerhao
  • yanerhao
  • 2017年08月31日 13:59
  • 272

python写代码实现list的deepcopy

python有copy.copy()和copy.deepcopy()这两个函数分别提供浅拷贝和深拷贝的功能。今天突然想自己写代码实现list深拷贝的功能,于是写完了在这里分享一下(本文不涉及list之...
  • jsc723
  • jsc723
  • 2017年03月21日 11:14
  • 956
收藏助手
不良信息举报
您举报文章:RedisGraph Python 实现
举报原因:
原因补充:

(最多只允许输入30个字)