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