记录一下使用py2neo进行查询,查询某演员出演的电影,返回三元组,可转为json用于前端显示,如下(以下在jupyter notebook中进行操作):
一.查询数据
from py2neo import Graph,Node,Relationship,NodeMatcher,RelationshipMatcher,Path class Movie(): ''' 电影 ''' def __init__(self, id, name): self.id = id self.name = name class Person(): ''' 人 ''' def __init__(self, id, name): self.id = id self.name = name def initNeo4j(): ''' 初始化neo4j :return: ''' graph = Graph( "http://127.0.0.1:7474", username="neo4j", password="123" ) return graph def get_person_actorof_movie(graph, p_id) -> list: ''' 查找演员参演的电影,并返回三元组 :param graph: :param p_id: :return: ''' data = graph.run("match path=(m:Movie)-[:ACTOR_OF]->(p:Person) " "where p.id = $id return relationships(path) as relationships", id = p_id) movieDict = {} #电影 personDict = {} #演员 person_actorof_movie = {} # 三元组 while data.forward(): cursor = data.current for relation in cursor['relationships']: source_node = relation.start_node target_node = relation.end_node source_node_id = source_node['id'] target_node_id = target_node['id'] relation_type = list(relation.types())[0] source_node_label = str(source_node.labels).strip(":") target_node_label = str(target_node.labels).strip(":") source_node_name = source_node['title'] target_node_name = target_node['name'] # 存储三元组关系 if source_node_id in person_actorof_movie.keys(): target_dict = person_actorof_movie.get(source_node_id) target_dict.setdefault(target_node_id,relation_type) else: target_dict = {target_node_id:relation_type} person_actorof_movie[source_node_id] = target_dict # 存储节点 if ("Movie" == source_node_label) and (source_node_id not in movieDict.keys()): movie = Movie(source_node_id, source_node_name) movieDict[source_node_id] = movie if ("Person" == target_node_label) and (target_node_id not in personDict.keys()): person = Person(target_node_id, target_node_name) personDict[target_node_id] = person json_list = [] for source_key, value in person_actorof_movie.items(): for target_key, rel_type in value.items(): person_movie_dict = {} person_movie_dict['source'] = movieDict.get(source_key).name person_movie_dict['rel_type'] = rel_type person_movie_dict['target'] = personDict.get(target_key).name json_list.append(person_movie_dict) print(len(json_list)) for i in range(len(json_list)): print("{}-[{}]->{}".format(json_list[i]['source'], json_list[i]['rel_type'], json_list[i]['target'])) return json_list if __name__ == '__main__': graph = initNeo4j() json_list = get_person_actorof_movie(graph, 'e425fdb6bade4fc19d09754d1ae4670f')
二.展示出来
from pyecharts import options as opts from pyecharts.charts import Graph #明星主演的电影 movie_person_dict = set() nodes = [] links = [] for i in range(len(json_list)): if json_list[i]['source'] not in movie_person_dict: movie_person_dict.add(json_list[i]['source']) nodes.append({'name':json_list[i]['source'], "symbolSize": 10, 'draggable': 'true'}) if json_list[i]['target'] not in movie_person_dict: movie_person_dict.add(json_list[i]['target']) nodes.append({'name':json_list[i]['target'], "symbolSize": 10, 'draggable': 'true'}) links.append({'source':json_list[i]['source'], 'target':json_list[i]['target']}) graph = Graph(init_opts=opts.InitOpts(width='1000px', height='800px')) graph.add("", nodes, links, repulsion=8000, edge_symbol=['','arrow']) graph.set_global_opts(title_opts=opts.TitleOpts(title="明星主演的电影")) graph.render_notebook()
三.如下图