You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:36:18