如何用Pandas展示Neo4j查询结果并通过Matplotlib绘制韦恩图?
Python操作Neo4j:查询结果转DataFrame+节点韦恩图绘制
1. 将Neo4j查询结果转为Pandas DataFrame
你的原查询返回的是Neo4j节点对象,直接转DataFrame会保留对象引用,需要先提取节点的属性字典,再生成DataFrame:
import pandas as pd # 从查询结果中提取节点属性 nodes_records = results[0] nodes_data = [dict(record["n"]) for record in nodes_records] # 转为DataFrame df = pd.DataFrame(nodes_data) # 查看结果 print(df.head())
说明
dict(record["n"])会把Neo4j的Node对象转换成包含所有属性的字典,确保DataFrame能正确展示节点的属性信息。- 如果需要保留节点ID,可以在Cypher查询中添加
id(n) AS node_id,后续提取时一起加入字典。
2. 绘制节点数量对比韦恩图
要生成韦恩图,需要先分别获取两个标签对应的所有节点,以及它们的共同节点,通过节点ID来确保唯一性:
步骤1:安装依赖库
pip install pandas matplotlib matplotlib-venn
步骤2:编写查询与绘图代码
from matplotlib_venn import venn2 import matplotlib.pyplot as plt # 查询MyLabel1的所有节点ID query_label1 = """ MATCH (n)-[r]-() WHERE r.disease = 'MyLabel1' RETURN DISTINCT id(n) AS node_id """ res_label1 = driver.execute_query(query_label1) set_label1 = {rec["node_id"] for rec in res_label1[0]} # 查询MyLabel2的所有节点ID query_label2 = """ MATCH (n)-[r]-() WHERE r.disease = 'MyLabel2' RETURN DISTINCT id(n) AS node_id """ res_label2 = driver.execute_query(query_label2) set_label2 = {rec["node_id"] for rec in res_label2[0]} # 查询共同节点ID(复用你的原查询逻辑) query_common = """ MATCH (n)-[r1]-(), (n)-[r2]-() WHERE r1.disease = 'MyLabel1' AND r2.disease = 'MyLabel2' RETURN DISTINCT id(n) AS node_id """ res_common = driver.execute_query(query_common) set_common = {rec["node_id"] for rec in res_common[0]} # 计算各区域节点数量 only_label1 = len(set_label1 - set_common) only_label2 = len(set_label2 - set_common) both = len(set_common) # 绘制韦恩图 venn2(subsets=(only_label1, only_label2, both), set_labels=('MyLabel1 节点', 'MyLabel2 节点')) plt.title('两个图的节点分布韦恩图') plt.show()
说明
- 使用节点ID(
id(n))来区分节点,避免因属性重复导致的统计错误,这是Neo4j中唯一标识节点的可靠方式。 venn2函数接受的元组参数依次是:仅属于第一个集合的数量、仅属于第二个集合的数量、两个集合共有的数量。
内容的提问来源于stack exchange,提问作者biowhat
相关产品推荐
相关产品推荐

