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: [email protected] 
@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,歡迎及時討論留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章