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,歡迎及時討論留言。