fromng_aiimportNebulaReader# read data with spark engine, scan modereader=NebulaReader(engine="spark")reader.scan(edge="follow",props="degree")df=reader.read()# run pagerank algorithmpr_result=df.algo.pagerank(reset_prob=0.15,max_iter=10)
fromng_aiimportNebulaWriterfromng_ai.configimportNebulaGraphConfigconfig=NebulaGraphConfig()writer=NebulaWriter(data=df_result,sink="nebulagraph_vertex",config=config,engine="spark")# map column louvain into property cluster_idproperties={"lpa":"cluster_id"}writer.set_options(tag="label_propagation",vid_field="_id",properties=properties,batch_size=256,write_mode="insert",)# write back to NebulaGraphwriter.write()
最后,我们可以验证一下结果啦:
1
2
3
USE basketballplayer;
MATCH (v:label_propagation)
RETURN id(v), v.label_propagation.cluster_id LIMIT 3;
-- Prepare the write schema
USEbasketballplayer;CREATETAGIFNOTEXISTSpagerank(pagerankstring);:sleep20;-- Call with ng_ai()
RETURNng_ai("pagerank",["follow"],["degree"],"spark",{space:"basketballplayer",max_iter:10},{write_mode:"insert"})
fromng_aiimportNebulaReaderfromng_ai.configimportNebulaGraphConfig# read data with nebula/networkx engine, query modeconfig_dict={"graphd_hosts":"graphd:9669","user":"root","password":"nebula","space":"basketballplayer",}config=NebulaGraphConfig(**config_dict)reader=NebulaReader(engine="nebula",config=config)reader.query(edges=["follow","serve"],props=[["degree"],[]])g=reader.read()
fromng_aiimportNebulaWriterwriter=NebulaWriter(data=pr_result,sink="nebulagraph_vertex",config=config,engine="nebula",)# properties to writeproperties=["pagerank"]writer.set_options(tag="pagerank",properties=properties,batch_size=256,write_mode="insert",)# write back to NebulaGraphwriter.write()
其他算法:
1
2
3
4
5
6
7
8
# get all algorithmsg.algo.get_all_algo()# get help of each algohelp(g.algo.node2vec)# call the algog.algo.node2vec()
frommatplotlib.colorsimportListedColormapdefdraw_graph_louvain_pr(G,pr_result,louvain_result,colors=["#1984c5","#22a7f0","#63bff0","#a7d5ed","#e2e2e2","#e1a692","#de6e56","#e14b31","#c23728"]):# Define positions for the nodespos=nx.spring_layout(G)# Create a figure and set the axis limitsfig,ax=plt.subplots(figsize=(35,15))ax.set_xlim(-1,1)ax.set_ylim(-1,1)# Create a colormap from the colors listcmap=ListedColormap(colors)# Draw the nodes and edges of the graphnode_colors=[louvain_result[node]fornodeinG.nodes()]node_sizes=[70000*pr_result[node]fornodeinG.nodes()]nx.draw_networkx_nodes(G,pos=pos,ax=ax,node_color=node_colors,node_size=node_sizes,cmap=cmap,vmin=0,vmax=max(louvain_result.values()))nx.draw_networkx_edges(G,pos=pos,ax=ax,edge_color='gray',width=1,connectionstyle='arc3, rad=0.2',arrowstyle='-|>',arrows=True)# Extract edge labels as a dictionaryedge_labels=nx.get_edge_attributes(G,'label')# Add edge labels to the graphforedge,labelinedge_labels.items():ax.text((pos[edge[0]][0]+pos[edge[1]][0])/2,(pos[edge[0]][1]+pos[edge[1]][1])/2,label,fontsize=12,color='black',ha='center',va='center')# Add node labels to the graphnode_labels={n:G.nodes[n]['label']if'label'inG.nodes[n]elsenforninG.nodes()}nx.draw_networkx_labels(G,pos=pos,ax=ax,labels=node_labels,font_size=12,font_color='black')# Add colorbar for community colorssm=plt.cm.ScalarMappable(cmap=cmap,norm=plt.Normalize(vmin=0,vmax=max(louvain_result.values())))sm.set_array([])cbar=plt.colorbar(sm,ax=ax,ticks=range(max(louvain_result.values())+1),shrink=0.5)cbar.ax.set_yticklabels([f'Community {i}'foriinrange(max(louvain_result.values())+1)])# Show the figureplt.show()draw_graph_louvain_pr(G,pr_result=pr_result,louvain_result=louvain_result)